This fixes updating of the step vectors when filling up to group_size.

Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.

2020-11-09  Richard Biener  <rguent...@suse.de>

        PR tree-optimization/97753
        * tree-vect-loop.c (vectorizable_induction): Fill vec_steps
        when CSEing inside the group.

        * gcc.dg/vect/pr97753.c: New testcase.
---
 gcc/testsuite/gcc.dg/vect/pr97753.c | 10 ++++++++++
 gcc/tree-vect-loop.c                |  7 +++++--
 2 files changed, 15 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/vect/pr97753.c

diff --git a/gcc/testsuite/gcc.dg/vect/pr97753.c 
b/gcc/testsuite/gcc.dg/vect/pr97753.c
new file mode 100644
index 00000000000..e49a8487631
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr97753.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-O3" } */
+
+long a[6];
+void d(int c)
+{
+  for (; c; c++)
+    for (int b = 0; b < 8; b++)
+      ((char *)&a[c])[b] = c;
+}
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index 0ba37540d5d..977633a3ce3 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -8068,8 +8068,11 @@ vectorizable_induction (loop_vec_info loop_vinfo,
          nivs = least_common_multiple (group_size,
                                        const_nunits) / const_nunits;
          for (; ivn < nivs; ++ivn)
-           SLP_TREE_VEC_STMTS (slp_node)
-             .quick_push (SLP_TREE_VEC_STMTS (slp_node)[0]);
+           {
+             SLP_TREE_VEC_STMTS (slp_node)
+               .quick_push (SLP_TREE_VEC_STMTS (slp_node)[0]);
+             vec_steps.safe_push (vec_steps[0]);
+           }
        }
 
       /* Re-use IVs when we can.  We are generating further vector
-- 
2.26.2

Reply via email to