aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/DataStructure/DataStructureAA.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2005-03-24 03:04:50 +0000
committerChris Lattner <sabre@nondot.org>2005-03-24 03:04:50 +0000
commitf0d919ece96c9cae1e6bdb7d6f7d2bd5a74908f7 (patch)
tree1cb15e042c39f4289b07a3acbf4b9a32b7722303 /llvm/lib/Analysis/DataStructure/DataStructureAA.cpp
parentaff85ac552447aa8f95b3794e26b0207ee45ddff (diff)
downloadllvm-f0d919ece96c9cae1e6bdb7d6f7d2bd5a74908f7.zip
llvm-f0d919ece96c9cae1e6bdb7d6f7d2bd5a74908f7.tar.gz
llvm-f0d919ece96c9cae1e6bdb7d6f7d2bd5a74908f7.tar.bz2
teach ds-aa about mod/ref for external function calls.
llvm-svn: 20801
Diffstat (limited to 'llvm/lib/Analysis/DataStructure/DataStructureAA.cpp')
-rw-r--r--llvm/lib/Analysis/DataStructure/DataStructureAA.cpp26
1 files changed, 25 insertions, 1 deletions
diff --git a/llvm/lib/Analysis/DataStructure/DataStructureAA.cpp b/llvm/lib/Analysis/DataStructure/DataStructureAA.cpp
index 65bdc6e..6f1cb56 100644
--- a/llvm/lib/Analysis/DataStructure/DataStructureAA.cpp
+++ b/llvm/lib/Analysis/DataStructure/DataStructureAA.cpp
@@ -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();