aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2021-07-28 14:16:35 +0200
committerRichard Biener <rguenther@suse.de>2021-07-28 15:14:19 +0200
commit6bb6e2044ced33d08175361b8e39a9c5d4a868a6 (patch)
tree394e67b07401407ca837ea9f674100fdb3e72196
parent1af16666943ef075673501765a13e425e47015cd (diff)
downloadgcc-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.c30
-rw-r--r--gcc/tree-vect-slp.c6
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;