re PR tree-optimization/88903 (wrong-code with SLP vectorized shift)
authorRichard Biener <rguenther@suse.de>
Fri, 18 Jan 2019 13:13:21 +0000 (13:13 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 18 Jan 2019 13:13:21 +0000 (13:13 +0000)
2019-01-18  Richard Biener  <rguenther@suse.de>

PR tree-optimization/88903
* tree-vect-stmts.c (vectorizable_shift): Verify we see all
scalar stmts a SLP shift amount is composed of when detecting
shifts by scalars.

* gcc.dg/vect/pr88903-1.c: New testcase.
* gcc.dg/vect/pr88903-2.c: Likewise.

From-SVN: r268076

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/pr88903-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/vect/pr88903-2.c [new file with mode: 0644]
gcc/tree-vect-stmts.c

index ff87cbe5807f14a456b20f208bad4c93e3089262..13890776cc083cea314a91dffc1d92e56b0e73ad 100644 (file)
@@ -1,3 +1,10 @@
+2019-01-18  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/88903
+       * tree-vect-stmts.c (vectorizable_shift): Verify we see all
+       scalar stmts a SLP shift amount is composed of when detecting
+       shifts by scalars.
+
 2019-01-18  Richard Earnshaw  <rearnsha@arm.com>
 
        PR target/88799
index 88a590ee9fa93d0261106973b92833f90a2c46f0..77b89f46084b91750323b53204201bcc92cf599f 100644 (file)
@@ -1,3 +1,9 @@
+2019-01-18  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/88903
+       * gcc.dg/vect/pr88903-1.c: New testcase.
+       * gcc.dg/vect/pr88903-2.c: Likewise.
+
 2019-01-18  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR c/51628
diff --git a/gcc/testsuite/gcc.dg/vect/pr88903-1.c b/gcc/testsuite/gcc.dg/vect/pr88903-1.c
new file mode 100644 (file)
index 0000000..dead2b5
--- /dev/null
@@ -0,0 +1,26 @@
+#include "tree-vect.h"
+
+int x[1024];
+
+void __attribute__((noinline))
+foo()
+{
+  for (int i = 0; i < 512; ++i)
+    {
+      x[2*i] = x[2*i] << (i+1);
+      x[2*i+1] = x[2*i+1] << (i+1);
+    }
+}
+
+int
+main()
+{
+  check_vect ();
+  for (int i = 0; i < 1024; ++i)
+    x[i] = i;
+  foo ();
+  for (int i = 0; i < 1024; ++i)
+    if (x[i] != i << (i/2+1))
+      __builtin_abort ();
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/vect/pr88903-2.c b/gcc/testsuite/gcc.dg/vect/pr88903-2.c
new file mode 100644 (file)
index 0000000..cd88a99
--- /dev/null
@@ -0,0 +1,28 @@
+#include "tree-vect.h"
+
+int x[1024];
+int y[1024];
+int z[1024];
+
+void __attribute__((noinline)) foo()
+{
+  for (int i = 0; i < 512; ++i)
+    {
+      x[2*i] = x[2*i] << y[2*i];
+      x[2*i+1] = x[2*i+1] << y[2*i];
+      z[2*i] = y[2*i];
+      z[2*i+1] = y[2*i+1];
+    }
+}
+
+int main()
+{
+  check_vect ();
+  for (int i = 0; i < 1024; ++i)
+    x[i] = i, y[i] = i % 8;
+  foo ();
+  for (int i = 0; i < 1024; ++i)
+    if (x[i] != i << ((i & ~1) % 8))
+      __builtin_abort ();
+  return 0;
+}
index c0e19dd178c4f255fd725bf43fee4f54f65314ff..2220fce316553d2afdff3185f9d566ac1b2f7cce 100644 (file)
@@ -5540,6 +5540,16 @@ vectorizable_shift (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
              if (!operand_equal_p (gimple_assign_rhs2 (slpstmt), op1, 0))
                scalar_shift_arg = false;
            }
+
+         /* For internal SLP defs we have to make sure we see scalar stmts
+            for all vector elements.
+            ???  For different vectors we could resort to a different
+            scalar shift operand but code-generation below simply always
+            takes the first.  */
+         if (dt[1] == vect_internal_def
+             && maybe_ne (nunits_out * SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node),
+                          stmts.length ()))
+           scalar_shift_arg = false;
        }
 
       /* If the shift amount is computed by a pattern stmt we cannot