tree-optimization/120357 - ICE with early break vectorization

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.

(cherry picked from commit dce4da51ab)
This commit is contained in:
Richard Biener 2025-05-30 14:11:47 +02:00
parent f13e686397
commit bcf8cec0e8
2 changed files with 15 additions and 1 deletions

View File

@ -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];
}

View File

@ -6134,7 +6134,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);