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,

Reply via email to