mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-21 06:30:16 +00:00
teach ds-aa about mod/ref for external function calls.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@20801 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
62da315c85
commit
7d671b88e8
@ -178,9 +178,33 @@ DSAA::getModRefInfo(CallSite CS, Value *P, unsigned Size) {
|
|||||||
AliasAnalysis::ModRefResult Result =AliasAnalysis::getModRefInfo(CS, P, Size);
|
AliasAnalysis::ModRefResult Result =AliasAnalysis::getModRefInfo(CS, P, Size);
|
||||||
Function *F = CS.getCalledFunction();
|
Function *F = CS.getCalledFunction();
|
||||||
|
|
||||||
if (!F || F->isExternal() || Result == NoModRef)
|
if (!F || Result == NoModRef)
|
||||||
return Result;
|
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
|
// 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!
|
// for the callee because we don't want all caller's effects incorporated!
|
||||||
const Function *Caller = CS.getInstruction()->getParent()->getParent();
|
const Function *Caller = CS.getInstruction()->getParent()->getParent();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user