mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-11 13:44:28 +00:00
Add new method for computing node mappings. This is used by the pool allocator
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@9880 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
3b120be94f
commit
400433dfea
@ -1638,3 +1638,34 @@ void DSGraph::mergeInGlobalsGraph() {
|
||||
OldRetNodes.clear();
|
||||
removeTriviallyDeadNodes();
|
||||
}
|
||||
|
||||
/// computeNodeMapping - Given roots in two different DSGraphs, traverse the
|
||||
/// nodes reachable from the two graphs, computing the mapping of nodes from
|
||||
/// the first to the second graph.
|
||||
///
|
||||
void DSGraph::computeNodeMapping(const DSNodeHandle &NH1,
|
||||
const DSNodeHandle &NH2, NodeMapTy &NodeMap) {
|
||||
DSNode *N1 = NH1.getNode(), *N2 = NH2.getNode();
|
||||
if (N1 == 0 || N2 == 0) return;
|
||||
|
||||
DSNodeHandle &Entry = NodeMap[N1];
|
||||
if (Entry.getNode()) {
|
||||
// Termination of recursion!
|
||||
assert(Entry.getNode() == N2 &&
|
||||
Entry.getOffset() == (NH1.getOffset()+NH2.getOffset()) &&
|
||||
"Inconsistent mapping detected!");
|
||||
return;
|
||||
}
|
||||
|
||||
Entry.setNode(N2);
|
||||
Entry.setOffset(NH1.getOffset()+NH2.getOffset());
|
||||
|
||||
// Loop over all of the fields that N1 and N2 have in common, recursively
|
||||
// mapping the edges together now.
|
||||
int N2Idx = NH2.getOffset()-NH1.getOffset();
|
||||
unsigned N2Size = N2->getSize();
|
||||
for (unsigned i = 0, e = N1->getSize(); i < e; i += DS::PointerSize)
|
||||
if (unsigned(N2Idx)+i < N2Size)
|
||||
computeNodeMapping(N1->getLink(i), N2->getLink(N2Idx+i), NodeMap);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user