mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-12 03:32:10 +00:00
Inline both direct and indirect callees in the CBU phase because
a direct callee may have indirect callees and so may have changed. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@13649 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c5204fb6f8
commit
052682f1c3
@ -37,14 +37,13 @@ bool CompleteBUDataStructures::run(Module &M) {
|
|||||||
GlobalsGraph = new DSGraph(BU.getGlobalsGraph());
|
GlobalsGraph = new DSGraph(BU.getGlobalsGraph());
|
||||||
GlobalsGraph->setPrintAuxCalls();
|
GlobalsGraph->setPrintAuxCalls();
|
||||||
|
|
||||||
// Our call graph is the same as the BU data structures call graph
|
|
||||||
ActualCallees = BU.getActualCallees();
|
|
||||||
|
|
||||||
#if 1 // REMOVE ME EVENTUALLY
|
#if 1 // REMOVE ME EVENTUALLY
|
||||||
// FIXME: TEMPORARY (remove once finalization of indirect call sites in the
|
// FIXME: TEMPORARY (remove once finalization of indirect call sites in the
|
||||||
// globals graph has been implemented in the BU pass)
|
// globals graph has been implemented in the BU pass)
|
||||||
TDDataStructures &TD = getAnalysis<TDDataStructures>();
|
TDDataStructures &TD = getAnalysis<TDDataStructures>();
|
||||||
|
|
||||||
|
ActualCallees.clear();
|
||||||
|
|
||||||
// The call graph extractable from the TD pass is _much more complete_ and
|
// The call graph extractable from the TD pass is _much more complete_ and
|
||||||
// trustable than that generated by the BU pass so far. Until this is fixed,
|
// trustable than that generated by the BU pass so far. Until this is fixed,
|
||||||
// we hack it like this:
|
// we hack it like this:
|
||||||
@ -53,17 +52,23 @@ bool CompleteBUDataStructures::run(Module &M) {
|
|||||||
const std::vector<DSCallSite> &CSs = TD.getDSGraph(*MI).getFunctionCalls();
|
const std::vector<DSCallSite> &CSs = TD.getDSGraph(*MI).getFunctionCalls();
|
||||||
|
|
||||||
for (unsigned CSi = 0, e = CSs.size(); CSi != e; ++CSi) {
|
for (unsigned CSi = 0, e = CSs.size(); CSi != e; ++CSi) {
|
||||||
if (CSs[CSi].isIndirectCall()) {
|
|
||||||
Instruction *TheCall = CSs[CSi].getCallSite().getInstruction();
|
Instruction *TheCall = CSs[CSi].getCallSite().getInstruction();
|
||||||
|
|
||||||
|
if (CSs[CSi].isIndirectCall()) { // indirect call: insert all callees
|
||||||
const std::vector<GlobalValue*> &Callees =
|
const std::vector<GlobalValue*> &Callees =
|
||||||
CSs[CSi].getCalleeNode()->getGlobals();
|
CSs[CSi].getCalleeNode()->getGlobals();
|
||||||
for (unsigned i = 0, e = Callees.size(); i != e; ++i)
|
for (unsigned i = 0, e = Callees.size(); i != e; ++i)
|
||||||
if (Function *F = dyn_cast<Function>(Callees[i]))
|
if (Function *F = dyn_cast<Function>(Callees[i]))
|
||||||
ActualCallees.insert(std::make_pair(TheCall, F));
|
ActualCallees.insert(std::make_pair(TheCall, F));
|
||||||
|
} else { // direct call: insert the single callee directly
|
||||||
|
ActualCallees.insert(std::make_pair(TheCall,
|
||||||
|
CSs[CSi].getCalleeFunc()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
// Our call graph is the same as the BU data structures call graph
|
||||||
|
ActualCallees = BU.getActualCallees();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
std::vector<DSGraph*> Stack;
|
std::vector<DSGraph*> Stack;
|
||||||
@ -183,14 +188,10 @@ void CompleteBUDataStructures::processGraph(DSGraph &G) {
|
|||||||
"Call instruction occurs multiple times in graph??");
|
"Call instruction occurs multiple times in graph??");
|
||||||
|
|
||||||
|
|
||||||
// The Normal BU pass will have taken care of direct calls well already,
|
// Loop over all of the potentially called functions...
|
||||||
// don't worry about them.
|
// Inline direct calls as well as indirect calls because the direct
|
||||||
|
// callee may have indirect callees and so may have changed.
|
||||||
// FIXME: if a direct callee had indirect callees, it seems like they could
|
//
|
||||||
// be updated and we would have to reinline even direct calls!
|
|
||||||
|
|
||||||
if (!CS.getCallSite().getCalledFunction()) {
|
|
||||||
// Loop over all of the actually called functions...
|
|
||||||
ActualCalleesTy::iterator I, E;
|
ActualCalleesTy::iterator I, E;
|
||||||
tie(I, E) = ActualCallees.equal_range(TheCall);
|
tie(I, E) = ActualCallees.equal_range(TheCall);
|
||||||
unsigned TNum = 0, Num = std::distance(I, E);
|
unsigned TNum = 0, Num = std::distance(I, E);
|
||||||
@ -214,7 +215,6 @@ void CompleteBUDataStructures::processGraph(DSGraph &G) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Recompute the Incomplete markers
|
// Recompute the Incomplete markers
|
||||||
assert(G.getInlinedGlobals().empty());
|
assert(G.getInlinedGlobals().empty());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user