mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-28 19:31:58 +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
@ -93,7 +93,21 @@ bool Inliner::runOnSCC(const std::vector<CallGraphNode*> &SCC) {
|
|||||||
// Attempt to inline the function...
|
// Attempt to inline the function...
|
||||||
if (InlineFunction(CS)) {
|
if (InlineFunction(CS)) {
|
||||||
++NumInlined;
|
++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 (Callee->hasOneUse())
|
||||||
if (ConstantPointerRef *CPR =
|
if (ConstantPointerRef *CPR =
|
||||||
dyn_cast<ConstantPointerRef>(Callee->use_back()))
|
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.
|
if (I != SCCFunctions.end()) // Remove function from this SCC.
|
||||||
SCCFunctions.erase(I);
|
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;
|
++NumDeleted;
|
||||||
}
|
}
|
||||||
Changed = true;
|
Changed = true;
|
||||||
|
Loading…
Reference in New Issue
Block a user