[PATCH] D101541: BasicAA: Recognize inttoptr as isEscapeSource
Joseph Tremoulet via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 30 08:40:09 PDT 2021
JosephTremoulet added a comment.
In D101541#2727752 <https://reviews.llvm.org/D101541#2727752>, @aqjune wrote:
> `isNonEscapingLocalObject` returns true if the pointer is a noalias argument, and it's worth clarifying why this is okay somewhere.
>
> The noalias argument case is slightly different from other cases because its address could have been ptrtoint-ed already. For example:
>
> %i = ptrtoint i8* %ptr0 to i64
> call void @f(i8* %ptr0, i64 %i)
>
> define void @f(i8* noalias %ptr, i64 %i) {
> ; access %ptr <- isNonEscapingLocalObject(%ptr) is true, but
> ; access inttoptr(%i) <- this can exactly touch %ptr.
> }
>
> It isn't clear whether the second access is successfully done according to the definition of based-on in LangRef.
> Should we clarify that noalias ptr (`%ptr`) is not based on the original pointer (`%ptr0`)?
By my read, it isn't that %ptr isn't based on %ptr0 (I think it is based on %ptr0, though the LangRef based-on definition doesn't explicitly address copies from call arguments/parameters/returns, phis, selects, extractelement/extractvalue, etc.; maybe it should?).
Rather, I think that it's this language in the definition of noalias:
> This indicates that memory locations accessed via pointer values
> :ref:`based <pointeraliasing>` on the argument or return value are not also
> accessed, during the execution of the function, via pointer values not
> *based* on the argument or return value. ... The caller shares the responsibility with the callee for
> ensuring that these requirements are met.
which means that the example you show is an incorrect use of the noalias attribute, because of the access via inttoptr(%i), which is not based on %ptr.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D101541/new/
https://reviews.llvm.org/D101541
More information about the llvm-commits
mailing list