Seriously strengthen the guarantee offered by noalias on a function's return
authorNick Lewycky <nicholas@mxc.ca>
Mon, 24 Nov 2008 05:00:44 +0000 (05:00 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Mon, 24 Nov 2008 05:00:44 +0000 (05:00 +0000)
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

docs/LangRef.html
lib/Analysis/BasicAliasAnalysis.cpp

index bc3b40b460ea28210d6e1f7c98e377e4bd23717d..b469022b7620384f2cfd2294d860359f82628726 100644 (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
index e9c6490ebb75d6c25c058523b1b916fb8a491b77..5b65fb1199c38bea1fbb3cbb5c51fdc3cd6c2ca4 100644 (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.