diff options
-rw-r--r-- | gcc/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/lra-int.h | 9 | ||||
-rw-r--r-- | gcc/lra-remat.c | 10 | ||||
-rw-r--r-- | gcc/lra.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/pr65647.c | 58 |
6 files changed, 102 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d5d3aaa70a9..e67aae8582e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2015-04-04 Vladimir Makarov <vmakarov@redhat.com> + + PR target/65647 + * lra-int.h (LRA_MAX_REMATERIALIZATION_PASSES): New. Add its + value checking. + (lra_rematerialization_iter): New. + * lra.c (lra): Initialize lra_rematerialization_iter. + Stop updating lra_constraint_new_regno_start after switching of + inheritance and rematerialization. + * lra-remat.c (lra_rematerialization_iter): New. + (lra_remat): Add printing pass iteration. Do rematerialization + only first LRA_MAX_REMATERIALIZATION_PASSES iterations. + 2015-04-04 Richard Biener <rguenther@suse.de> PR tree-optimization/64909 diff --git a/gcc/lra-int.h b/gcc/lra-int.h index 735259123d6..c6b147e6f78 100644 --- a/gcc/lra-int.h +++ b/gcc/lra-int.h @@ -271,6 +271,14 @@ typedef struct lra_insn_recog_data *lra_insn_recog_data_t; #error wrong LRA_MAX_INHERITANCE_PASSES value #endif +/* Analogous macro to the above one but for rematerialization. */ +#define LRA_MAX_REMATERIALIZATION_PASSES 2 + +#if LRA_MAX_REMATERIALIZATION_PASSES <= 0 \ + || LRA_MAX_REMATERIALIZATION_PASSES >= LRA_MAX_ASSIGNMENT_ITERATION_NUMBER - 8 +#error wrong LRA_MAX_REMATERIALIZATION_PASSES value +#endif + /* lra.c: */ extern FILE *lra_dump_file; @@ -392,6 +400,7 @@ extern void lra_final_code_change (void); /* lra-remat.c: */ +extern int lra_rematerialization_iter; extern bool lra_remat (void); /* lra-elimination.c: */ diff --git a/gcc/lra-remat.c b/gcc/lra-remat.c index ac827795713..36ea79282de 100644 --- a/gcc/lra-remat.c +++ b/gcc/lra-remat.c @@ -1259,6 +1259,9 @@ do_remat (void) +/* Current number of rematerialization iteration. */ +int lra_rematerialization_iter; + /* Entry point of the rematerialization sub-pass. Return true if we did any rematerialization. */ bool @@ -1270,6 +1273,13 @@ lra_remat (void) if (! flag_lra_remat) return false; + lra_rematerialization_iter++; + if (lra_rematerialization_iter > LRA_MAX_REMATERIALIZATION_PASSES) + return false; + if (lra_dump_file != NULL) + fprintf (lra_dump_file, + "\n******** Rematerialization #%d: ********\n\n", + lra_rematerialization_iter); timevar_push (TV_LRA_REMAT); insn_to_cand = XCNEWVEC (cand_t, get_max_uid ()); regno_cands = XCNEWVEC (cand_t, max_regno); diff --git a/gcc/lra.c b/gcc/lra.c index 269a0f14f74..a29266e7ecc 100644 --- a/gcc/lra.c +++ b/gcc/lra.c @@ -2260,6 +2260,7 @@ lra (FILE *f) lra_live_range_iter = lra_coalesce_iter = lra_constraint_iter = 0; lra_assignment_iter = lra_assignment_iter_after_spill = 0; lra_inheritance_iter = lra_undo_inheritance_iter = 0; + lra_rematerialization_iter = 0; setup_reg_spill_flag (); @@ -2405,7 +2406,12 @@ lra (FILE *f) /* Assignment of stack slots changes elimination offsets for some eliminations. So update the offsets here. */ lra_eliminate (false, false); - lra_constraint_new_regno_start = max_reg_num (); + /* After switching off inheritance and rematerialization passes, + don't forget reload pseudos after spilling sub-pass to avoid + LRA cycling in some complicated cases. */ + if (lra_inheritance_iter <= LRA_MAX_INHERITANCE_PASSES + || lra_rematerialization_iter <= LRA_MAX_REMATERIALIZATION_PASSES) + lra_constraint_new_regno_start = max_reg_num (); lra_assignment_iter_after_spill = 0; } restore_scratches (); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 09d6bd943e5..bb7d971c96e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-04-04 Vladimir Makarov <vmakarov@redhat.com> + + PR target/65647 + * gcc.target/arm/pr65647.c: New. + 2015-04-03 Jan Hubicka <hubicka@ucw.cz> PR ipa/65655 diff --git a/gcc/testsuite/gcc.target/arm/pr65647.c b/gcc/testsuite/gcc.target/arm/pr65647.c new file mode 100644 index 00000000000..686eb587ae3 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pr65647.c @@ -0,0 +1,58 @@ +/* { dg-do compile } */ +/* { dg-options "-march=armv6-m -mthumb -O3 -w" } */ + +a, b, c, e, g = &e, h, i = 7, l = 1, m, n, o, q = &m, r, s = &r, u, w = 9, x, + y = 6, z, t6 = 7, t8, t9 = 1, t11 = 5, t12 = &t8, t13 = 3, t15, + t16 = &t15; +struct { + long long f3; + char f4 +} p = {3} + + , + t = {4}; + +struct S1 { + long long f0; + short f1; + long long f2 +} d; +long long f = 4073709551613, t7 = 8, t14 = 4073709551610; +j[]; +k = j; +v = &d; +*t10 = j; +struct S1 fn1(); +struct S1 fn2() { + signed char t1; + struct S1 t2; + long t3 = x; + short t4 = h; + short *t5 = &l; + fn1(t2, w, 1, o); + if (u) { + l = q; + t1 = a < b ?: b; + z = c >= 2 || t1 << c; + } + *t5 = t4 &= t3; + fn3(y); +} + +fn4() { + t6 = t.f3; + fn5(k, t7); +} + +struct S1 fn1() { + f = 0; + for (; i;) + ; + t11 = 0; + t13 = *t10 = t14 || n; + t9 = t12; + for (; p.f4;) + s = t16 <= fn6(); + if (g) + v = 0; +} |