tree-optimization/114485 - neg induction with partial vectors

We can't use vect_update_ivs_after_vectorizer for partial vectors,
the following fixes vect_can_peel_nonlinear_iv_p accordingly.

	PR tree-optimization/114485
	* tree-vect-loop-manip.cc (vect_can_peel_nonlinear_iv_p):
	vect_step_op_neg isn't OK for partial vectors but only
	for unknown niter.

	* gcc.dg/vect/pr114485.c: New testcase.
This commit is contained in:
Richard Biener 2024-04-04 10:00:51 +02:00
parent 1c89d1b9dc
commit 85621f98d2
2 changed files with 25 additions and 7 deletions

View file

@ -0,0 +1,18 @@
#include "tree-vect.h"
int b, c = 8, d;
int e[23];
int main()
{
check_vect ();
int *h = e;
for (int i = 1; i < b + 21; i += 2)
{
c *= -1;
d = h[i] ? i : 0;
}
if (c != 8)
abort ();
return 0;
}

View file

@ -2128,18 +2128,18 @@ vect_can_peel_nonlinear_iv_p (loop_vec_info loop_vinfo,
For shift, when shift mount >= precision, there would be UD.
For mult, don't known how to generate
init_expr * pow (step, niters) for variable niters.
For neg, it should be ok, since niters of vectorized main loop
For neg unknown niters are ok, since niters of vectorized main loop
will always be multiple of 2.
See also PR113163 and PR114196. */
if ((!LOOP_VINFO_VECT_FACTOR (loop_vinfo).is_constant ()
|| LOOP_VINFO_USING_PARTIAL_VECTORS_P (loop_vinfo)
|| !LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo))
&& induction_type != vect_step_op_neg)
See also PR113163, PR114196 and PR114485. */
if (!LOOP_VINFO_VECT_FACTOR (loop_vinfo).is_constant ()
|| LOOP_VINFO_USING_PARTIAL_VECTORS_P (loop_vinfo)
|| (!LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo)
&& induction_type != vect_step_op_neg))
{
if (dump_enabled_p ())
dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
"Peeling for epilogue is not supported"
" for nonlinear induction except neg"
" for this nonlinear induction"
" when iteration count is unknown or"
" when using partial vectorization.\n");
return false;