summaryrefslogtreecommitdiff
path: root/gcc/lra.c
diff options
context:
space:
mode:
authorvmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4>2015-04-04 14:35:59 +0000
committervmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4>2015-04-04 14:35:59 +0000
commitfa4f0b4ea29543315d5d6e4dee0a9c7806f3e144 (patch)
treecc574b4eb2853d00fe21a06d5c86561ed8401c46 /gcc/lra.c
parent7a66d0cf98230d1b48a07c55d297b3507567d357 (diff)
downloadgcc-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.c8
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 ();