When doing early break vectorization of a loop with a conditional
reduction the epilog creation code is confused as to before which exit
to insert the conditional reduction induction IV update.  The
following make sure this is done before the main IV exit.

Bootstrapped and tested on x86_64-unknown-linux-gnu.  I'll wait for
the Linaro CI before pushing.

Richard.

        PR tree-optimization/120357
        * tree-vect-loop.cc (vect_create_epilog_for_reduction): Create
        the conditional reduction induction IV increment before the
        main IV exit.

        * gcc.dg/vect/vect-early-break_136-pr120357.c: New testcase.
---
 .../gcc.dg/vect/vect-early-break_136-pr120357.c     | 13 +++++++++++++
 gcc/tree-vect-loop.cc                               |  3 ++-
 2 files changed, 15 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.dg/vect/vect-early-break_136-pr120357.c

diff --git a/gcc/testsuite/gcc.dg/vect/vect-early-break_136-pr120357.c 
b/gcc/testsuite/gcc.dg/vect/vect-early-break_136-pr120357.c
new file mode 100644
index 00000000000..8a51cfc46a5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-early-break_136-pr120357.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-add-options vect_early_break } */
+/* { dg-additional-options "-O3" } */
+
+char a;
+unsigned long long t[2][22];
+int u[22];
+void f(void)
+{
+  for (int v = 0; v < 22; v++)
+    for (_Bool w = 0; w < (u[v] < 0) + 1; w = 1)
+      a *= 0 != t[w][v];
+}
diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
index 4af510ff20c..cf5b9f3f979 100644
--- a/gcc/tree-vect-loop.cc
+++ b/gcc/tree-vect-loop.cc
@@ -6029,7 +6029,8 @@ vect_create_epilog_for_reduction (loop_vec_info 
loop_vinfo,
       /* Create an induction variable.  */
       gimple_stmt_iterator incr_gsi;
       bool insert_after;
-      vect_iv_increment_position (loop_exit, &incr_gsi, &insert_after);
+      vect_iv_increment_position (LOOP_VINFO_IV_EXIT (loop_vinfo),
+                                 &incr_gsi, &insert_after);
       create_iv (series_vect, PLUS_EXPR, vec_step, NULL_TREE, loop, &incr_gsi,
                 insert_after, &indx_before_incr, &indx_after_incr);
 
-- 
2.43.0

Reply via email to