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>
Wed, 19 Feb 2020 13:12:22 +0000 (13:12 +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-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.

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

index 6cd941a5ff87ba706e43cb32c54c0e6b53e6cf62..757d05a2f294bda76b8530657e2c53d0abd57df9 100644 (file)
@@ -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.
index df79951b6cc2aaad90268df0e1a1b553dceb03f6..2d88138cbb62ddf820422043069a58c3cea54b96 100644 (file)
@@ -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 (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 554ef892254c8d8a5ffa6b1e61429cd02f4a3a7f..0192aa646363a1224e1a66d64b05f3e28c341f21 100644 (file)
@@ -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);