diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/bb-slp-pr101615-1.c | 30 | ||||
-rw-r--r-- | gcc/tree-vect-slp.c | 6 |
2 files changed, 34 insertions, 2 deletions
diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-pr101615-1.c b/gcc/testsuite/gcc.dg/vect/bb-slp-pr101615-1.c new file mode 100644 index 0000000..d1c9c02 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/bb-slp-pr101615-1.c @@ -0,0 +1,30 @@ +/* { dg-do run } */ +/* { dg-additional-options "-w -Wno-psabi" } */ + +#include "tree-vect.h" + +typedef int v4si __attribute__((vector_size(16))); + +int a[4]; +int b[4]; + +void __attribute__((noipa)) +foo (v4si x) +{ + b[0] = a[3] + x[0]; + b[1] = a[2] + x[1]; + b[2] = a[1] + x[2]; + b[3] = a[0] + x[3]; +} + +int main() +{ + check_vect (); + for (int i = 0; i < 4; ++i) + a[i] = i; + v4si x = (v4si) { 8, 6, 4, 2 }; + foo (x); + if (b[0] != 11 || b[1] != 8 || b[2] != 5 || b[3] != 2) + __builtin_abort (); + return 0; +} diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c index b9d88c2..07cc24a 100644 --- a/gcc/tree-vect-slp.c +++ b/gcc/tree-vect-slp.c @@ -3648,8 +3648,10 @@ vect_optimize_slp (vec_info *vinfo) slp_tree node = vertices[idx].node; /* Handle externals and constants optimistically throughout the - iteration. */ - if (SLP_TREE_DEF_TYPE (node) == vect_external_def + iteration. But treat existing vectors as fixed since we + do not handle permuting them below. */ + if ((SLP_TREE_DEF_TYPE (node) == vect_external_def + && !SLP_TREE_VEC_DEFS (node).exists ()) || SLP_TREE_DEF_TYPE (node) == vect_constant_def) continue; |