Propagate debug loc info through prologue/epilogue.
[oota-llvm.git] / lib / Analysis / AliasAnalysis.cpp
index 369f2f4f90e1e3f30f8d9c22ce11a60ced048068..c5523ec4634d8e4a83aa33d4afcbb1cf91acf18a 100644 (file)
@@ -120,9 +120,18 @@ AliasAnalysis::getModRefBehavior(CallSite CS,
 AliasAnalysis::ModRefBehavior
 AliasAnalysis::getModRefBehavior(Function *F,
                                  std::vector<PointerAccessInfo> *Info) {
-  if (F && F->doesNotAccessMemory())
-    // Can't do better than this.
-    return DoesNotAccessMemory;
+  if (F) {
+    if (F->doesNotAccessMemory())
+      // Can't do better than this.
+      return DoesNotAccessMemory;
+    if (F->onlyReadsMemory())
+      return OnlyReadsMemory;
+    if (unsigned id = F->getIntrinsicID()) {
+#define GET_INTRINSIC_MODREF_BEHAVIOR
+#include "llvm/Intrinsics.gen"
+#undef GET_INTRINSIC_MODREF_BEHAVIOR
+    }
+  }
   return UnknownModRefBehavior;
 }
 
@@ -130,10 +139,10 @@ AliasAnalysis::ModRefResult
 AliasAnalysis::getModRefInfo(CallSite CS, Value *P, unsigned Size) {
   ModRefResult Mask = ModRef;
   ModRefBehavior MRB = getModRefBehavior(CS);
-  if (MRB == OnlyReadsMemory)
-    Mask = Ref;
-  else if (MRB == DoesNotAccessMemory)
+  if (MRB == DoesNotAccessMemory)
     return NoModRef;
+  else if (MRB == OnlyReadsMemory)
+    Mask = Ref;
   else if (MRB == AliasAnalysis::AccessesArguments) {
     bool doesAlias = false;
     for (CallSite::arg_iterator AI = CS.arg_begin(), AE = CS.arg_end();
@@ -142,7 +151,7 @@ AliasAnalysis::getModRefInfo(CallSite CS, Value *P, unsigned Size) {
         doesAlias = true;
         break;
       }
-    
+
     if (!doesAlias)
       return NoModRef;
   }