[llvm-commits] CVS: llvm/lib/Transforms/IPO/Inliner.cpp
Chris Lattner
lattner at cs.uiuc.edu
Sat Aug 7 20:30:00 PDT 2004
Changes in directory llvm/lib/Transforms/IPO:
Inliner.cpp updated: 1.20 -> 1.21
---
Log message:
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
---
Diffs of the changes: (+24 -24)
Index: llvm/lib/Transforms/IPO/Inliner.cpp
diff -u llvm/lib/Transforms/IPO/Inliner.cpp:1.20 llvm/lib/Transforms/IPO/Inliner.cpp:1.21
--- llvm/lib/Transforms/IPO/Inliner.cpp:1.20 Thu Jul 29 12:28:42 2004
+++ llvm/lib/Transforms/IPO/Inliner.cpp Sat Aug 7 22:29:50 2004
@@ -54,8 +54,8 @@
E = CalleeNode->end(); I != E; ++I)
CallerNode->addCalledFunction(*I);
- // If we inlined the last possible call site to the function,
- // delete the function body now.
+ // If we inlined the last possible call site to the function, delete the
+ // function body now.
if (Callee->use_empty() && Callee->hasInternalLinkage() &&
!SCCFunctions.count(Callee)) {
DEBUG(std::cerr << " -> Deleting dead function: "
@@ -64,7 +64,7 @@
// 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;
@@ -167,27 +167,27 @@
// from the program. Insert the dead ones in the FunctionsToRemove set.
for (CallGraph::iterator I = CG.begin(), E = CG.end(); I != E; ++I) {
CallGraphNode *CGN = I->second;
- Function *F = CGN ? CGN->getFunction() : 0;
-
- // If the only remaining users of the function are dead constants,
- // remove them.
- if (F) F->removeDeadConstantUsers();
-
- if (F && (F->hasLinkOnceLinkage() || F->hasInternalLinkage()) &&
- F->use_empty()) {
-
- // Remove any call graph edges from the function to its callees.
- while (CGN->begin() != CGN->end())
- 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);
+ 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 ((F->hasLinkOnceLinkage() || F->hasInternalLinkage()) &&
+ F->use_empty()) {
+ // Remove any call graph edges from the function to its callees.
+ while (CGN->begin() != CGN->end())
+ 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() || HadDeadConstantUsers)
+ CG.getExternalCallingNode()->removeCallEdgeTo(CGN);
+
+ // Removing the node for callee from the call graph and delete it.
+ FunctionsToRemove.insert(CGN);
+ }
}
}
More information about the llvm-commits
mailing list