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: basepoints/gcc-12~3209 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d12603b746986554981f5ee220926a36a6cb6baf;p=thirdparty%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 000000000000..5ca477bf806f --- /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 39b7319e8253..4d5532f71d0b 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)