]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/105219 - bogus max iters for vectorized epilogue
authorRichard Biener <rguenther@suse.de>
Wed, 27 Apr 2022 12:06:12 +0000 (14:06 +0200)
committerRichard Biener <rguenther@suse.de>
Thu, 28 Apr 2022 06:06:52 +0000 (08:06 +0200)
The following makes sure to take into account prologue peeling
when trying to narrow down the maximum number of iterations
computed for the vectorized epilogue.  A similar issue exists when
peeling for gaps.

2022-04-27  Richard Biener  <rguenther@suse.de>

PR tree-optimization/105219
* tree-vect-loop.cc (vect_transform_loop): Disable
special code narrowing the vectorized epilogue max
iterations when peeling for alignment or gaps was in effect.

* gcc.dg/vect/pr105219.c: New testcase.

gcc/testsuite/gcc.dg/vect/pr105219.c [new file with mode: 0644]
gcc/tree-vect-loop.cc

diff --git a/gcc/testsuite/gcc.dg/vect/pr105219.c b/gcc/testsuite/gcc.dg/vect/pr105219.c
new file mode 100644 (file)
index 0000000..0cb7ae2
--- /dev/null
@@ -0,0 +1,29 @@
+/* { dg-do run } */
+/* { dg-additional-options "-O3" } */
+/* { dg-additional-options "-mtune=intel" { target x86_64-*-* i?86-*-* } } */
+
+#include "tree-vect.h"
+
+int data[128];
+
+void __attribute((noipa))
+foo (int *data, int n)
+{
+  for (int i = 0; i < n; ++i)
+    data[i] = i;
+}
+
+int main()
+{
+  check_vect ();
+  for (int start = 0; start < 16; ++start)
+    for (int n = 1; n < 3*16; ++n)
+      {
+        __builtin_memset (data, 0, sizeof (data));
+        foo (&data[start], n);
+        for (int j = 0; j < n; ++j)
+          if (data[start + j] != j)
+            __builtin_abort ();
+      }
+  return 0;
+}
index d7bc34636bd52b2f67cdecd3dc16fcff684dba07..f53a634a390c389df13f83a4ba8eb5bfa4aaddad 100644 (file)
@@ -9977,7 +9977,11 @@ vect_transform_loop (loop_vec_info loop_vinfo, gimple *loop_vectorized_call)
                            lowest_vf) - 1
           : wi::udiv_floor (loop->nb_iterations_upper_bound + bias_for_lowest,
                             lowest_vf) - 1);
-      if (main_vinfo)
+      if (main_vinfo
+         /* Both peeling for alignment and peeling for gaps can end up
+            with the scalar epilogue running for more than VF-1 iterations.  */
+         && !main_vinfo->peeling_for_alignment
+         && !main_vinfo->peeling_for_gaps)
        {
          unsigned int bound;
          poly_uint64 main_iters