re PR target/77833 (ICE: in plus_constant, at explow.c:87 with -O -mavx512f)
authorRichard Biener <rguenther@suse.de>
Tue, 4 Oct 2016 13:39:22 +0000 (13:39 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 4 Oct 2016 13:39:22 +0000 (13:39 +0000)
2016-10-04  Richard Biener  <rguenther@suse.de>

PR middle-end/77833
* explow.c (plus_constant): Verify the mode of the constant
pool offset before calling plus_constant.

* gcc.target/i386/pr77833.c: New testcase.

From-SVN: r240743

gcc/ChangeLog
gcc/explow.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr77833.c [new file with mode: 0644]

index d182496a509c0df1c20cb06e1a2f44d2b7d312d1..6e0de29444ec16b92edc93a7c97f0019d05bc8a4 100644 (file)
@@ -1,3 +1,9 @@
+2016-10-04  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/77833
+       * explow.c (plus_constant): Verify the mode of the constant
+       pool offset before calling plus_constant.
+
 2016-10-04  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/77407
index 8dcef8bb3507bc97ebd0a1b5fb145f97f8ae1817..d8f9dd2e7defd411d7272a30ae1bbb438e44abac 100644 (file)
@@ -114,12 +114,15 @@ plus_constant (machine_mode mode, rtx x, HOST_WIDE_INT c,
              cst = gen_lowpart (mode, cst);
              gcc_assert (cst);
            }
-         tem = plus_constant (mode, cst, c);
-         tem = force_const_mem (GET_MODE (x), tem);
-         /* Targets may disallow some constants in the constant pool, thus
-            force_const_mem may return NULL_RTX.  */
-         if (tem && memory_address_p (GET_MODE (tem), XEXP (tem, 0)))
-           return tem;
+         if (GET_MODE (cst) == VOIDmode || GET_MODE (cst) == mode)
+           {
+             tem = plus_constant (mode, cst, c);
+             tem = force_const_mem (GET_MODE (x), tem);
+             /* Targets may disallow some constants in the constant pool, thus
+                force_const_mem may return NULL_RTX.  */
+             if (tem && memory_address_p (GET_MODE (tem), XEXP (tem, 0)))
+               return tem;
+           }
        }
       break;
 
index 9e6246455cadbd332f35101a0a8c012d946e2308..9a8692eacf3a67dcf22959d1c5b45d20f33e6e58 100644 (file)
@@ -1,3 +1,8 @@
+2016-10-04  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/77833
+       * gcc.target/i386/pr77833.c: New testcase.
+
 2016-09-26  Jeff Law  <law@redhat.com>
 
        PR tree-optimization/71550
diff --git a/gcc/testsuite/gcc.target/i386/pr77833.c b/gcc/testsuite/gcc.target/i386/pr77833.c
new file mode 100644 (file)
index 0000000..21527fe
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O -mavx512f" } */
+
+typedef unsigned long V __attribute__((vector_size(64)));
+typedef unsigned __int128 W __attribute__((vector_size(64)));
+
+V
+foo(int i, V v)
+{
+  i *= ((W)(V){0, 0, 0, 0, 0, 1, v[0]})[2];
+  v[i] = 0;
+  i--;
+  return v + i;
+}