]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/114435 - pcom left around copies confusing SLP
authorRichard Biener <rguenther@suse.de>
Wed, 29 May 2024 08:41:51 +0000 (10:41 +0200)
committerRichard Biener <rguenther@suse.de>
Wed, 29 May 2024 10:58:08 +0000 (12:58 +0200)
The following arranges for the pre-SLP vectorization scalar cleanup
to be run when predictive commoning was applied to a loop in the
function.  This is similar to the complete unroll situation and
facilitating SLP vectorization.  Avoiding the SSA copies in predictive
commoning itself isn't easy (and predcom also sometimes unrolls,
asking for scalar cleanup).

PR tree-optimization/114435
* tree-predcom.cc (tree_predictive_commoning): Queue
the next scalar cleanup sub-pipeline to be run when we
did something.

* gcc.dg/vect/bb-slp-pr114435.c: New testcase.

gcc/testsuite/gcc.dg/vect/bb-slp-pr114435.c [new file with mode: 0644]
gcc/tree-predcom.cc

diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-pr114435.c b/gcc/testsuite/gcc.dg/vect/bb-slp-pr114435.c
new file mode 100644 (file)
index 0000000..d1eecf7
--- /dev/null
@@ -0,0 +1,37 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target vect_double } */
+/* Predictive commining is supposed to happen.  */
+/* { dg-additional-options "-O3 -fdump-tree-pcom" } */
+
+struct res {
+    double r0;
+    double r1;
+    double r2;
+    double r3;
+};
+
+struct pxl {
+    double v0;
+    double v1;
+    double v2;
+    double v3;
+};
+
+#define IS_NAN(x) ((x) == (x))
+
+void fold(struct res *r, struct pxl *in, double k, int sz)
+{
+  int i;
+
+  for (i = 0; i < sz; i++) {
+      if (IS_NAN(k)) continue;
+      r->r0 += in[i].v0 * k;
+      r->r1 += in[i].v1 * k;
+      r->r2 += in[i].v2 * k;
+      r->r3 += in[i].v3 * k;
+  }
+}
+
+/* { dg-final { scan-tree-dump "# r__r0_lsm\[^\r\n\]* = PHI" "pcom" } } */
+/* { dg-final { scan-tree-dump "optimized: basic block part vectorized" "slp1" } } */
+/* { dg-final { scan-tree-dump "# vect\[^\r\n\]* = PHI" "slp1" } } */
index 75a4c85164c7955dfcd6f9f085b283ed6f2bf795..9844fee1e974078713e4161e3d6fc21752223451 100644 (file)
@@ -3522,6 +3522,9 @@ tree_predictive_commoning (bool allow_unroll_p)
        }
     }
 
+  if (ret != 0)
+    cfun->pending_TODOs |= PENDING_TODO_force_next_scalar_cleanup;
+
   return ret;
 }