summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2023-06-30 14:47:17 -0700
committerGitHub <noreply@github.com>2023-06-30 14:47:17 -0700
commitae4273810c1bad35ffe0f745404cb14f2f20c104 (patch)
treed4328ac0e251a13a9e97e189263f2bf26f4ba471 /source
parentc5b0708ead5de2d90ef14f20b5b8e3ed4f576373 (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.cpp25
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.