[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