summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-ir-loop-unroll.cpp
diff options
context:
space:
mode:
authorEllie Hermaszewska <ellieh@nvidia.com>2023-08-18 05:57:57 +0800
committerGitHub <noreply@github.com>2023-08-17 14:57:57 -0700
commit80c8f13e369b0bf0b86d2b19a4902594e6d67e5c (patch)
treea7ee0c6eaa286ce3f2fd208b2df8a849fa325287 /source/slang/slang-ir-loop-unroll.cpp
parenta0a9c04625d37d44ead80d574131063c6eb75d0d (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.cpp12
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());