[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.
This commit is contained in:
parent
aa248b8db9
commit
97b798d80b
2 changed files with 30 additions and 1 deletions
28
gcc/testsuite/gcc.dg/vect/bb-slp-49.c
Normal file
28
gcc/testsuite/gcc.dg/vect/bb-slp-49.c
Normal file
|
@ -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" } } */
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue