diff options
author | Richard Biener <rguenther@suse.de> | 2021-07-14 11:06:58 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2021-07-14 12:31:42 +0200 |
commit | a967a3efd39280fe3f5774e45490e991f8e99059 (patch) | |
tree | 5d8652e56e7c6b696818e551a8972ca834822433 /gcc | |
parent | 3be762c2ed79e36b9c8faaea2be04725c967a34e (diff) | |
download | gcc-a967a3efd39280fe3f5774e45490e991f8e99059.zip gcc-a967a3efd39280fe3f5774e45490e991f8e99059.tar.gz gcc-a967a3efd39280fe3f5774e45490e991f8e99059.tar.bz2 |
tree-optimization/101445 - fix negative stride SLP vect with gaps
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.
2021-07-14 Richard Biener <rguenther@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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/pr101445.c | 28 | ||||
-rw-r--r-- | gcc/tree-vect-stmts.c | 6 |
2 files changed, 34 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/vect/pr101445.c b/gcc/testsuite/gcc.dg/vect/pr101445.c new file mode 100644 index 0000000..f8a6e9c --- /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 e590f34..3980f09 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); |