diff options
author | Devang Patel <dpatel@apple.com> | 2007-06-12 00:14:41 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2007-06-12 00:14:41 +0000 |
commit | 88ea2dbc68a775ae5cc876f4286969974bb44286 (patch) | |
tree | c3fb9c8f6220fa4bc7384194c05f939655d6ec2e /llvm/lib/VMCore/Dominators.cpp | |
parent | 78b9c68164070c2640a323dfdec8b066f7779d2b (diff) | |
download | bcm5719-llvm-88ea2dbc68a775ae5cc876f4286969974bb44286.tar.gz bcm5719-llvm-88ea2dbc68a775ae5cc876f4286969974bb44286.zip |
Maintain DFS number in DomTreeNode itself.
This means now ETNodes are not useful anymore.
llvm-svn: 37546
Diffstat (limited to 'llvm/lib/VMCore/Dominators.cpp')
-rw-r--r-- | llvm/lib/VMCore/Dominators.cpp | 40 |
1 files changed, 37 insertions, 3 deletions
diff --git a/llvm/lib/VMCore/Dominators.cpp b/llvm/lib/VMCore/Dominators.cpp index 8b2c1a45e22..225d8d200ae 100644 --- a/llvm/lib/VMCore/Dominators.cpp +++ b/llvm/lib/VMCore/Dominators.cpp @@ -319,9 +319,11 @@ void DominatorTreeBase::updateDFSNumbers() BasicBlock *BB = *I; DomTreeNode *BBNode = getNode(BB); if (BBNode) { - ETNode *ETN = BBNode->getETNode(); - if (ETN && !ETN->hasFather()) - ETN->assignDFSNumber(dfsnum); + if (!BBNode->getIDom()) + BBNode->assignDFSNumber(dfsnum); + //ETNode *ETN = BBNode->getETNode(); + //if (ETN && !ETN->hasFather()) + // ETN->assignDFSNumber(dfsnum); } } SlowQueries = 0; @@ -414,6 +416,38 @@ BasicBlock *DominatorTreeBase::findNearestCommonDominator(BasicBlock *A, BasicBl return NULL; } +/// assignDFSNumber - Assign In and Out numbers while walking dominator tree +/// in dfs order. +void DomTreeNode::assignDFSNumber(int num) { + std::vector<DomTreeNode *> workStack; + std::set<DomTreeNode *> visitedNodes; + + workStack.push_back(this); + visitedNodes.insert(this); + this->DFSNumIn = num++; + + while (!workStack.empty()) { + DomTreeNode *Node = workStack.back(); + + bool visitChild = false; + for (std::vector<DomTreeNode*>::iterator DI = Node->begin(), + E = Node->end(); DI != E && !visitChild; ++DI) { + DomTreeNode *Child = *DI; + if (visitedNodes.count(Child) == 0) { + visitChild = true; + Child->DFSNumIn = num++; + workStack.push_back(Child); + visitedNodes.insert(Child); + } + } + if (!visitChild) { + // If we reach here means all children are visited + Node->DFSNumOut = num++; + workStack.pop_back(); + } + } +} + void DomTreeNode::setIDom(DomTreeNode *NewIDom) { assert(IDom && "No immediate dominator?"); if (IDom != NewIDom) { |