diff options
Diffstat (limited to 'source/slang/slang-ir-dominators.cpp')
| -rw-r--r-- | source/slang/slang-ir-dominators.cpp | 25 |
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. |
