diff options
author | vmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-04-04 14:35:59 +0000 |
---|---|---|
committer | vmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-04-04 14:35:59 +0000 |
commit | fa4f0b4ea29543315d5d6e4dee0a9c7806f3e144 (patch) | |
tree | cc574b4eb2853d00fe21a06d5c86561ed8401c46 /gcc/lra.c | |
parent | 7a66d0cf98230d1b48a07c55d297b3507567d357 (diff) | |
download | gcc-fa4f0b4ea29543315d5d6e4dee0a9c7806f3e144.tar.gz |
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 Vladimir Makarov <vmakarov@redhat.com>
PR target/65647
* gcc.target/arm/pr65647.c: New.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@221867 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/lra.c')
-rw-r--r-- | gcc/lra.c | 8 |
1 files changed, 7 insertions, 1 deletions
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 (); |