diff options
author | vmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4> | 2017-02-16 19:47:15 +0000 |
---|---|---|
committer | vmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4> | 2017-02-16 19:47:15 +0000 |
commit | f15d85a5a65bae625b9a2eebfd498752f2c317de (patch) | |
tree | ba9a3477846fe6153bd561991f4b0301f82e893a /gcc/lra.c | |
parent | 77265d13c97fa16dc3260dc5d6774132c119f960 (diff) | |
download | gcc-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.c | 26 |
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) { |