re PR target/77452 (ICE: in plus_constant, at explow.c:87 with -fno-split-wide-types...
authorUros Bizjak <ubizjak@gmail.com>
Mon, 5 Sep 2016 14:44:19 +0000 (16:44 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Mon, 5 Sep 2016 14:44:19 +0000 (16:44 +0200)
PR rtl-optimization/77452
* explow.c (plus_constant) <case MEM>: Extract scalar constant from
inner-mode reference to a CONST_VECTOR constant in the constant pool.

testsuite/ChangeLog:

PR rtl-optimization/77452
* gcc.target/i386/pr77452.c: New test.

From-SVN: r239989

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

index 00a552dcc95f876a69fb3f8d9efb52f27e084bb0..897bfbbea8af831b06e38fbad75396d0e2e5ed51 100644 (file)
@@ -1,3 +1,9 @@
+2016-09-05  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR rtl-optimization/77452
+       * explow.c (plus_constant) <case MEM>: Extract scalar constant from
+       inner-mode reference to a CONST_VECTOR constant in the constant pool.
+
 2016-09-05  Marek Polacek  <polacek@redhat.com>
 
        PR c/77423
index b14291d8653a01e0d9f0f8b0cc7fe87b6ede421c..e935c307bcbfac5ada5ad617886b5fab538e80ea 100644 (file)
@@ -106,7 +106,15 @@ plus_constant (machine_mode mode, rtx x, HOST_WIDE_INT c,
       if (GET_CODE (XEXP (x, 0)) == SYMBOL_REF
          && CONSTANT_POOL_ADDRESS_P (XEXP (x, 0)))
        {
-         tem = plus_constant (mode, get_pool_constant (XEXP (x, 0)), c);
+         rtx cst = get_pool_constant (XEXP (x, 0));
+
+         if (GET_CODE (cst) == CONST_VECTOR
+             && GET_MODE_INNER (GET_MODE (cst)) == mode)
+           {
+             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.  */
index e54fc2ff7fece5966f16cbfbe2dafca5225969a7..ad6b6809523292cf0fdd316371be45946c35e16b 100644 (file)
@@ -1,3 +1,8 @@
+2016-09-05  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR rtl-optimization/77452
+       * gcc.target/i386/pr77452.c: New test.
+
 2016-09-05  Marek Polacek  <polacek@redhat.com>
 
        PR c/77423
diff --git a/gcc/testsuite/gcc.target/i386/pr77452.c b/gcc/testsuite/gcc.target/i386/pr77452.c
new file mode 100644 (file)
index 0000000..89c5329
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do compile { target int128 } } */
+/* { dg-options "-O -mavx512f -fno-split-wide-types --param max-combine-insns=2" } */
+
+typedef unsigned      int U __attribute__((vector_size(64)));
+typedef unsigned __int128 V __attribute__((vector_size(64)));
+
+V
+foo(V v)
+{
+  v[0] = 1u << ((  ((V)(U){1, 1, v[0]})[0]) & 0xf)
+            >> ((-~((V)(U){1, 1, v[0]})[0]) & 0xf);
+  return v;
+}