Fix another really nasty regression that Anshu pointed out. In cases where
authorChris Lattner <sabre@nondot.org>
Sun, 8 Aug 2004 03:29:50 +0000 (03:29 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 8 Aug 2004 03:29:50 +0000 (03:29 +0000)
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

lib/Transforms/IPO/Inliner.cpp

index a9621410520b0581ca06fc4321969786c3f02f0f..f0cb03d7b17b8ff3df56fcd3623f5e8e444b9e84 100644 (file)
@@ -54,8 +54,8 @@ static bool InlineCallIfPossible(CallSite CS, CallGraph &CG,
          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 @@ static bool InlineCallIfPossible(CallSite CS, CallGraph &CG,
     // 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 @@ bool Inliner::doFinalization(CallGraph &CG) {
   // 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);
+      }
     }
   }