From c31577953d5041c82375c22d847c2eba06106c58 Mon Sep 17 00:00:00 2001 From: Yong He Date: Fri, 25 Feb 2022 20:49:31 -0800 Subject: Improved SCCP, inlining and resource specialization passes, legalize `ImageSubscript` for GLSL (#2146) --- source/slang/slang-ir-validate.cpp | 49 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'source/slang/slang-ir-validate.cpp') diff --git a/source/slang/slang-ir-validate.cpp b/source/slang/slang-ir-validate.cpp index ffadf33cf..e8da87187 100644 --- a/source/slang/slang-ir-validate.cpp +++ b/source/slang/slang-ir-validate.cpp @@ -196,6 +196,50 @@ namespace Slang } } + void validateCodeBody(IRValidateContext* context, IRGlobalValueWithCode* code) + { + HashSet blocks; + for (auto block : code->getBlocks()) + blocks.Add(block); + auto validateBranchTarget = [&](IRInst* inst, IRBlock* target) + { + validate( + context, + blocks.Contains(target), + inst, + "branch inst must have a valid target block that is defined within the same " + "scope."); + }; + for (auto block : code->getBlocks()) + { + auto terminator = block->getTerminator(); + validate(context, terminator, block, "block must have valid terminator inst."); + switch (terminator->getOp()) + { + case kIROp_conditionalBranch: + validateBranchTarget( + terminator, as(terminator)->getTrueBlock()); + validateBranchTarget( + terminator, as(terminator)->getFalseBlock()); + break; + case kIROp_loop: + case kIROp_unconditionalBranch: + validateBranchTarget(terminator, as(terminator)->getTargetBlock()); + break; + case kIROp_Switch: + { + auto switchInst = as(terminator); + for (UInt i = 0; i < switchInst->getCaseCount(); i++) + { + validateBranchTarget(switchInst, switchInst->getCaseLabel(i)); + } + validateBranchTarget(switchInst, switchInst->getDefaultLabel()); + validateBranchTarget(switchInst, switchInst->getBreakLabel()); + } + } + } + } + void validateIRInst( IRValidateContext* context, IRInst* inst) @@ -207,6 +251,11 @@ namespace Slang // If `inst` is itself a parent instruction, then we need to recursively // validate its children. validateIRInstChildren(context, inst); + + if (auto code = as(inst)) + { + validateCodeBody(context, code); + } } void validateIRModule(IRModule* module, DiagnosticSink* sink) -- cgit v1.2.3