diff --git a/llvm/include/llvm/Analysis/ET-Forest.h b/llvm/include/llvm/Analysis/ET-Forest.h index b05776a9e0f1..be9df98e26b3 100644 --- a/llvm/include/llvm/Analysis/ET-Forest.h +++ b/llvm/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/llvm/lib/VMCore/Dominators.cpp b/llvm/lib/VMCore/Dominators.cpp index 9f7e5d9365d1..940653d1ec28 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 workStack; + std::set 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 //===----------------------------------------------------------------------===//