Fix PR324 and testcase: Inline/2004-04-20-InlineLinkOnce.llx
authorChris Lattner <sabre@nondot.org>
Tue, 20 Apr 2004 20:20:59 +0000 (20:20 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 20 Apr 2004 20:20:59 +0000 (20:20 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@13080 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/IPO/Inliner.cpp

index 8633a7e950ff7ecf840f3e113f0243d138b994a4..0684c28697e41645915aed1df9b832d70c4f4d6a 100644 (file)
@@ -120,14 +120,18 @@ bool Inliner::runOnSCC(const std::vector<CallGraphNode*> &SCC) {
               (Callee->hasInternalLinkage() || Callee->hasLinkOnceLinkage())) {
             DEBUG(std::cerr << "    -> Deleting dead function: "
                             << Callee->getName() << "\n");
-            std::set<Function*>::iterator I = SCCFunctions.find(Callee);
-            if (I != SCCFunctions.end())    // Remove function from this SCC.
-              SCCFunctions.erase(I);
+            SCCFunctions.erase(Callee);    // Remove function from this SCC.
 
             // Remove any call graph edges from the callee to its callees.
             while (CalleeNode->begin() != CalleeNode->end())
               CalleeNode->removeCallEdgeTo(*(CalleeNode->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 (!Callee->hasInternalLinkage())
+              CG.getExternalCallingNode()->removeCallEdgeTo(CalleeNode);
+
             // Removing the node for callee from the call graph and delete it.
             delete CG.removeFunctionFromModule(CalleeNode);
             ++NumDeleted;