[gcc(refs/vendors/ARM/heads/arm-perf-staging)] vect: Fix offset calculation for -ve strides [PR93767]

Tamar Christina tnfchris@gcc.gnu.org
Fri Jul 17 13:13:07 GMT 2020


https://gcc.gnu.org/g:f91aa3e6cb808f8dfc6b45fa135f7583a7549161

commit f91aa3e6cb808f8dfc6b45fa135f7583a7549161
Author: Richard Sandiford <richard.sandiford@arm.com>
Date:   Tue Feb 18 18:06:32 2020 +0000

    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.

Diff:
---
 gcc/ChangeLog                       |  6 ++++++
 gcc/testsuite/ChangeLog             |  5 +++++
 gcc/testsuite/gcc.dg/vect/pr93767.c | 13 +++++++++++++
 gcc/tree-vect-data-refs.c           |  4 ++--
 4 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6cd941a5ff8..757d05a2f29 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 df79951b6cc..2d88138cbb6 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 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);


More information about the Gcc-cvs mailing list