https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80815
--- Comment #1 from amker at gcc dot gnu.org ---
GCC uses vect_factor as minimal segment length for dr_b when merging alias
pairs, I think it could be relaxed to vect_factor * abs (DR_STEP (dr_b)).
Below test shows this change can merge additional alias checks:
#include <stdio.h>
int arr[2048];
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, 500);
for (i = 0; i < 2048; i++)
fprintf (stdout, "%d: %d\n", i, arr[i]);
return 0;
}
$ ./gcc -Ofast -fno-inline ./z.c -o z.exe -fdump-tree-vect-details
Of course, alias check should fail and vectorized loop in foo should never be
executed.
Thanks,