diff options
author | Richard Biener <rguenther@suse.de> | 2021-07-28 14:16:35 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2021-07-28 15:14:19 +0200 |
commit | 6bb6e2044ced33d08175361b8e39a9c5d4a868a6 (patch) | |
tree | 394e67b07401407ca837ea9f674100fdb3e72196 | |
parent | 1af16666943ef075673501765a13e425e47015cd (diff) | |
download | gcc-6bb6e2044ced33d08175361b8e39a9c5d4a868a6.zip gcc-6bb6e2044ced33d08175361b8e39a9c5d4a868a6.tar.gz gcc-6bb6e2044ced33d08175361b8e39a9c5d4a868a6.tar.bz2 |
tree-optimization/101615 - SLP permute opt of existing vectors
This fixes one issue discovered when analyzing PR101615, namely
we happily push permutes to pre-existing vectors but end up
not actually permuting them. In fact we don't want to, so force
materialization on the external.
It doesn't fix the original testcase though.
2021-07-28 Richard Biener <rguenther@suse.de>
PR tree-optimization/101615
* tree-vect-slp.c (vect_optimize_slp): Pre-existing vector
external nodes cannot be permuted so make them perm_out 0.
* gcc.dg/vect/bb-slp-pr101615-1.c: New testcase.
-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; |