Added function mergeInGlobalsGraph which merges in the entire globals graph with the graph of a function

llvm-svn: 7606
This commit is contained in:
Sumant Kowshik 2003-08-05 17:04:41 +00:00
parent 0383a65103
commit 1d869b78f5
1 changed files with 29 additions and 0 deletions

View 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();
}