mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-16 12:24:03 +00:00
Fix another really nasty regression that Anshu pointed out. In cases where
dangling constant users were removed from a function, causing it to be dead, we never removed the call graph edge from the external node to the function. In most cases, this didn't cause a problem (by luck). This should definitely go into 1.3 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15570 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -54,8 +54,8 @@ static bool InlineCallIfPossible(CallSite CS, CallGraph &CG,
|
|||||||
E = CalleeNode->end(); I != E; ++I)
|
E = CalleeNode->end(); I != E; ++I)
|
||||||
CallerNode->addCalledFunction(*I);
|
CallerNode->addCalledFunction(*I);
|
||||||
|
|
||||||
// If we inlined the last possible call site to the function,
|
// If we inlined the last possible call site to the function, delete the
|
||||||
// delete the function body now.
|
// function body now.
|
||||||
if (Callee->use_empty() && Callee->hasInternalLinkage() &&
|
if (Callee->use_empty() && Callee->hasInternalLinkage() &&
|
||||||
!SCCFunctions.count(Callee)) {
|
!SCCFunctions.count(Callee)) {
|
||||||
DEBUG(std::cerr << " -> Deleting dead function: "
|
DEBUG(std::cerr << " -> Deleting dead function: "
|
||||||
@ -167,27 +167,27 @@ bool Inliner::doFinalization(CallGraph &CG) {
|
|||||||
// from the program. Insert the dead ones in the FunctionsToRemove set.
|
// from the program. Insert the dead ones in the FunctionsToRemove set.
|
||||||
for (CallGraph::iterator I = CG.begin(), E = CG.end(); I != E; ++I) {
|
for (CallGraph::iterator I = CG.begin(), E = CG.end(); I != E; ++I) {
|
||||||
CallGraphNode *CGN = I->second;
|
CallGraphNode *CGN = I->second;
|
||||||
Function *F = CGN ? CGN->getFunction() : 0;
|
if (Function *F = CGN ? CGN->getFunction() : 0) {
|
||||||
|
// If the only remaining users of the function are dead constants,
|
||||||
|
// remove them.
|
||||||
|
bool HadDeadConstantUsers = !F->use_empty();
|
||||||
|
F->removeDeadConstantUsers();
|
||||||
|
|
||||||
// If the only remaining users of the function are dead constants,
|
if ((F->hasLinkOnceLinkage() || F->hasInternalLinkage()) &&
|
||||||
// remove them.
|
F->use_empty()) {
|
||||||
if (F) F->removeDeadConstantUsers();
|
// Remove any call graph edges from the function to its callees.
|
||||||
|
while (CGN->begin() != CGN->end())
|
||||||
|
CGN->removeCallEdgeTo(*(CGN->end()-1));
|
||||||
|
|
||||||
if (F && (F->hasLinkOnceLinkage() || F->hasInternalLinkage()) &&
|
// If the function has external linkage (basically if it's a linkonce
|
||||||
F->use_empty()) {
|
// function) remove the edge from the external node to the callee
|
||||||
|
// node.
|
||||||
|
if (!F->hasInternalLinkage() || HadDeadConstantUsers)
|
||||||
|
CG.getExternalCallingNode()->removeCallEdgeTo(CGN);
|
||||||
|
|
||||||
// Remove any call graph edges from the function to its callees.
|
// Removing the node for callee from the call graph and delete it.
|
||||||
while (CGN->begin() != CGN->end())
|
FunctionsToRemove.insert(CGN);
|
||||||
CGN->removeCallEdgeTo(*(CGN->end()-1));
|
}
|
||||||
|
|
||||||
// If the function has external linkage (basically if it's a linkonce
|
|
||||||
// function) remove the edge from the external node to the callee
|
|
||||||
// node.
|
|
||||||
if (!F->hasInternalLinkage())
|
|
||||||
CG.getExternalCallingNode()->removeCallEdgeTo(CGN);
|
|
||||||
|
|
||||||
// Removing the node for callee from the call graph and delete it.
|
|
||||||
FunctionsToRemove.insert(CGN);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user