Added function mergeInGlobalsGraph which merges in the entire globals graph with...
authorSumant Kowshik <kowshik@uiuc.edu>
Tue, 5 Aug 2003 17:04:41 +0000 (17:04 +0000)
committerSumant Kowshik <kowshik@uiuc.edu>
Tue, 5 Aug 2003 17:04:41 +0000 (17:04 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7606 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/DataStructure/DataStructure.cpp

index c25256a4fed7c4c0b68a2ddd57904534f2fca658..f930c0272ed1925a848304db976bdcc8df553d21 100644 (file)
@@ -1582,3 +1582,32 @@ void DSGraph::AssertGraphOK() const {
   AssertAuxCallNodesInGraph();
 }
 
+// A function useful for clients to incorporate the globals graph
+// into the DS, BU or TD graph for a function.  This code retains
+// all globals, i.e., does not delete unreachable globals after they
+// are inlined.
+//  
+void DSGraph::mergeInGlobalsGraph()
+{
+  NodeMapTy GlobalNodeMap;
+  ScalarMapTy OldValMap;
+  ReturnNodesTy OldRetNodes;
+  this->cloneInto(*GlobalsGraph, OldValMap, OldRetNodes, GlobalNodeMap,
+                  DSGraph::KeepAllocaBit | DSGraph::DontCloneCallNodes |
+                  DSGraph::DontCloneAuxCallNodes);
+  
+  // Now merge existing global nodes in the GlobalsGraph with their copies
+  for (ScalarMapTy::iterator I = ScalarMap.begin(), E = ScalarMap.end(); 
+       I != E; ++I)
+    if (isa<GlobalValue>(I->first)) {             // Found a global node
+      DSNodeHandle &GH = I->second;
+      DSNodeHandle &GGNodeH = GlobalsGraph->getScalarMap()[I->first];
+      GH.mergeWith(GlobalNodeMap[GGNodeH.getNode()]);
+    }
+  
+  // Merging leaves behind unused nodes: get rid of them now.
+  GlobalNodeMap.clear();
+  OldValMap.clear();
+  OldRetNodes.clear();
+  removeTriviallyDeadNodes();
+}