summaryrefslogtreecommitdiff
path: root/source/slang/slang-ir-util.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2023-03-15 09:39:21 -0700
committerGitHub <noreply@github.com>2023-03-15 09:39:21 -0700
commitbf308241b54ae9c421a29aa5620da9fb3ec15245 (patch)
treeacf114b9e0677f6b6494b105130d7043b1be872b /source/slang/slang-ir-util.cpp
parent176eaa9f7770ad81cbd71def8a1551d6237167bd (diff)
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 <yhe@nvidia.com>
Diffstat (limited to 'source/slang/slang-ir-util.cpp')
-rw-r--r--source/slang/slang-ir-util.cpp20
1 files changed, 20 insertions, 0 deletions
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<IRParam>(inst))