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. llvm-svn: 59940
This commit is contained in:
parent
a42ee44aab
commit
d59572cb22
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue