From 80c8f13e369b0bf0b86d2b19a4902594e6d67e5c Mon Sep 17 00:00:00 2001 From: Ellie Hermaszewska Date: Fri, 18 Aug 2023 05:57:57 +0800 Subject: 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 --- source/slang/slang-ir-loop-unroll.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) (limited to 'source/slang/slang-ir-loop-unroll.cpp') 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()); -- cgit v1.2.3