diff options
author | Chris Lattner <sabre@nondot.org> | 2005-03-24 03:04:50 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2005-03-24 03:04:50 +0000 |
commit | f0d919ece96c9cae1e6bdb7d6f7d2bd5a74908f7 (patch) | |
tree | 1cb15e042c39f4289b07a3acbf4b9a32b7722303 /llvm/lib/Analysis/DataStructure/DataStructureAA.cpp | |
parent | aff85ac552447aa8f95b3794e26b0207ee45ddff (diff) | |
download | llvm-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.cpp | 26 |
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(); |