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.
This commit is contained in:
Richard Biener 2021-07-14 11:06:58 +02:00
parent 3be762c2ed
commit a967a3efd3
2 changed files with 34 additions and 0 deletions

View File

@ -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;
}

View File

@ -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);