From: Devang Patel Date: Thu, 14 Sep 2006 01:27:42 +0000 (+0000) Subject: Avoid recursion in assignDFSNumber(). Move def from ET-Forest.h X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=57d12f962d5af0c23283e0a129b95b106a517e46;p=oota-llvm.git Avoid recursion in assignDFSNumber(). Move def from ET-Forest.h to Dominators.h git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@30309 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Analysis/ET-Forest.h b/include/llvm/Analysis/ET-Forest.h index b05776a9e0f..ef2b2155c72 100644 --- a/include/llvm/Analysis/ET-Forest.h +++ b/include/llvm/Analysis/ET-Forest.h @@ -250,16 +250,7 @@ public: return this->Below(other); } - void assignDFSNumber(int &num) { - DFSNumIn = num++; - - if (Son) { - Son->assignDFSNumber(num); - for (ETNode *son = Son->Right; son != Son; son = son->Right) - son->assignDFSNumber(num); - } - DFSNumOut = num++; - } + void assignDFSNumber(int &); bool hasFather() const { return Father != NULL; diff --git a/lib/VMCore/Dominators.cpp b/lib/VMCore/Dominators.cpp index 9f7e5d9365d..fd193b8d7aa 100644 --- a/lib/VMCore/Dominators.cpp +++ b/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 DFSInStack; + std::set 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 //===----------------------------------------------------------------------===//