aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2020-02-18 18:06:32 +0000
committerRichard Sandiford <richard.sandiford@arm.com>2020-02-19 13:12:22 +0000
commitf91aa3e6cb808f8dfc6b45fa135f7583a7549161 (patch)
treedf517321d86e31f94c6bb925803180716b53634c /gcc
parentaca60ecff35837a1af9383cf67ee7d1c0a718b28 (diff)
downloadgcc-f91aa3e6cb808f8dfc6b45fa135f7583a7549161.zip
gcc-f91aa3e6cb808f8dfc6b45fa135f7583a7549161.tar.gz
gcc-f91aa3e6cb808f8dfc6b45fa135f7583a7549161.tar.bz2
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr93767.c13
-rw-r--r--gcc/tree-vect-data-refs.c4
4 files changed, 26 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6cd941a..757d05a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index df79951..2d88138 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
diff --git a/gcc/testsuite/gcc.dg/vect/pr93767.c b/gcc/testsuite/gcc.dg/vect/pr93767.c
new file mode 100644
index 0000000..5f95d7b
--- /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 554ef89..0192aa6 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);