diff options
| author | Yong He <yonghe@outlook.com> | 2023-06-30 14:47:17 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-06-30 14:47:17 -0700 |
| commit | ae4273810c1bad35ffe0f745404cb14f2f20c104 (patch) | |
| tree | d4328ac0e251a13a9e97e189263f2bf26f4ba471 /source | |
| parent | c5b0708ead5de2d90ef14f20b5b8e3ed4f576373 (diff) | |
Non-Recursive CFG DFS. (#2953)
Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/slang-ir-dominators.cpp | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/source/slang/slang-ir-dominators.cpp b/source/slang/slang-ir-dominators.cpp index 6c2045b7f..e57099321 100644 --- a/source/slang/slang-ir-dominators.cpp +++ b/source/slang/slang-ir-dominators.cpp @@ -279,16 +279,33 @@ struct DepthFirstSearchContext template<typename SuccessorFunc> void walk(IRBlock* block, const SuccessorFunc& getSuccessors) { + List<IRBlock*> nodeStack; + nodeStack.add(block); visited.add(block); preVisit(block); - for(auto succ : getSuccessors(block)) + + while (nodeStack.getCount()) { - if(!visited.contains(succ)) + auto curNode = nodeStack.getLast(); + bool pushedChild = false; + for (auto succ : getSuccessors(curNode)) + { + if (!visited.contains(succ)) + { + pushedChild = true; + nodeStack.add(succ); + visited.add(succ); + + preVisit(succ); + break; + } + } + if (!pushedChild) { - walk(succ, getSuccessors); + postVisit(curNode); + nodeStack.removeLast(); } } - postVisit(block); } /// Overridable action to perform on first entering a CFG node. |
