[PATCH] tree-optimization/101615 - SLP permute opt of existing vectors

Richard Biener rguenther@suse.de
Wed Jul 28 13:14:00 GMT 2021


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.

Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.

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.
---
 gcc/testsuite/gcc.dg/vect/bb-slp-pr101615-1.c | 30 +++++++++++++++++++
 gcc/tree-vect-slp.c                           |  6 ++--
 2 files changed, 34 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/vect/bb-slp-pr101615-1.c

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 00000000000..d1c9c02d517
--- /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 b9d88c2d943..07cc24a60e1 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;
 
-- 
2.26.2


More information about the Gcc-patches mailing list