[llvm-commits] CVS: llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp

Chris Lattner lattner at cs.uiuc.edu
Sat Jan 31 15:03:01 PST 2004


Changes in directory llvm/lib/Analysis/DataStructure:

BottomUpClosure.cpp updated: 1.72 -> 1.73

---
Log message:

Avoid referencing deleted DSgraphs when merging an SCC into a larger SCC.  This
fixes the crash in 176.gcc.



---
Diffs of the changes:  (+11 -9)

Index: llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp
diff -u llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp:1.72 llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp:1.73
--- llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp:1.72	Tue Jan 27 15:50:41 2004
+++ llvm/lib/Analysis/DataStructure/BottomUpClosure.cpp	Sat Jan 31 15:02:18 2004
@@ -152,7 +152,7 @@
   } else {
     // SCCFunctions - Keep track of the functions in the current SCC
     //
-    hash_set<Function*> SCCFunctions;
+    hash_set<DSGraph*> SCCGraphs;
 
     Function *NF;
     std::vector<Function*>::iterator FirstInSCC = Stack.end();
@@ -160,36 +160,38 @@
     do {
       NF = *--FirstInSCC;
       ValMap[NF] = ~0U;
-      SCCFunctions.insert(NF);
 
       // Figure out which graph is the largest one, in order to speed things up
       // a bit in situations where functions in the SCC have widely different
       // graph sizes.
       DSGraph &NFGraph = getDSGraph(*NF);
+      SCCGraphs.insert(&NFGraph);
       if (!SCCGraph || SCCGraph->getGraphSize() < NFGraph.getGraphSize())
         SCCGraph = &NFGraph;
     } while (NF != F);
 
     std::cerr << "Calculating graph for SCC #: " << MyID << " of size: "
-              << SCCFunctions.size() << "\n";
+              << SCCGraphs.size() << "\n";
 
     // Compute the Max SCC Size...
-    if (MaxSCC < SCCFunctions.size())
-      MaxSCC = SCCFunctions.size();
+    if (MaxSCC < SCCGraphs.size())
+      MaxSCC = SCCGraphs.size();
 
     // First thing first, collapse all of the DSGraphs into a single graph for
     // the entire SCC.  We computed the largest graph, so clone all of the other
     // (smaller) graphs into it.  Discard all of the old graphs.
     //
-    for (hash_set<Function*>::iterator I = SCCFunctions.begin(),
-           E = SCCFunctions.end(); I != E; ++I) {
-      DSGraph &G = getDSGraph(**I);
+    for (hash_set<DSGraph*>::iterator I = SCCGraphs.begin(),
+           E = SCCGraphs.end(); I != E; ++I) {
+      DSGraph &G = **I;
       if (&G != SCCGraph) {
         DSGraph::NodeMapTy NodeMap;
         SCCGraph->cloneInto(G, SCCGraph->getScalarMap(),
                             SCCGraph->getReturnNodes(), NodeMap);
         // Update the DSInfo map and delete the old graph...
-        DSInfo[*I] = SCCGraph;
+        for (DSGraph::ReturnNodesTy::iterator I = G.getReturnNodes().begin(),
+               E = G.getReturnNodes().end(); I != E; ++I)
+          DSInfo[I->first] = SCCGraph;
         delete &G;
       }
     }





More information about the llvm-commits mailing list