Correctly handle new SCC's found as a result of merging EQ graphs do to
authorChris Lattner <sabre@nondot.org>
Tue, 2 Nov 2004 19:29:59 +0000 (19:29 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 2 Nov 2004 19:29:59 +0000 (19:29 +0000)
function pointer equivalences.  This fixes many problems, including a testcase
reduced Prolangs-C++/objects.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@17437 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/DataStructure/EquivClassGraphs.cpp

index 43cd46198bd1c262602afc55cead3732b6478266..6a2c29836bc1c0b6ba9518c5aabc471a6dffe735 100644 (file)
@@ -306,19 +306,32 @@ processSCC(DSGraph &FG, std::vector<DSGraph*> &Stack, unsigned &NextID,
     return Min;         // This is part of a larger SCC!
 
   // If this is a new SCC, process it now.
-  bool IsMultiNodeSCC = false;
+  bool MergedGraphs = false;
   while (Stack.back() != &FG) {
     DSGraph *NG = Stack.back();
     ValMap[NG] = ~0U;
 
-    // Since all SCCs must be the same as those found in CBU, we do not need to
-    // do any merging.  Make sure all functions in the SCC share the same graph.
-    assert(NG == &FG && "ECG discovered different SCC's than the CBU pass?");
+    // If the SCC found is not the same as those found in CBU, make sure to
+    // merge the graphs as appropriate.
+    DSGraph::NodeMapTy NodeMap;
+    FG.cloneInto(*NG, FG.getScalarMap(), FG.getReturnNodes(), NodeMap);
+
+    // Update the DSInfo map and delete the old graph...
+    for (DSGraph::ReturnNodesTy::iterator I = NG->getReturnNodes().begin();
+         I != NG->getReturnNodes().end(); ++I)
+      DSInfo[I->first] = &FG;
     
+    // Remove NG from the ValMap since the pointer may get recycled.
+    ValMap.erase(NG);
+    delete NG;
+    MergedGraphs = true;
     Stack.pop_back();
-    IsMultiNodeSCC = true;
   }
 
+  // Clean up the graph before we start inlining a bunch again.
+  if (MergedGraphs)
+    FG.removeTriviallyDeadNodes();
+
   Stack.pop_back();
 
   processGraph(FG);