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:
Chris Lattner
2004-08-08 03:29:50 +00:00
parent af8a42445c
commit 54970c0328

View File

@ -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);
} }
} }