re PR rtl-optimization/55151 (ICE: in assign_by_spills, at lra-assigns.c:1217 with...
authorVladimir Makarov <vmakarov@redhat.com>
Mon, 5 Nov 2012 16:38:27 +0000 (16:38 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Mon, 5 Nov 2012 16:38:27 +0000 (16:38 +0000)
2012-11-05  Vladimir Makarov  <vmakarov@redhat.com>

PR rtl-optimization/55151
* lra-constraints.c (process_alt_operands): Permit putting reg
value into memory.  Increase reject for this case.

2012-11-05  Vladimir Makarov  <vmakarov@redhat.com>

PR rtl-optimization/55151
* gcc.dg/pr55151.c: New test.

From-SVN: r193170

gcc/ChangeLog
gcc/lra-constraints.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr55151.c [new file with mode: 0644]

index d6a0d56..fd357b4 100644 (file)
@@ -1,3 +1,9 @@
+2012-11-05  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR rtl-optimization/55151
+       * lra-constraints.c (process_alt_operands): Permit putting reg
+       value into memory.  Increase reject for this case.
+
 2012-11-05  Dehao Chen  <dehao@google.com>
 
        * final.c (reemit_insn_block_notes): Do not change scope if insn
index affdc5f..ae8b834 100644 (file)
@@ -1581,7 +1581,9 @@ process_alt_operands (int only_alternative)
                case TARGET_MEM_CONSTRAINT:
                  if (MEM_P (op) || spilled_pseudo_p (op))
                    win = true;
-                 if (CONST_POOL_OK_P (mode, op))
+                 /* We can put constant or pseudo value into memory
+                    to satisfy the constraint.  */
+                 if (CONST_POOL_OK_P (mode, op) || REG_P (op))
                    badop = false;
                  constmemok = true;
                  break;
@@ -1613,7 +1615,10 @@ process_alt_operands (int only_alternative)
                       && offsettable_nonstrict_memref_p (op))
                      || spilled_pseudo_p (op))
                    win = true;
-                 if (CONST_POOL_OK_P (mode, op) || MEM_P (op))
+                 /* We can put constant or pseudo value into memory
+                    or make memory address offsetable to satisfy the
+                    constraint.  */
+                 if (CONST_POOL_OK_P (mode, op) || MEM_P (op) || REG_P (op))
                    badop = false;
                  constmemok = true;
                  offmemok = true;
@@ -1638,6 +1643,7 @@ process_alt_operands (int only_alternative)
                  if (CONST_INT_P (op)
                      || (GET_CODE (op) == CONST_DOUBLE && mode == VOIDmode))
                    break;
+
                case 'i':
                  if (general_constant_p (op))
                    win = true;
@@ -1702,10 +1708,12 @@ process_alt_operands (int only_alternative)
                            win = true;
 
                          /* If we didn't already win, we can reload
-                            constants via force_const_mem, and other
-                            MEMs by reloading the address like for
+                            constants via force_const_mem or put the
+                            pseudo value into memory, or make other
+                            memory by reloading the address like for
                             'o'.  */
-                         if (CONST_POOL_OK_P (mode, op) || MEM_P (op))
+                         if (CONST_POOL_OK_P (mode, op)
+                             || MEM_P (op) || REG_P (op))
                            badop = false;
                          constmemok = true;
                          offmemok = true;
@@ -1919,6 +1927,13 @@ process_alt_operands (int only_alternative)
                      += ira_reg_class_max_nregs[this_alternative][mode];
                }
 
+             /* We are trying to spill pseudo into memory.  It is
+                usually more costly than moving to a hard register
+                although it might takes the same number of
+                reloads.  */
+             if (no_regs_p && REG_P (op))
+               reject++;
+
              /* Input reloads can be inherited more often than output
                 reloads can be removed, so penalize output
                 reloads.  */
index 6626dc9..c310366 100644 (file)
@@ -1,3 +1,8 @@
+2012-11-05  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR rtl-optimization/55151
+       * gcc.dg/pr55151.c: New test.
+
 2012-11-05  Jakub Jelinek  <jakub@redhat.com>
 
        PR debug/54970
diff --git a/gcc/testsuite/gcc.dg/pr55151.c b/gcc/testsuite/gcc.dg/pr55151.c
new file mode 100644 (file)
index 0000000..1584bf4
--- /dev/null
@@ -0,0 +1,13 @@
+/* PR rtl-optimization/55151 */
+/* { dg-do compile } */
+/* { dg-options "-fPIC" } */
+
+int a, b, c, d, e, f, g, h, i, j, k, l;
+void f4 (void)
+{
+  __asm__ volatile ("":[a] "=r,m" (a),[b] "=r,m" (b),[c] "=r,m" (c),
+                   [d] "=r,m" (d),[e] "=r,m" (e),[f] "=r,m" (f),
+                   [g] "=r,m" (g),[h] "=r,m" (h),[i] "=r,m" (i),
+                   [j] "=r,m" (j),[k] "=r,m" (k),[l] "=r,m" (l):"[a],m" (a),
+                   "[j],m" (j), "[k],m" (k), "[l],m" (l));
+}