summaryrefslogtreecommitdiff
path: root/gcc/lra.c
diff options
context:
space:
mode:
authorvmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4>2017-02-16 19:47:15 +0000
committervmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4>2017-02-16 19:47:15 +0000
commitf15d85a5a65bae625b9a2eebfd498752f2c317de (patch)
treeba9a3477846fe6153bd561991f4b0301f82e893a /gcc/lra.c
parent77265d13c97fa16dc3260dc5d6774132c119f960 (diff)
downloadgcc-f15d85a5a65bae625b9a2eebfd498752f2c317de.tar.gz
2017-02-16 Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/78127 * lra.c (lra): Call lra_eliminate before finish the loop after lra_constraint. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@245514 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/lra.c')
-rw-r--r--gcc/lra.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/gcc/lra.c b/gcc/lra.c
index d551102c8c9..ed1f062d2ee 100644
--- a/gcc/lra.c
+++ b/gcc/lra.c
@@ -2389,14 +2389,7 @@ lra (FILE *f)
{
for (;;)
{
- /* We should try to assign hard registers to scratches even
- if there were no RTL transformations in lra_constraints.
- Also we should check IRA assignments on the first
- iteration as they can be wrong because of early clobbers
- operands which are ignored in IRA. */
- if (! lra_constraints (lra_constraint_iter == 0)
- && lra_constraint_iter > 1)
- break;
+ bool reloads_p = lra_constraints (lra_constraint_iter == 0);
/* Constraint transformations may result in that eliminable
hard regs become uneliminable and pseudos which use them
should be spilled. It is better to do it before pseudo
@@ -2406,6 +2399,23 @@ lra (FILE *f)
RS6000_PIC_OFFSET_TABLE_REGNUM uneliminable if we started
to use a constant pool. */
lra_eliminate (false, false);
+ /* We should try to assign hard registers to scratches even
+ if there were no RTL transformations in lra_constraints.
+ Also we should check IRA assignments on the first
+ iteration as they can be wrong because of early clobbers
+ operands which are ignored in IRA. */
+ if (! reloads_p && lra_constraint_iter > 1)
+ {
+ /* Stack is not empty here only when there are changes
+ during the elimination sub-pass. */
+ if (bitmap_empty_p (lra_constraint_insn_stack_bitmap))
+ break;
+ else
+ /* If there are no reloads but changing due
+ elimination, restart the constraint sub-pass
+ first. */
+ continue;
+ }
/* Do inheritance only for regular algorithms. */
if (! lra_simple_p)
{