mirror of
https://gcc.gnu.org/git/gcc.git
synced 2025-01-17 09:13:49 +08:00
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:
parent
3be762c2ed
commit
a967a3efd3
28
gcc/testsuite/gcc.dg/vect/pr101445.c
Normal file
28
gcc/testsuite/gcc.dg/vect/pr101445.c
Normal 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;
|
||||
}
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user