Other parts of this code treat noalias arguments as objects for
authorChris Lattner <sabre@nondot.org>
Mon, 16 Jun 2008 06:28:01 +0000 (06:28 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 16 Jun 2008 06:28:01 +0000 (06:28 +0000)
the purposes of escape analysis.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52302 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/BasicAliasAnalysis.cpp

index 6ab7d941ee30d2487696904b323dc556fbc2f4f8..8f7fcbf67a8ec2a22fcc17b9ef2730f6bd23f886 100644 (file)
@@ -320,11 +320,15 @@ static bool isKnownNonNull(const Value *V) {
 /// isNonEscapingLocalObject - Return true if the pointer is to a function-local
 /// object that never escapes from the function.
 static bool isNonEscapingLocalObject(const Value *V) {
-  // If this is a local allocation or byval argument, check to see if it
-  // escapes.
-  if (isa<AllocationInst>(V) ||
-      (isa<Argument>(V) && cast<Argument>(V)->hasByValAttr()))
+  // If this is a local allocation, check to see if it escapes.
+  if (isa<AllocationInst>(V))
     return !AddressMightEscape(V);
+      
+  // If this is an argument that corresponds to a byval or noalias argument,
+  // it can't escape either.
+  if (const Argument *A = dyn_cast<Argument>(V))
+    if (A->hasByValAttr() || A->hasNoAliasAttr())
+      return !AddressMightEscape(V);
   return false;
 }