tree-optimization/97835 - fix step vector construction for SLP induction
authorRichard Biener <rguenther@suse.de>
Mon, 16 Nov 2020 08:06:41 +0000 (09:06 +0100)
committerRichard Biener <rguenther@suse.de>
Mon, 16 Nov 2020 08:33:04 +0000 (09:33 +0100)
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.

gcc/testsuite/gcc.dg/vect/pr97835.c [new file with mode: 0644]
gcc/tree-vect-loop.c

diff --git a/gcc/testsuite/gcc.dg/vect/pr97835.c b/gcc/testsuite/gcc.dg/vect/pr97835.c
new file mode 100644 (file)
index 0000000..5ca477b
--- /dev/null
@@ -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" } } */
index 39b7319e8253c351a4f6fbdd8c154330f08f2b1b..4d5532f71d0b1ee8a271c845ecb95d9f534a1fb4 100644 (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)