mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-20 11:29:24 +00:00
Actually update the call graph as the inliner changes it. This allows us to
execute other CallGraphSCCPasses after the inliner without crashing. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12861 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b81c021f14
commit
ce1a3a292d
@ -94,6 +94,20 @@ bool Inliner::runOnSCC(const std::vector<CallGraphNode*> &SCC) {
|
||||
if (InlineFunction(CS)) {
|
||||
++NumInlined;
|
||||
|
||||
// Update the call graph by deleting the edge from Callee to Caller
|
||||
CallGraphNode *CalleeNode = CG[Callee];
|
||||
CallGraphNode *CallerNode = CG[Caller];
|
||||
CallerNode->removeCallEdgeTo(CalleeNode);
|
||||
|
||||
// Since we inlined all uninlinable call sites in the callee into the
|
||||
// caller, add edges from the caller to all of the callees of the
|
||||
// callee.
|
||||
for (CallGraphNode::iterator I = CalleeNode->begin(),
|
||||
E = CalleeNode->end(); I != E; ++I)
|
||||
CallerNode->addCalledFunction(*I);
|
||||
|
||||
// If the only remaining use of the function is a dead constant
|
||||
// pointer ref, remove it.
|
||||
if (Callee->hasOneUse())
|
||||
if (ConstantPointerRef *CPR =
|
||||
dyn_cast<ConstantPointerRef>(Callee->use_back()))
|
||||
@ -110,7 +124,12 @@ bool Inliner::runOnSCC(const std::vector<CallGraphNode*> &SCC) {
|
||||
if (I != SCCFunctions.end()) // Remove function from this SCC.
|
||||
SCCFunctions.erase(I);
|
||||
|
||||
Callee->getParent()->getFunctionList().erase(Callee);
|
||||
// Remove any call graph edges from the callee to its callees.
|
||||
while (CalleeNode->begin() != CalleeNode->end())
|
||||
CalleeNode->removeCallEdgeTo(*(CalleeNode->end()-1));
|
||||
|
||||
// Removing the node for callee from the call graph and delete it.
|
||||
delete CG.removeFunctionFromModule(CalleeNode);
|
||||
++NumDeleted;
|
||||
}
|
||||
Changed = true;
|
||||
|
Loading…
Reference in New Issue
Block a user