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