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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7606 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Sumant Kowshik 2003-08-05 17:04:41 +00:00
parent f67e7fc7b1
commit 108421a8e5

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