diff options
| author | Devang Patel <dpatel@apple.com> | 2006-09-22 01:05:33 +0000 |
|---|---|---|
| committer | Devang Patel <dpatel@apple.com> | 2006-09-22 01:05:33 +0000 |
| commit | 0c4e730c9cc800fc96a4a9555e847c630fc18e28 (patch) | |
| tree | 74fb30616fef1ad1242e5c01ec3d25797025c4cf /llvm/lib/VMCore/Dominators.cpp | |
| parent | 7d3fd4f888eccb65dd260e7840ce85d78ebf9370 (diff) | |
| download | bcm5719-llvm-0c4e730c9cc800fc96a4a9555e847c630fc18e28.tar.gz bcm5719-llvm-0c4e730c9cc800fc96a4a9555e847c630fc18e28.zip | |
Use iterative algorith to assign DFS number. This reduces
call stack depth.
llvm-svn: 30575
Diffstat (limited to 'llvm/lib/VMCore/Dominators.cpp')
| -rw-r--r-- | llvm/lib/VMCore/Dominators.cpp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/llvm/lib/VMCore/Dominators.cpp b/llvm/lib/VMCore/Dominators.cpp index 9f7e5d9365d..940653d1ec2 100644 --- a/llvm/lib/VMCore/Dominators.cpp +++ b/llvm/lib/VMCore/Dominators.cpp @@ -809,6 +809,53 @@ ETNode *ETNode::NCA(ETNode *other) { return occmin->OccFor; } +void ETNode::assignDFSNumber(int num) { + std::vector<ETNode *> workStack; + std::set<ETNode *> visitedNodes; + + workStack.push_back(this); + visitedNodes.insert(this); + this->DFSNumIn = num++; + + while (!workStack.empty()) { + ETNode *Node = workStack.back(); + + // If this is leaf node then set DFSNumOut and pop the stack + if (!Node->Son) { + Node->DFSNumOut = num++; + workStack.pop_back(); + continue; + } + + ETNode *son = Node->Son; + + // Visit Node->Son first + if (visitedNodes.count(son) == 0) { + son->DFSNumIn = num++; + workStack.push_back(son); + visitedNodes.insert(son); + continue; + } + + bool visitChild = false; + // Visit remaining children + for (ETNode *s = son->Right; s != son && !visitChild; s = s->Right) { + if (visitedNodes.count(s) == 0) { + visitChild = true; + s->DFSNumIn = num++; + workStack.push_back(s); + visitedNodes.insert(s); + } + } + + if (!visitChild) { + // If we reach here means all children are visited + Node->DFSNumOut = num++; + workStack.pop_back(); + } + } +} + //===----------------------------------------------------------------------===// // ETForest implementation //===----------------------------------------------------------------------===// |

