diff options
| author | Ellie Hermaszewska <ellieh@nvidia.com> | 2023-08-18 05:57:57 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-08-17 14:57:57 -0700 |
| commit | 80c8f13e369b0bf0b86d2b19a4902594e6d67e5c (patch) | |
| tree | a7ee0c6eaa286ce3f2fd208b2df8a849fa325287 /source/slang/slang-ir-loop-unroll.cpp | |
| parent | a0a9c04625d37d44ead80d574131063c6eb75d0d (diff) | |
Be more careful about merge blocks during loop inversion (#3136)
* fix block eater
* Be more careful about merge blocks during loop inversion
* Restrict loop inversion to loops without continue jumps
* Remove multiple back-edges from loops for SPIR-V
* Wiggle cross compile test output
* Make loop-inversion more conservative
* Allow loops on false side in cfg normalization
* Do not set loop continue block during inversion
* Add loop inversion test to failing test list for spirv
* Simplify single use continue blocks in spirv legalization
* wobble expected failure list
---------
Co-authored-by: Yong He <yonghe@outlook.com>
Diffstat (limited to 'source/slang/slang-ir-loop-unroll.cpp')
| -rw-r--r-- | source/slang/slang-ir-loop-unroll.cpp | 12 |
1 files changed, 5 insertions, 7 deletions
diff --git a/source/slang/slang-ir-loop-unroll.cpp b/source/slang/slang-ir-loop-unroll.cpp index 36a2abbfc..c9ac4191b 100644 --- a/source/slang/slang-ir-loop-unroll.cpp +++ b/source/slang/slang-ir-loop-unroll.cpp @@ -174,11 +174,8 @@ static void _foldAndSimplifyLoopIteration( auto b = clonedBlocks[i]; if (b) { - if (i != insertIndex) - { - clonedBlocks[insertIndex] = b; - insertIndex++; - } + clonedBlocks[insertIndex] = b; + insertIndex++; } } clonedBlocks.setCount(insertIndex); @@ -554,11 +551,12 @@ void eliminateContinueBlocks(IRModule* module, IRLoop* loopInst) // where a continue is replaced with a "break" into breakableRegionBreakBlock. // - if (loopInst->getContinueBlock() == loopInst->getTargetBlock()) + auto continueBlock = loopInst->getContinueBlock(); + + if (continueBlock == loopInst->getTargetBlock()) return; // If the continue block is not reachable, remove it. - auto continueBlock = loopInst->getContinueBlock(); if (continueBlock && !continueBlock->hasMoreThanOneUse()) { loopInst->continueBlock.set(loopInst->getTargetBlock()); |
