From: Richard Sandiford Date: Tue, 18 Feb 2020 18:06:32 +0000 (+0000) Subject: vect: Fix offset calculation for -ve strides [PR93767] X-Git-Tag: releases/gcc-9.3.0~89 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f9be6e10c96b75307878472567cb0712812a8ab7;p=thirdparty%2Fgcc.git 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-24 Richard Sandiford gcc/ Backport from mainline 2020-02-19 Richard Sandiford 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/ Backport from mainline 2020-02-19 Richard Sandiford PR tree-optimization/93767 * gcc.dg/vect/pr93767.c: New test. --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a79889e1bf20..3c604f07c698 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2020-02-24 Richard Sandiford + + Backport from mainline + 2020-02-19 Richard Sandiford + + 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-24 Bernd Edlinger * collect2.c (tool_cleanup): Avoid calling not signal-safe diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 812ae834d707..90ad38699c3a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2020-02-24 Richard Sandiford + + Backport from mainline + 2020-02-19 Richard Sandiford + + PR tree-optimization/93767 + * gcc.dg/vect/pr93767.c: New test. + 2020-02-24 Mark Eggleston Backported from master diff --git a/gcc/testsuite/gcc.dg/vect/pr93767.c b/gcc/testsuite/gcc.dg/vect/pr93767.c new file mode 100644 index 000000000000..5f95d7bd35b2 --- /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 d71a39ffd78b..17a4fc8e2791 100644 --- a/gcc/tree-vect-data-refs.c +++ b/gcc/tree-vect-data-refs.c @@ -3228,14 +3228,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);