]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/120357 - ICE with early break vectorization
authorRichard Biener <rguenther@suse.de>
Fri, 30 May 2025 12:11:47 +0000 (14:11 +0200)
committerRichard Biener <rguenther@suse.de>
Sat, 31 May 2025 12:42:10 +0000 (14:42 +0200)
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.

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/testsuite/gcc.dg/vect/vect-early-break_136-pr120357.c [new file with mode: 0644]
gcc/tree-vect-loop.cc

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 (file)
index 0000000..8a51cfc
--- /dev/null
@@ -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];
+}
index 2d1a6883e6b82463e0c9483662fbfcb8032739f5..8c5761d3c55d52c95829f98e4215ae80cebe85d0 100644 (file)
@@ -6016,7 +6016,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);