On Fri, Jan 03, 2014 at 02:07:03PM +0000, Bingfeng Mei wrote:
> This patch fixes pr59651.  The original regression for pr52943 only
> appears on AArch64 target.  I constructed a similar test that also exposes
> bug on x86-64.  The problem is that calculation of address range in alias
> versioning for loops with negative step is wrong during vectorization. 
> For example, for a loop that access int a[3] -> a[1], the old calculated
> address range is [a, a+12).  It should be [a+4, a+16) instead.

--- tree-vect-loop-manip.c      (revision 206279)
+++ tree-vect-loop-manip.c      (working copy)
@@ -2241,12 +2241,26 @@ vect_create_cond_for_alias_checks (loop_
       tree seg_a_min = addr_base_a;
       tree seg_a_max = fold_build_pointer_plus (addr_base_a, segment_length_a);
       if (tree_int_cst_compare (DR_STEP (dr_a.dr), size_zero_node) < 0)
-       seg_a_min = seg_a_max, seg_a_max = addr_base_a;
+       {
+         seg_a_min = 
+           fold_build_pointer_plus (seg_a_max,
+                                    TYPE_SIZE_UNIT (TREE_TYPE (DR_REF 
(dr_a.dr))));
+         seg_a_max =
+           fold_build_pointer_plus (addr_base_a, 
+                                    TYPE_SIZE_UNIT (TREE_TYPE (DR_REF 
(dr_a.dr))));
+       }

Too long lines, can you create a temporary tree var for TYPE_SIZE_UNIT (...); 
value?
Can you add a comment why you do this?

--- testsuite/gcc.dg/torture/pr59651.c  (revision 0)
+++ testsuite/gcc.dg/torture/pr59651.c  (revision 0)

Perhaps better would be to put this test into gcc.dg/vect/pr59651.c
(with the required /* { dg-final { cleanup-tree-dump "vect" } } */ ),
so that it is also tested say on i686-linux with -msse2 etc.
Or duplicate between those two places (the body of the test can be
included in one of those two from the other place using relative path).

@@ -0,0 +1,20 @@
+/* { dg-do run } */
+
+extern void abort (void);
+int a[] = { 0, 0, 0, 0, 0, 0, 0, 6 };
+
+int b;
+int
+main ()
+{
+  for (;;)
+    {
+      b = 7;
+      for (; b; b -= 1)

Sounds like C-reduce weirdness, just write for (b = 7; b; --b)

+       a[b] = a[7] > 1;
+      break;
+    }
+  if (a[1] != 0)
+    abort ();
+  return 0;
+}

Ok with those changes.

        Jakub

Reply via email to