The following fixes the IV adjustment for the gap in a negative stride SLP vectorization. The adjustment was in the wrong direction, now fixes as in the patch.
Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed. 2021-07-14 Richard Biener <rguent...@suse.de> PR tree-optimization/101445 * tree-vect-stmts.c (vectorizable_load): Do the gap adjustment of the IV in the correct direction for negative stride accesses. * gcc.dg/vect/pr101445.c: New testcase. --- gcc/testsuite/gcc.dg/vect/pr101445.c | 28 ++++++++++++++++++++++++++++ gcc/tree-vect-stmts.c | 6 ++++++ 2 files changed, 34 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/vect/pr101445.c diff --git a/gcc/testsuite/gcc.dg/vect/pr101445.c b/gcc/testsuite/gcc.dg/vect/pr101445.c new file mode 100644 index 00000000000..f8a6e9ce6f7 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr101445.c @@ -0,0 +1,28 @@ +/* { dg-do run } */ + +#include "tree-vect.h" + +int a[35] = { 1, 1, 3 }; + +void __attribute__((noipa)) +foo () +{ + for (int b = 4; b >= 0; b--) + { + int tem = a[b * 5 + 3 + 1]; + a[b * 5 + 3] = tem; + a[b * 5 + 2] = tem; + a[b * 5 + 1] = tem; + a[b * 5 + 0] = tem; + } +} + +int main() +{ + check_vect (); + foo (); + for (int d = 0; d < 25; d++) + if (a[d] != 0) + __builtin_abort (); + return 0; +} diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index e590f34d75d..3980f0918b2 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -9759,6 +9759,9 @@ vectorizable_load (vec_info *vinfo, poly_wide_int bump_val = (wi::to_wide (TYPE_SIZE_UNIT (elem_type)) * group_gap_adj); + if (tree_int_cst_sgn + (vect_dr_behavior (vinfo, dr_info)->step) == -1) + bump_val = -bump_val; tree bump = wide_int_to_tree (sizetype, bump_val); dataref_ptr = bump_vector_ptr (vinfo, dataref_ptr, ptr_incr, gsi, stmt_info, bump); @@ -9772,6 +9775,9 @@ vectorizable_load (vec_info *vinfo, poly_wide_int bump_val = (wi::to_wide (TYPE_SIZE_UNIT (elem_type)) * group_gap_adj); + if (tree_int_cst_sgn + (vect_dr_behavior (vinfo, dr_info)->step) == -1) + bump_val = -bump_val; tree bump = wide_int_to_tree (sizetype, bump_val); dataref_ptr = bump_vector_ptr (vinfo, dataref_ptr, ptr_incr, gsi, stmt_info, bump); -- 2.26.2