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:
Richard Sandiford 2020-02-18 18:06:32 +00:00
parent aca60ecff3
commit f91aa3e6cb
4 changed files with 26 additions and 2 deletions

View File

@ -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.

View File

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

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

View File

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