tree-optimization/97835 - fix step vector construction for SLP induction

We're stripping conversions off access functions of inductions and
thus the step can be of different sign.  Fix bogus step CTORs by
converting the elements rather than the whole vector.

2020-11-16  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/97835
	* tree-vect-loop.c (vectorizable_induction): Convert step
	scalars rather than step vector.

	* gcc.dg/vect/pr97835.c: New testcase.
This commit is contained in:
Richard Biener 2020-11-16 09:06:41 +01:00
parent aaccdb9cec
commit d12603b746
2 changed files with 22 additions and 1 deletions

View File

@ -0,0 +1,21 @@
/* { dg-do compile } */
/* { dg-require-effective-target vect_int } */
struct co {
int gx;
int ty;
};
void
x0 (struct co *yy, long int kc, int wi, int md)
{
while (wi < 1)
{
yy[wi].gx = md;
yy[wi].ty = wi;
md += kc;
++wi;
}
}
/* { dg-final { scan-tree-dump "vectorizing stmts using SLP" "vect" } } */

View File

@ -7999,6 +7999,7 @@ vectorizable_induction (loop_vec_info loop_vinfo,
{
/* The scalar steps of the IVs. */
tree elt = steps[(ivn*const_nunits + eltn) % group_size];
elt = gimple_convert (&init_stmts, TREE_TYPE (step_vectype), elt);
step_elts.quick_push (elt);
if (!init_node)
{
@ -8018,7 +8019,6 @@ vectorizable_induction (loop_vec_info loop_vinfo,
: build_int_cstu (stept, mul_elt));
}
vec_step = gimple_build_vector (&init_stmts, &step_elts);
vec_step = gimple_convert (&init_stmts, step_vectype, vec_step);
vec_steps.safe_push (vec_step);
tree step_mul = gimple_build_vector (&init_stmts, &mul_elts);
if (peel_mul)