diff options
author | Joel Hutton <joel.hutton@arm.com> | 2020-09-30 15:08:13 +0100 |
---|---|---|
committer | Joel Hutton <joel.hutton@arm.com> | 2020-09-30 15:16:29 +0100 |
commit | 97b798d80baf945ea28236eef3fa69f36626b579 (patch) | |
tree | 6e1f24cccbeeb478f55aeda3f0cacc408d56a60b | |
parent | aa248b8db9a7594fcc84e52a84d56526d4284ca8 (diff) | |
download | gcc-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.c | 28 | ||||
-rw-r--r-- | gcc/tree-vect-slp.c | 3 |
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); } |