aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Hutton <joel.hutton@arm.com>2020-09-30 15:08:13 +0100
committerJoel Hutton <joel.hutton@arm.com>2020-09-30 15:16:29 +0100
commit97b798d80baf945ea28236eef3fa69f36626b579 (patch)
tree6e1f24cccbeeb478f55aeda3f0cacc408d56a60b
parentaa248b8db9a7594fcc84e52a84d56526d4284ca8 (diff)
downloadgcc-97b798d80baf945ea28236eef3fa69f36626b579.zip
gcc-97b798d80baf945ea28236eef3fa69f36626b579.tar.gz
gcc-97b798d80baf945ea28236eef3fa69f36626b579.tar.bz2
[SLP][VECT] Add check to fix 96837
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/96837 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96827 gcc/ChangeLog: 2020-09-29 Joel Hutton <joel.hutton@arm.com> PR target/96837 * 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/96837 * gcc.dg/vect/bb-slp-49.c: New test.
-rw-r--r--gcc/testsuite/gcc.dg/vect/bb-slp-49.c28
-rw-r--r--gcc/tree-vect-slp.c3
2 files changed, 30 insertions, 1 deletions
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
index 0000000..e7101fc
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/bb-slp-49.c
@@ -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" } } */
diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c
index e11037e..e0614fb 100644
--- a/gcc/tree-vect-slp.c
+++ b/gcc/tree-vect-slp.c
@@ -2503,7 +2503,8 @@ vect_optimize_slp (vec_info *vinfo)
/* 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 (instance))
vect_attempt_slp_rearrange_stmts (instance);
}