diff options
| author | Devang Patel <dpatel@apple.com> | 2006-09-14 01:27:42 +0000 |
|---|---|---|
| committer | Devang Patel <dpatel@apple.com> | 2006-09-14 01:27:42 +0000 |
| commit | 23d855b40dfdc83720e64cf99c0e1642dc276e3b (patch) | |
| tree | 20d6cf9ed9b657ba2a108d41faf9555f08fdc361 /llvm/lib/VMCore/Dominators.cpp | |
| parent | 1463377ddb07142fc1a9fb4dd01a3a9050ec023a (diff) | |
| download | bcm5719-llvm-23d855b40dfdc83720e64cf99c0e1642dc276e3b.tar.gz bcm5719-llvm-23d855b40dfdc83720e64cf99c0e1642dc276e3b.zip | |
Avoid recursion in assignDFSNumber(). Move def from ET-Forest.h
to Dominators.h
llvm-svn: 30309
Diffstat (limited to 'llvm/lib/VMCore/Dominators.cpp')
| -rw-r--r-- | llvm/lib/VMCore/Dominators.cpp | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/llvm/lib/VMCore/Dominators.cpp b/llvm/lib/VMCore/Dominators.cpp index 9f7e5d9365d..fd193b8d7aa 100644 --- a/llvm/lib/VMCore/Dominators.cpp +++ b/llvm/lib/VMCore/Dominators.cpp @@ -890,6 +890,39 @@ void ETForest::calculate(const ImmediateDominators &ID) { updateDFSNumbers (); } +// Walk ETNode and its children using DFS algorithm and assign +// DFSNumIn and DFSNumOut numbers for each node. +void ETNode::assignDFSNumber(int &num) { + + std::vector<ETNode *> DFSInStack; + std::set<ETNode *> visited; + + DFSInStack.push_back(this); + + visited.insert(this); + + while(!DFSInStack.empty()) { + ETNode *Parent = DFSInStack.back(); + DFSInStack.pop_back(); + Parent->DFSNumIn = num++; + Parent->DFSNumOut = Parent->DFSNumIn + 1; + + ETNode *son = Parent->Son; + if (son && visited.count(son) == 0) { + + DFSInStack.push_back(son); + son->DFSNumIn = Parent->DFSNumIn + 1; + visited.insert(son); + + for (ETNode *s = son->Right; s != son; s = s->Right) { + DFSInStack.push_back(s); + s->DFSNumIn = Parent->DFSNumIn + 1; + visited.insert(s); + } + } + } +} + //===----------------------------------------------------------------------===// // ETForestBase Implementation //===----------------------------------------------------------------------===// |

