]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[SLP][VECT] Add check to fix 96827
authorJoel Hutton <joel.hutton@arm.com>
Wed, 30 Sep 2020 15:20:55 +0000 (16:20 +0100)
committerJoel Hutton <joel.hutton@arm.com>
Thu, 1 Oct 2020 08:21:03 +0000 (09:21 +0100)
The following patch adds a simple check to prevent slp stmts from
vector constructors being rearranged. vect_attempt_slp_rearrange_stmts
tries to rearrange to avoid a load permutation.

This fixes PR target/96827
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96827

gcc/ChangeLog:

2020-09-29  Joel Hutton  <joel.hutton@arm.com>

PR target/96827
* tree-vect-slp.c (vect_analyze_slp): Do not call
vect_attempt_slp_rearrange_stmts for vector constructors.

gcc/testsuite/ChangeLog:

2020-09-29  Joel Hutton  <joel.hutton@arm.com>

PR target/96827
* gcc.dg/vect/bb-slp-49.c: New test.

(cherry picked from commit 97b798d80baf945ea28236eef3fa69f36626b579)

gcc/testsuite/gcc.dg/vect/bb-slp-49.c [new file with mode: 0644]
gcc/tree-vect-slp.c

diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-49.c b/gcc/testsuite/gcc.dg/vect/bb-slp-49.c
new file mode 100644 (file)
index 0000000..e7101fc
--- /dev/null
@@ -0,0 +1,28 @@
+/* This checks that vectorized constructors have the correct ordering. */
+/* { dg-require-effective-target vect_int } */
+
+typedef int V __attribute__((__vector_size__(16)));
+
+__attribute__((__noipa__)) void
+foo (unsigned int x, V *y)
+{
+  unsigned int a[4] = { x + 0, x + 2, x + 4, x + 6 };
+  for (unsigned int i = 0; i < 3; ++i)
+    if (a[i] == 1234)
+      a[i]--;
+  *y = (V) { a[3], a[2], a[1], a[0] };
+}
+
+int
+main ()
+{
+  V b;
+  foo (0, &b);
+  if (b[0] != 6 || b[1] != 4 || b[2] != 2 || b[3] != 0)
+    __builtin_abort ();
+  return 0;
+}
+
+/* See that we vectorize an SLP instance.  */
+/* { dg-final { scan-tree-dump "Analyzing vectorizable constructor" "slp1" } } */
+/* { dg-final { scan-tree-dump "vectorizing stmts using SLP" "slp1" } } */
index 3fdf56f9335f359925ad7b47e337072cb26c95ac..3a8bbeaf6579edfee9c0f9e6f2c723ac5bc4a39f 100644 (file)
@@ -1960,7 +1960,8 @@ vect_supported_load_permutation_p (slp_instance slp_instn)
   /* Reduction (there are no data-refs in the root).
      In reduction chain the order of the loads is not important.  */
   if (!STMT_VINFO_DATA_REF (stmt_info)
-      && !REDUC_GROUP_FIRST_ELEMENT (stmt_info))
+      && !REDUC_GROUP_FIRST_ELEMENT (stmt_info)
+      && !SLP_INSTANCE_ROOT_STMT (slp_instn))
     vect_attempt_slp_rearrange_stmts (slp_instn);
 
   /* In basic block vectorization we allow any subchain of an interleaving