Teach getModRefInfo that memcpy, memmove, and memset don't "capture" memory addresses.
authorOwen Anderson <resistor@mac.com>
Sun, 17 Feb 2008 21:29:08 +0000 (21:29 +0000)
committerOwen Anderson <resistor@mac.com>
Sun, 17 Feb 2008 21:29:08 +0000 (21:29 +0000)
Also, noalias arguments are be considered "like" stack allocated ones for this purpose, because
the only way they can be modref'ed is if they escape somewhere in the current function.

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

lib/Analysis/BasicAliasAnalysis.cpp

index be8fe07f2c97c245c5c8a79ab6b6e7f671d62477..430e74a98bfaa8585572bd7ffe1b91c19d5eb895 100644 (file)
@@ -21,7 +21,7 @@
 #include "llvm/ParameterAttributes.h"
 #include "llvm/GlobalVariable.h"
 #include "llvm/Instructions.h"
-#include "llvm/Intrinsics.h"
+#include "llvm/IntrinsicInst.h"
 #include "llvm/Pass.h"
 #include "llvm/Target/TargetData.h"
 #include "llvm/ADT/SmallVector.h"
@@ -228,6 +228,13 @@ static bool AddressMightEscape(const Value *V) {
       // If returned, the address will escape to calling functions, but no
       // callees could modify it.
       break; // next use
+    case Instruction::Call:
+      // If the call is to a few known safe intrinsics, we know that it does
+      // not escape
+      if (isa<MemIntrinsic>(I))
+        return false;
+      else
+        return true;
     default:
       return true;
     }
@@ -247,8 +254,11 @@ BasicAliasAnalysis::getModRefInfo(CallSite CS, Value *P, unsigned Size) {
     // Allocations and byval arguments are "new" objects.
     if (Object &&
         (isa<AllocationInst>(Object) ||
-         (isa<Argument>(Object) && cast<Argument>(Object)->hasByValAttr()))) {
-      // Okay, the pointer is to a stack allocated object.  If we can prove that
+         (isa<Argument>(Object) &&
+                                 (cast<Argument>(Object)->hasByValAttr() ||
+                                  cast<Argument>(Object)->hasNoAliasAttr())))) {
+      // Okay, the pointer is to a stack allocated (or effectively so, for 
+      // for noalias parameters) object.  If we can prove that
       // the pointer never "escapes", then we know the call cannot clobber it,
       // because it simply can't get its address.
       if (!AddressMightEscape(Object))