]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
vect: Fix offset calculation for -ve strides [PR93767]
authorRichard Sandiford <richard.sandiford@arm.com>
Tue, 18 Feb 2020 18:06:32 +0000 (18:06 +0000)
committerRichard Sandiford <richard.sandiford@arm.com>
Mon, 24 Feb 2020 21:24:11 +0000 (21:24 +0000)
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  <richard.sandiford@arm.com>

gcc/
Backport from mainline
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.

gcc/testsuite/
Backport from mainline
2020-02-19  Richard Sandiford  <richard.sandiford@arm.com>

PR tree-optimization/93767
* gcc.dg/vect/pr93767.c: New test.

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/pr93767.c [new file with mode: 0644]
gcc/tree-vect-data-refs.c

index a79889e1bf20d06ea02fd9f90117b7fde2a84a1a..3c604f07c698a746026ea039d7b12dad8e1d7848 100644 (file)
@@ -1,3 +1,12 @@
+2020-02-24  Richard Sandiford  <richard.sandiford@arm.com>
+
+       Backport from mainline
+       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-24  Bernd Edlinger  <bernd.edlinger@hotmail.de>
 
        * collect2.c (tool_cleanup): Avoid calling not signal-safe
index 812ae834d7079e6135fffec8754acd145d32e41d..90ad38699c3ad67a9ad75d5a8e887979de7caee4 100644 (file)
@@ -1,3 +1,11 @@
+2020-02-24  Richard Sandiford  <richard.sandiford@arm.com>
+
+       Backport from mainline
+       2020-02-19  Richard Sandiford  <richard.sandiford@arm.com>
+
+       PR tree-optimization/93767
+       * gcc.dg/vect/pr93767.c: New test.
+
 2020-02-24  Mark Eggleston  <mark.eggleston@codethink.com>
 
        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 (file)
index 0000000..5f95d7b
--- /dev/null
@@ -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;
+}
index d71a39ffd78be9838d9f0d9f3c98389edf3e7a40..17a4fc8e27918e31f12dbe101b82588cc2127321 100644 (file)
@@ -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);