Thanks, Hal... Let me stay on the first question for now.<div><div><br></div><div>If we take your example and remove the first restrict:<div>  T A;</div><div>  T * y1 = ..., y2 = ...<br>  {<br>    T * x = &A;<br>    a = x[i];<br>  }<br>  {<br>    T * restrict x = y2;<br>    b = x[i];<br>  }<br><br>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? I believe from a language perspective you just need the bottom restrict to make the guarantee.</div><div><br></div><div><div class="gmail_quote">On Fri Nov 14 2014 at 9:48:42 AM Hal Finkel <<a href="mailto:hfinkel@anl.gov">hfinkel@anl.gov</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">----- Original Message -----<br>
> From: "Raul Silvera" <<a href="mailto:rsilvera@google.com" target="_blank">rsilvera@google.com</a>><br>
> To: "Hal Finkel" <<a href="mailto:hfinkel@anl.gov" target="_blank">hfinkel@anl.gov</a>><br>
> Cc: "Chandler Carruth" <<a href="mailto:chandlerc@google.com" target="_blank">chandlerc@google.com</a>>, "LLVM Developers Mailing List" <<a href="mailto:llvmdev@cs.uiuc.edu" target="_blank">llvmdev@cs.uiuc.edu</a>><br>
> Sent: Friday, November 14, 2014 10:34:39 AM<br>
> Subject: Re: [LLVMdev] Upcoming Changes/Additions to Scoped-NoAlias metadata<br>
><br>
><br>
><br>
> Hal, a couple of questions:<br>
><br>
><br>
> 1. Do you preserve alias to stores+loads derived through a different<br>
> @llvm.noalias call which has different scope metadata? Couldn't that<br>
> be treated similarly to S+Ls derived from other identified objects?<br>
<br>
>From a different scope? No. Here's why:<br>
<br>
  int i = ...;<br>
  T a, b;<br><br>
which becomes:<br>
<br>
  int i = ...;<br>
  T a, b;<br>
  T * y1 = ..., y2 = ...<br>
  T * x1 = @llvm.noalias(y1, !scope1);<br>
  a = x1[i]; // alias.scope !scope1<br>
  T * x2 = @llvm.noalias(y2, !scope2);<br>
  b = x2[i]; // alias.scope !scope2<br>
<br>
but can we assume that 'x1[i]' does not alias with 'x2[i]'? No.<br>
<br>
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.<br><br>
</blockquote></div></div></div></div>