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:
parent
aaccdb9cec
commit
d12603b746
|
@ -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" } } */
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue