summaryrefslogtreecommitdiff
path: root/source/slang/slang-ir-dominators.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2023-01-23 06:59:25 -0800
committerGitHub <noreply@github.com>2023-01-23 06:59:25 -0800
commit46a4d98baa1d43b33717b4377aefeeaf46b9c2ff (patch)
treec89f3a1c416330f859887d00f896b18bcc7488a5 /source/slang/slang-ir-dominators.cpp
parent263ca18ea516cfce43fda703c0a411aaf1938e42 (diff)
Full address insts elimination for backward autodiff. (#2604)
Co-authored-by: Yong He <yhe@nvidia.com>
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.