diff options
| author | Yong He <yonghe@outlook.com> | 2023-03-15 09:39:21 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-03-15 09:39:21 -0700 |
| commit | bf308241b54ae9c421a29aa5620da9fb3ec15245 (patch) | |
| tree | acf114b9e0677f6b6494b105130d7043b1be872b /source/slang/slang-ir-util.cpp | |
| parent | 176eaa9f7770ad81cbd71def8a1551d6237167bd (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.cpp | 20 |
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)) |
