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

Raul Silvera rsilvera at google.com
Mon Nov 17 09:26:57 PST 2014


>
> > 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];
> > }
> >
> > It should, no? by virtue of x2 being restrict you know that *x2
> > doesn't alias A, and *x1 is A.
>
> No, it doesn't. The fact that x2 is restrict does not mean that it does
> not alias with any other potential accesses from variables live in its
> block. It only means it does not alias with other accesses with that occur
> in the block where x2 is live. There is no access to A or x1 in that block,
> so we can say nothing about it.
>

It does. You can assume x2 is not aliased to A and still get well-defined
semantics, precisely because A is not referenced in the scope of x2. That
refinement would only get you into trouble if A is referenced in the scope
of x2, which would trigger UB.

Going further, logically the intrinsic should return a pointer to a new
object, disjoint from all other live objects. It is not aliased to A, and
is well defined even if it contains &A because A is not referenced in the
scope. This does require dataflow barriers on entrance/exits to the scope,
but those can be made no worse than the original code.

Aliasing x2 to A is not only unnecessary, but also pessimistic because in
general you do not have access to the dynamic scope of the restricted
pointer.


>   T A, B;
>   T * x1 = .... // either &A or &B
>   T * y2 =​ .... // ​​maybe &A
>   {
>     T * restrict x2 = y2;
> ​    *​x1 = ...
> ​    *​x2 = ...
>   }
>
> >
> > In this case you'll be able to tell *x1 doesn't alias​ *x2, right?
>
> In this case, yes, we can conclude that x1 and x2 don't alias (because *x1
> and *x2 cannot both legally refer to the same object).
>
> > How about if you add restrict to x1?
>
> The conclusion is the same, but if you add restrict to x1, you don't need
> it on x2. x2 is definitely not based on x1, so if x1 is restrict, then we
> know that x1 and x2 don't alias.
>

Agreed. So will your approach be able to catch both cases? It seemed to me
it wouldn't be able to catch the second one because it would have a
different scope, but probably I'm missing something.

Thanks for your patience,


> >
>
> --
> Hal Finkel
> Assistant Computational Scientist
> Leadership Computing Facility
> Argonne National Laboratory
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20141117/9bfe9d46/attachment.html>


More information about the llvm-dev mailing list