Seriously strengthen the guarantee offered by noalias on a function's return

value. It must now be as if the pointer were allocated and has not escaped to
the caller. Thanks to Dan Gohman for pointing out the error in the original
and helping devise this definition.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@59940 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Nick Lewycky 2008-11-24 05:00:44 +00:00
parent 02ff308aa1
commit b2b32fd3fe
2 changed files with 6 additions and 6 deletions

View File

@ -892,9 +892,9 @@ declare signext i8 @returns_signed_char()
<dt><tt>noalias</tt></dt>
<dd>This indicates that the pointer does not alias any global or any other
parameter. The caller is responsible for ensuring that this is the
case. Additionally, on a function return value <tt>noalias</tt> indicates
that the pointer does not alias the return value from other calls of
itself or other noalias functions.</dd>
case. On a function return value, <tt>noalias</tt> additionally indicates
that the pointer does not alias any other pointers visible to the
caller.</dd>
<dt><tt>nest</tt></dt>
<dd>This indicates that the pointer parameter can be excised using the

View File

@ -383,9 +383,9 @@ BasicAliasAnalysis::alias(const Value *V1, unsigned V1Size,
if (isIdentifiedObject(O1) && isIdentifiedObject(O2))
return NoAlias;
// Local allocations can't alias with arguments or noalias functions.
if ((isa<AllocationInst>(O1) && (isa<Argument>(O2) || isNoAliasCall(O2))) ||
(isa<AllocationInst>(O2) && (isa<Argument>(O1) || isNoAliasCall(O1))))
// Arguments can't alias with local allocations or noalias calls.
if ((isa<Argument>(O1) && (isa<AllocationInst>(O2) || isNoAliasCall(O2))) ||
(isa<Argument>(O2) && (isa<AllocationInst>(O1) || isNoAliasCall(O1))))
return NoAlias;
// Most objects can't alias null.