teach ds-aa about mod/ref for external function calls.
authorChris Lattner <sabre@nondot.org>
Thu, 24 Mar 2005 03:04:50 +0000 (03:04 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 24 Mar 2005 03:04:50 +0000 (03:04 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@20801 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/DataStructure/DataStructureAA.cpp

index 65bdc6e2f2cc9b361a4c08ae0b0bdc75ba41c184..6f1cb56d860b3d2683338e1306ba3e0166a86172 100644 (file)
@@ -178,9 +178,33 @@ DSAA::getModRefInfo(CallSite CS, Value *P, unsigned Size) {
   AliasAnalysis::ModRefResult Result =AliasAnalysis::getModRefInfo(CS, P, Size);
   Function *F = CS.getCalledFunction();
 
-  if (!F || F->isExternal() || Result == NoModRef)
+  if (!F || Result == NoModRef)
     return Result;
 
+  if (F->isExternal()) {
+    // If we are calling an external function, and if this global doesn't escape
+    // the portion of the program we have analyzed, we can draw conclusions
+    // based on whether the global escapes the program.
+    Function *Caller = CS.getInstruction()->getParent()->getParent();
+    DSGraph *G = &TD->getDSGraph(*Caller);
+    DSScalarMap::iterator NI = G->getScalarMap().find(P);
+    if (NI == G->getScalarMap().end()) {
+      // If it wasn't in the local function graph, check the global graph.  This
+      // can occur for globals who are locally reference but hoisted out to the
+      // globals graph despite that.
+      G = G->getGlobalsGraph();
+      NI = G->getScalarMap().find(P);
+      if (NI == G->getScalarMap().end())
+        return Result;
+    }
+
+    // If we found a node and it's complete, it cannot be passed out to the
+    // called function.
+    if (NI->second.getNode()->isComplete())
+      return NoModRef;
+    return Result;
+  }
+
   // Get the graphs for the callee and caller.  Note that we want the BU graph
   // for the callee because we don't want all caller's effects incorporated!
   const Function *Caller = CS.getInstruction()->getParent()->getParent();