On Wed, Feb 19, 2020 at 1:13 PM Richard Sandiford <richard.sandif...@arm.com> wrote: > > 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. > > Tested on aarch64-linux-gnu and x86_64-linux-gnu. OK to install?
OK. Thanks, Richard. > Richard > > > 2020-02-19 Richard Sandiford <richard.sandif...@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. > --- > gcc/testsuite/gcc.dg/vect/pr93767.c | 13 +++++++++++++ > gcc/tree-vect-data-refs.c | 4 ++-- > 2 files changed, 15 insertions(+), 2 deletions(-) > create mode 100644 gcc/testsuite/gcc.dg/vect/pr93767.c > > diff --git a/gcc/testsuite/gcc.dg/vect/pr93767.c > b/gcc/testsuite/gcc.dg/vect/pr93767.c > new file mode 100644 > index 00000000000..5f95d7bd35b > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/vect/pr93767.c > @@ -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; > +} > diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c > index 554ef892254..0192aa64636 100644 > --- a/gcc/tree-vect-data-refs.c > +++ b/gcc/tree-vect-data-refs.c > @@ -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);