From bf308241b54ae9c421a29aa5620da9fb3ec15245 Mon Sep 17 00:00:00 2001 From: Yong He Date: Wed, 15 Mar 2023 09:39:21 -0700 Subject: Properly implement differential witness of intermediate context type. (#2699) * Properly implement differential witness of intermediate context type. * Modify test to include a loop. --------- Co-authored-by: Yong He --- source/slang/slang-ir-util.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'source/slang/slang-ir-util.cpp') diff --git a/source/slang/slang-ir-util.cpp b/source/slang/slang-ir-util.cpp index 254734965..de03a1661 100644 --- a/source/slang/slang-ir-util.cpp +++ b/source/slang/slang-ir-util.cpp @@ -554,6 +554,26 @@ IROp getSwapSideComparisonOp(IROp op) } } +IRInst* emitLoopBlocks(IRBuilder* builder, IRInst* initVal, IRInst* finalVal, IRBlock*& loopBodyBlock, IRBlock*& loopBreakBlock) +{ + IRBuilder loopBuilder = *builder; + auto loopHeadBlock = loopBuilder.emitBlock(); + loopBodyBlock = loopBuilder.emitBlock(); + loopBreakBlock = loopBuilder.emitBlock(); + auto loopContinueBlock = loopBuilder.emitBlock(); + builder->emitLoop(loopHeadBlock, loopBreakBlock, loopHeadBlock, 1, &initVal); + loopBuilder.setInsertInto(loopHeadBlock); + auto loopParam = loopBuilder.emitParam(initVal->getFullType()); + auto cmpResult = loopBuilder.emitLess(loopParam, finalVal); + loopBuilder.emitIfElse(cmpResult, loopBodyBlock, loopBreakBlock, loopBreakBlock); + loopBuilder.setInsertInto(loopBodyBlock); + loopBuilder.emitBranch(loopContinueBlock); + loopBuilder.setInsertInto(loopContinueBlock); + auto newParam = loopBuilder.emitAdd(loopParam->getFullType(), loopParam, loopBuilder.getIntValue(loopBuilder.getIntType(), 1)); + loopBuilder.emitBranch(loopHeadBlock, 1, &newParam); + return loopParam; +} + void setInsertBeforeOrdinaryInst(IRBuilder* builder, IRInst* inst) { if (as(inst)) -- cgit v1.2.3