https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120972

            Bug ID: 120972
           Summary: restrict does not work for not-parameter pointer
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: fxue at os dot amperecomputing.com
  Target Milestone: ---

We could get the below loop vectorized with options "-Ofast -S -mavx512f
--param vect-max-version-for-alias-checks=0", since __restrict__ on parameters
could ensure no alias among memory accesses.

void add(char* __restrict__ a0, char * __restrict__ b0, char * __restrict__ c0,
int n, int m)
{
  double *__restrict__ a = (double *) &a0[m];
  double *__restrict__ b = (double *) &b0[m];
  double *__restrict__ c = (double *) &c0[m];

  for(int i = 0; i < n; i++)
      c[i] = a[i] + b[i];
}

But alias-analysis does not follow the same assumption for __restrict__
non-parameter pointers, as the result, a modified case below could not be
vectorized with the same options, since runtime alias checks are disabled.

char *ga();
char *gb();
char *gc();

void add(int n)
{
  double *__restrict__ a = (double *) ga();
  double *__restrict__ b = (double *) gb();
  double *__restrict__ c = (double *) gc();

  for(int i = 0; i < n; i++)
      c[i] = a[i] + b[i];
}

Reply via email to