summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-ir-dominators.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-ir-dominators.cpp')
-rw-r--r--source/slang/slang-ir-dominators.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/source/slang/slang-ir-dominators.cpp b/source/slang/slang-ir-dominators.cpp
index 72b156228..1ffa7ba5d 100644
--- a/source/slang/slang-ir-dominators.cpp
+++ b/source/slang/slang-ir-dominators.cpp
@@ -86,6 +86,31 @@ bool IRDominatorTree::dominates(IRBlock* dominator, IRBlock* dominated)
return properlyDominates(dominator, dominated);
}
+bool IRDominatorTree::dominates(IRInst* dominator, IRInst* dominated)
+{
+ auto dominatorBlock = as<IRBlock>(dominator);
+ if (!dominatorBlock)
+ dominatorBlock = as<IRBlock>(dominator->getParent());
+
+ auto dominatedBlock = as<IRBlock>(dominated);
+ if (!dominatedBlock)
+ dominatedBlock = as<IRBlock>(dominated->getParent());
+
+ if (dominatorBlock == dominatedBlock)
+ {
+ for (auto inst = dominator; inst; inst = inst->getNextInst())
+ {
+ if (inst == dominated)
+ return true;
+ }
+ return false;
+ }
+ else
+ {
+ return dominates(dominatorBlock, dominatedBlock);
+ }
+}
+
IRBlock* IRDominatorTree::getImmediateDominator(IRBlock* block)
{
// An unreachable block has no immediate dominator.