<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">On Jul 1, 2010, at 2:29 PM, Dan Gohman wrote:<div><blockquote type="cite"><blockquote type="cite"></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">"noalias" is only meaningful from a single-procedure perspective.<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">For example:<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">@G = external global i32<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">define void @foo(i32* noalias %p) {<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">...<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">}<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">...<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">call void @foo(i32* @G)</blockquote></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><blockquote type="cite">If you're working exclusively within the body of @foo, then alias(@G, %p)<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite">can be NoAlias. From an interprocedural perspective, it can be MustAlias.<br></blockquote></blockquote><blockquote type="cite"><blockquote type="cite"><br></blockquote></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite">I don't buy this at all.  The current interface to AA (even for interprocedural clients) is context insensitive.  If you want a path or context-sensitive query interface, you'd need a substantially richer and more complex (aka slower) interface.  DSA provides this sort of interface for example.<br></blockquote><br>You're right, I was mistaken about recursive functions; that's a class of<br>cases which are a lot more complicated and do bring in context sensitivity<br>concerns. I've removed these considerations in r107420.<br></blockquote><div><br></div><div>Thanks.  I'm still confused about why we need a separate pass for IPA basicaa...</div><br><blockquote type="cite">However, beyond classic path and context scoping, there's another sense of<br>scope that an alias query can have, the scope of a noalias keyword. noalias<br>on an argument indicates that argument's relationship with other pointers<br>within that function, but it isn't meaningful when considering pointers<br>from an interprocedural perspective. An example of this is this is the first<br>example I gave above, with alias(@G, %p).<br></blockquote><br><div>I don't understand this.  The interface provided by AliasAnalysis (which is independent of whether the implementation uses IP information or not) assumes the client is a) asking about relations between globals, or b) is in the context of a function.</div><div><br></div><div>In the first example above, alias(@G, %p) is false whether the implementation is single or interprocedural.  Because the client is asking about "p", the query is implicitly scoped to the body of the function.</div></div><div><br></div><div>The AliasAnalysis *interface* has this implicit scoping.  The treatment of noalias *cannot* be semantically different between two different implementations of AliasAnalysis, because the clients haven't changed.  The contract of the AliasAnalysis interface is fixed.</div><div><br></div><div>That said, I completely believe that it would be invalid for an interprocedural client to infer properties in a caller of a function with no-alias based on the no-alias properties in the callee.  This is separate from reporting on queries scoped to the callee though.</div><div><br></div><div>-Chris</div></body></html>