From: Richard Biener Date: Mon, 16 Nov 2020 08:06:41 +0000 (+0100) Subject: tree-optimization/97835 - fix step vector construction for SLP induction X-Git-Tag: upstream/12.2.0~11906 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d12603b746986554981f5ee220926a36a6cb6baf;p=platform%2Fupstream%2Fgcc.git 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 PR tree-optimization/97835 * tree-vect-loop.c (vectorizable_induction): Convert step scalars rather than step vector. * gcc.dg/vect/pr97835.c: New testcase. --- diff --git a/gcc/testsuite/gcc.dg/vect/pr97835.c b/gcc/testsuite/gcc.dg/vect/pr97835.c new file mode 100644 index 0000000..5ca477b --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr97835.c @@ -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" } } */ diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 39b7319..4d5532f 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -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)