[LLVMdev] Upcoming Changes/Additions to Scoped-NoAlias metadata

Hal Finkel
2014-11-14T19:41:09Z

----- Original Message -----
> From: "Raul Silvera" <rsilvera at google.com>
> To: "Hal Finkel" <hfinkel at anl.gov>
> Cc: "Chandler Carruth" <chandlerc at google.com>,
"LLVM Developers Mailing List" <llvmdev at cs.uiuc.edu>
> Sent: Friday, November 14, 2014 12:15:51 PM
> Subject: Re: [LLVMdev] Upcoming Changes/Additions to Scoped-NoAlias
metadata
>
> Thanks, Hal... Let me stay on the first question for now.
>
>
>
> If we take your example and remove the first restrict:
> T A;
> T * y1 = ..., y2 = ...
> {
> T * x = &A;
> a = x[i];
> }
> {
> T * restrict x = y2;
> b = x[i];
> }
>
> Will we assert that *x1 and *x2 do not alias each other? If so, why
> is it OK here and not if the first one is restrict?

You don't have x1 and x2 in your example, assuming you mean:

  int i = 0;
  T A;
  T * y2 = ...
  {
    T * x1 = &A;
    a = x1[i];
  }
  {
    T * restrict x2 = y2;
    b = x2[i];
  }

then the answer is no, the fact that x2 is restrict qualified does not allow us
to conclude that &x2[i] and &x1[i] don't alias.

> I believe from a
> language perspective you just need the bottom restrict to make the
> guarantee.

Now assuming that the '...' is not &A, the BasicAA will catch this,
but that's another matter.  You'd need to have the restrict in a parent
block here.

 -Hal

>
>
>
> On Fri Nov 14 2014 at 9:48:42 AM Hal Finkel < hfinkel at anl.gov >
> wrote:
>
>
> ----- Original Message -----
> > From: "Raul Silvera" < rsilvera at google.com >
> > To: "Hal Finkel" < hfinkel at anl.gov >
> > Cc: "Chandler Carruth" < chandlerc at google.com >,
"LLVM Developers
> > Mailing List" < llvmdev at cs.uiuc.edu >
> > Sent: Friday, November 14, 2014 10:34:39 AM
> > Subject: Re: [LLVMdev] Upcoming Changes/Additions to Scoped-NoAlias
> > metadata
> >
> >
> >
> > Hal, a couple of questions:
> >
> >
> > 1. Do you preserve alias to stores+loads derived through a
> > different
> > @llvm.noalias call which has different scope metadata? Couldn't
> > that
> > be treated similarly to S+Ls derived from other identified objects?
>
> From a different scope? No. Here's why:
>
> int i = ...;
> T a, b;
>
> which becomes:
>
> int i = ...;
> T a, b;
> T * y1 = ..., y2 = ...
> T * x1 = @llvm.noalias(y1, !scope1);
> a = x1[i]; // alias.scope !scope1
> T * x2 = @llvm.noalias(y2, !scope2);
> b = x2[i]; // alias.scope !scope2
>
> but can we assume that 'x1[i]' does not alias with 'x2[i]'?
No.
>
> Now one possible design here is to solve this problem by mutual
> dominance, but to do that, we'd need to make code motion around the
> @llvm.noalias calls highly restricted. I'd like to allow for as much
> data motion as possible.
>
>

--
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory