re PR rtl-optimization/78127 (AArch64 internal compiler error: in lra_eliminate,...
authorVladimir Makarov <vmakarov@redhat.com>
Thu, 16 Feb 2017 19:47:15 +0000 (19:47 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Thu, 16 Feb 2017 19:47:15 +0000 (19:47 +0000)
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.

From-SVN: r245514

gcc/ChangeLog
gcc/lra.c

index 5fc6142eaa03f1bb21da2d5ff19aed2a07f5fd7a..d2a4562ef9e4b37a4d2c1fd9741cfea290dfb010 100644 (file)
@@ -1,3 +1,9 @@
+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.
+
 2017-02-16  Richard Biener  <rguenther@suse.de>
 
        * graphite.h: Do not include isl/isl_val_gmp.h, instead include
index d551102c8c9e3f034302f5bb47f78a611e1142af..ed1f062d2ee51592938e330655e3a0c68dda4270 100644 (file)
--- 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)
            {