re PR rtl-optimization/64110 (ICE: Max. number of generated reload insns per insn...
authorVladimir Makarov <vmakarov@redhat.com>
Fri, 12 Dec 2014 20:11:10 +0000 (20:11 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Fri, 12 Dec 2014 20:11:10 +0000 (20:11 +0000)
2014-12-12  Vladimir Makarov  <vmakarov@redhat.com>

PR target/64110
* lra-constraints.c (process_alt_operands): Refuse alternative
when reload pseudo of given class can not hold value of given
mode.

2014-12-12  Vladimir Makarov  <vmakarov@redhat.com>

PR target/64110
* gcc.target/i386/pr64110.c: New.

From-SVN: r218688

gcc/ChangeLog
gcc/lra-constraints.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr64110.c [new file with mode: 0644]

index 3a200321b49ad3cda860e49a5fe807c28cada7bd..689c4fdd985ed172dad16656d231d3887f57532c 100644 (file)
@@ -1,3 +1,10 @@
+2014-12-12  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR target/64110
+       * lra-constraints.c (process_alt_operands): Refuse alternative
+       when reload pseudo of given class can not hold value of given
+       mode.
+
 2014-12-12  Thomas Schwinge  <thomas@codesourcery.com>
 
        * gimple-walk.c (walk_gimple_op) <GIMPLE_OMP_FOR>: Also check
index e9d8bf607656c018e2d412c96a1a27fc4b35d186..e0d4c1950d7679f4ba904e69bb1a65c74b065adf 100644 (file)
@@ -2267,6 +2267,29 @@ process_alt_operands (int only_alternative)
                  goto fail;
                }
 
+             /* Alternative loses if it required class pseudo can not
+                hold value of required mode.  Such insns can be
+                described by insn definitions with mode iterators.
+                Don't use ira_prohibited_class_mode_regs here as it
+                is common practice for constraints to use a class
+                which does not have actually enough regs to hold the
+                value (e.g. x86 AREG for mode requiring more one
+                general reg).  */
+             if (GET_MODE (*curr_id->operand_loc[nop]) != VOIDmode
+                 && ! hard_reg_set_empty_p (this_alternative_set)
+                 && ! HARD_REGNO_MODE_OK (ira_class_hard_regs
+                                          [this_alternative][0],
+                                          GET_MODE (*curr_id->operand_loc[nop])))
+               {
+                 if (lra_dump_file != NULL)
+                   fprintf
+                     (lra_dump_file,
+                      "            alt=%d: reload pseudo for op %d "
+                      " can not hold the mode value -- refuse\n",
+                      nalt, nop);
+                 goto fail;
+               }
+
              /* Check strong discouragement of reload of non-constant
                 into class THIS_ALTERNATIVE.  */
              if (! CONSTANT_P (op) && ! no_regs_p
index f2502ff70fc7eef72d554799df9e0b9d1e94f80b..d0796b640f6b95ab600a5f040ca08225f2aae231 100644 (file)
@@ -1,3 +1,8 @@
+2014-12-12  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR target/64110
+       * gcc.target/i386/pr64110.c: New.
+
 2014-12-12  Thomas Schwinge  <thomas@codesourcery.com>
 
        * c-c++-common/gomp/nesting-1.c: New file.
diff --git a/gcc/testsuite/gcc.target/i386/pr64110.c b/gcc/testsuite/gcc.target/i386/pr64110.c
new file mode 100644 (file)
index 0000000..84d8843
--- /dev/null
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -march=core-avx2" } */
+
+int foo (void);
+int a;
+short *b;
+
+void
+bar (short x)
+{
+  while (a--)
+    {
+      int i, j = foo ();
+      for (i = 0; i < j; ++i)
+       *b++ = x;
+    }
+}