mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-25 23:21:42 +08:00
vect: Fix offset calculation for -ve strides [PR93767]
This PR is a regression caused by r256644, which added support for alias checks involving variable strides. One of the changes in that commit was to split the access size out of the segment length. The PR shows that I hadn't done that correctly for the handling of negative strides in vect_compile_time_alias. The old code was: const_length_a = (-wi::to_poly_wide (segment_length_a)).force_uhwi (); offset_a = (offset_a + vect_get_scalar_dr_size (a)) - const_length_a; where vect_get_scalar_dr_size (a) was cancelling out the subtraction of the access size inherent in "- const_length_a". Taking the access size out of the segment length meant that the addition was no longer needed/correct. 2020-02-19 Richard Sandiford <richard.sandiford@arm.com> gcc/ PR tree-optimization/93767 * tree-vect-data-refs.c (vect_compile_time_alias): Remove the access-size bias from the offset calculations for negative strides. gcc/testsuite/ PR tree-optimization/93767 * gcc.dg/vect/pr93767.c: New test.
This commit is contained in:
parent
aca60ecff3
commit
f91aa3e6cb
@ -1,3 +1,9 @@
|
||||
2020-02-19 Richard Sandiford <richard.sandiford@arm.com>
|
||||
|
||||
PR tree-optimization/93767
|
||||
* tree-vect-data-refs.c (vect_compile_time_alias): Remove the
|
||||
access-size bias from the offset calculations for negative strides.
|
||||
|
||||
2020-02-19 Bernd Edlinger <bernd.edlinger@hotmail.de>
|
||||
|
||||
* collect2.c (c_file, o_file): Make const again.
|
||||
|
@ -1,3 +1,8 @@
|
||||
2020-02-19 Richard Sandiford <richard.sandiford@arm.com>
|
||||
|
||||
PR tree-optimization/93767
|
||||
* gcc.dg/vect/pr93767.c: New test.
|
||||
|
||||
2020-02-19 Martin Jambor <mjambor@suse.cz>
|
||||
|
||||
PR tree-optimization/93776
|
||||
|
13
gcc/testsuite/gcc.dg/vect/pr93767.c
Normal file
13
gcc/testsuite/gcc.dg/vect/pr93767.c
Normal file
@ -0,0 +1,13 @@
|
||||
int
|
||||
main ()
|
||||
{
|
||||
int a[10], b;
|
||||
for (b = 6; b >= 3; b--)
|
||||
{
|
||||
a[b] = 1;
|
||||
a[b + 2] = a[3];
|
||||
}
|
||||
if (a[5] != 1)
|
||||
__builtin_abort ();
|
||||
return 0;
|
||||
}
|
@ -3261,14 +3261,14 @@ vect_compile_time_alias (dr_vec_info *a, dr_vec_info *b,
|
||||
if (tree_int_cst_compare (DR_STEP (a->dr), size_zero_node) < 0)
|
||||
{
|
||||
const_length_a = (-wi::to_poly_wide (segment_length_a)).force_uhwi ();
|
||||
offset_a = (offset_a + access_size_a) - const_length_a;
|
||||
offset_a -= const_length_a;
|
||||
}
|
||||
else
|
||||
const_length_a = tree_to_poly_uint64 (segment_length_a);
|
||||
if (tree_int_cst_compare (DR_STEP (b->dr), size_zero_node) < 0)
|
||||
{
|
||||
const_length_b = (-wi::to_poly_wide (segment_length_b)).force_uhwi ();
|
||||
offset_b = (offset_b + access_size_b) - const_length_b;
|
||||
offset_b -= const_length_b;
|
||||
}
|
||||
else
|
||||
const_length_b = tree_to_poly_uint64 (segment_length_b);
|
||||
|
Loading…
x
Reference in New Issue
Block a user