On Tue, May 30, 2017 at 12:27 PM, Richard Biener
<[email protected]> wrote:
> On Thu, May 25, 2017 at 5:16 PM, Bin.Cheng <[email protected]> wrote:
>> On Tue, May 23, 2017 at 5:23 PM, Bin Cheng <[email protected]> wrote:
>>> Hi,
>>> As commented in https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80815#c1,
>>> We can relax minimal segment length of DR_B for merging. With this change,
>>> the new test can be improved to only one alias check. Note the
>>> condition is still accurate after this patch, it won't introduce false
>>> alias.
>>> Bootstrap and test on x86_64 and AArch64, is it OK?
>> Updated patch wrto change of previous patch.
>>
>> Bootstrap and test on x86_64 and AArch64.
>
> Please omit unnecessary braces. Ok with that change.
>
> Note that
>
> if (tree_fits_uhwi_p (dr_b1->seg_len))
> {
> min_seg_len_b = dr_b1->seg_len;
> if (tree_int_cst_sign_bit (dr_b1->seg_len))
> min_seg_len_b = wi::neg (min_seg_len_b);
>
> the tree_fits_uhwi_p check is somewhat bogus now that min_seg_len_b is
> a wide-int.
> It should probably be changed to TREE_CODE (dr_b1->seg_len) == INTEGER_CST
> which also means that
>
> min_seg_len_b = wi::abs (dr_b1->seg_len);
>
> should work.
Thanks for reviewing. Here is updated patch. Bootstrap and test on
x86_64. Is it OK?
Thanks,
bin
>
> Richard.
>
>
>> Thanks,
>> bin
>>>
>>> 2017-05-22 Bin Cheng <[email protected]>
>>>
>>> * tree-data-ref.c (prune_runtime_alias_test_list): Relax minimal
>>> segment length for dr_b.
>>>
>>> gcc/testsuite/ChangeLog
>>> 2017-05-22 Bin Cheng <[email protected]>
>>>
>>> * gcc.dg/vect/pr80815-3.c: New test.
diff --git a/gcc/testsuite/gcc.dg/vect/pr80815-3.c
b/gcc/testsuite/gcc.dg/vect/pr80815-3.c
new file mode 100644
index 0000000..dae01fa
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr80815-3.c
@@ -0,0 +1,45 @@
+/* { dg-require-effective-target vect_int } */
+
+#include "tree-vect.h"
+int arr[2048];
+int res[100] = { 2148, 2146, 2144, 2142, 2140, 2138, 2136, 2134, 2132, 2130,
+ 2128, 2126, 2124, 2122, 2120, 2118, 2116, 2114, 2112, 2110,
+ 2108, 2106, 2104, 2102, 2100, 2098, 2096, 2094, 2092, 2090,
+ 2088, 2086, 2084, 2082, 2080, 2078, 2076, 2074, 2072, 2070,
+ 2068, 2066, 2064, 2062, 2060, 2058, 2056, 2054, 3078, 2050};
+
+__attribute__ ((noinline)) int
+foo (int *a, int *b, int len)
+{
+ int i;
+ int *a1 = a;
+ int *a0 = a1 - 4;
+ for (i = 0; i < len; i++)
+ {
+ *b = *a0 + *a1;
+ b--;
+ a0++;
+ a1++;
+ }
+ return 0;
+}
+
+int main (void)
+{
+ int *a = &arr[1027];
+ int *b = &arr[1024];
+
+ int i;
+ for (i = 0; i < 2048; i++)
+ arr[i] = i;
+
+ foo (a, b, 50);
+
+ for (i = 975; i < 1025; i++)
+ if (arr[i] != res[i - 975])
+ abort ();
+
+ return 0;
+}
+
+/* { dg-final { scan-tree-dump "improved number of alias checks from \[0-9\]*
to 1" "vect" } } */
diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c
index cfff7c2..c4275e2 100644
--- a/gcc/tree-data-ref.c
+++ b/gcc/tree-data-ref.c
@@ -1361,14 +1361,10 @@ prune_runtime_alias_test_list
(vec<dr_with_seg_len_pair_t> *alias_pairs,
wide_int min_seg_len_b;
tree new_seg_len;
- if (tree_fits_uhwi_p (dr_b1->seg_len))
- {
- min_seg_len_b = dr_b1->seg_len;
- if (tree_int_cst_sign_bit (dr_b1->seg_len))
- min_seg_len_b = wi::neg (min_seg_len_b);
- }
+ if (TREE_CODE (dr_b1->seg_len) == INTEGER_CST)
+ min_seg_len_b = wi::abs (dr_b1->seg_len);
else
- min_seg_len_b = wi::uhwi (factor, TYPE_PRECISION (sizetype));
+ min_seg_len_b = wi::mul (factor, wi::abs (DR_STEP (dr_b1->dr)));
/* Now we try to merge alias check dr_a1 & dr_b and dr_a2 & dr_b.