tree-optimization/98854 - avoid some PHI BB vectorization
authorRichard Biener <rguenther@suse.de>
Wed, 27 Jan 2021 14:20:58 +0000 (15:20 +0100)
committerRichard Biener <rguenther@suse.de>
Wed, 27 Jan 2021 16:33:34 +0000 (17:33 +0100)
This avoids cases of PHI node vectorization that just causes us
to insert vector CTORs inside loops for values only required
outside of the loop.

2021-01-27  Richard Biener  <rguenther@suse.de>

PR tree-optimization/98854
* tree-vect-slp.c (vect_build_slp_tree_2): Also build
PHIs from scalars when the number of CTORs matches the
number of children.

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

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

diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-pr98854.c b/gcc/testsuite/gcc.dg/vect/bb-slp-pr98854.c
new file mode 100644 (file)
index 0000000..0c8141e
--- /dev/null
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+
+double a[1024];
+
+int bar();
+void foo (int n)
+{
+  double x = 0, y = 0;
+  int i = 1023;
+  do
+    {
+      x += a[i] + a[i+1];
+      y += a[i] / a[i+1];
+      if (bar ())
+        break;
+    }
+  while (--i);
+  /* We want to avoid vectorizing the LC PHI and insert vector CTORs
+     inside of the loop where it is only needed here.  */
+  a[0] = x;
+  a[1] = y;
+}
+
+/* { dg-final { scan-tree-dump-not "vectorizing SLP node starting from: ._\[0-9\]+ = PHI" "slp1" } } */
index 4465cf7494ee1608e34ed1091ac2c0428cd4de2e..10b876ff5ede8896eb95abd22f716e458c99416d 100644 (file)
@@ -1896,7 +1896,10 @@ fail:
                n_vector_builds++;
            }
        }
-      if (all_uniform_p || n_vector_builds > 1)
+      if (all_uniform_p
+         || n_vector_builds > 1
+         || (n_vector_builds == children.length ()
+             && is_a <gphi *> (stmt_info->stmt)))
        {
          /* Roll back.  */
          matches[0] = false;