GlobalsAA: Take advantage of ArgMemOnly, InaccessibleMemOnly and InaccessibleMemOrArg...
[oota-llvm.git] / lib / Analysis / GlobalsModRef.cpp
index 86c2e501465bbf257b23798ae57f87ee27e04431..51a83d5327719519d73aeca0d091a8c1b88f0528 100644 (file)
@@ -376,6 +376,15 @@ bool GlobalsAAResult::AnalyzeUsesOfPointer(Value *V,
         } else {
           return true; // Argument of an unknown call.
         }
+        // If the Callee is not ReadNone, it may read the global,
+        // and if it is not ReadOnly, it may also write to it.
+        Function *CalleeF = CS.getCalledFunction();
+        if (!CalleeF->doesNotAccessMemory()) {
+          if (Readers)
+            Readers->insert(CalleeF);
+          if (Writers && !CalleeF->onlyReadsMemory())
+            Writers->insert(CalleeF);
+        }
       }
     } else if (ICmpInst *ICI = dyn_cast<ICmpInst>(I)) {
       if (!isa<ConstantPointerNull>(ICI->getOperand(1)))
@@ -507,7 +516,7 @@ void GlobalsAAResult::AnalyzeCallGraph(CallGraph &CG, Module &M) {
 
       if (F->isDeclaration()) {
         // Try to get mod/ref behaviour from function attributes.
-        if (F->doesNotAccessMemory()) {
+        if (F->doesNotAccessMemory() || F->onlyAccessesInaccessibleMemory()) {
           // Can't do better than that!
         } else if (F->onlyReadsMemory()) {
           FI.addModRefInfo(MRI_Ref);
@@ -515,6 +524,12 @@ void GlobalsAAResult::AnalyzeCallGraph(CallGraph &CG, Module &M) {
             // This function might call back into the module and read a global -
             // consider every global as possibly being read by this function.
             FI.setMayReadAnyGlobal();
+        } else if (F->onlyAccessesArgMemory() || 
+                   F->onlyAccessesInaccessibleMemOrArgMem()) {
+          // This function may only access (read/write) memory pointed to by its
+          // arguments. If this pointer is to a global, this escaping use of the
+          // pointer is captured in AnalyzeUsesOfPointer().
+          FI.addModRefInfo(MRI_ModRef);
         } else {
           FI.addModRefInfo(MRI_ModRef);
           // Can't say anything useful unless it's an intrinsic - they don't