From e8673a535e91af8fd8d31d6845af1c792f554f05 Mon Sep 17 00:00:00 2001 From: Sai Praveen Bangaru <31557731+saipraveenb25@users.noreply.github.com> Date: Sat, 22 Apr 2023 17:25:33 -0400 Subject: Fix corner case with multi-level break elimination (#2828) --- .../slang/slang-ir-eliminate-multilevel-break.cpp | 24 ++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/source/slang/slang-ir-eliminate-multilevel-break.cpp b/source/slang/slang-ir-eliminate-multilevel-break.cpp index e73fae982..83da1bba5 100644 --- a/source/slang/slang-ir-eliminate-multilevel-break.cpp +++ b/source/slang/slang-ir-eliminate-multilevel-break.cpp @@ -293,19 +293,31 @@ struct EliminateMultiLevelBreakContext // branch. We need this separation to avoid introducing critical edge to the CFG (blocks // cannot have more than 1 predecessors and more than 1 successors at the same time). auto jumpToOuterBlock = builder.createBlock(); - auto newBreakBodyBlock = builder.createBlock(); + auto newBreakBlock = builder.createBlock(); newBreakBlock->insertBefore(breakBlock); - newBreakBodyBlock->insertAfter(breakBlock); jumpToOuterBlock->insertAfter(newBreakBlock); mapNewBreakBlockToRegionLevel[newBreakBlock] = skippedRegion->level; breakBlock->replaceUsesWith(newBreakBlock); + builder.setInsertInto(newBreakBlock); auto targetLevelParam = builder.emitParam(builder.getIntType()); - builder.emitBranch(newBreakBodyBlock); - builder.setInsertInto(newBreakBodyBlock); - auto levelNeq = builder.emitNeq(targetLevelParam, builder.getIntValue(builder.getIntType(), skippedRegion->level)); - builder.emitIfElse(levelNeq, jumpToOuterBlock, breakBlock, breakBlock); + + if (as(breakBlock->getTerminator())) + { + builder.setInsertInto(newBreakBlock); + builder.emitBranch(jumpToOuterBlock); + } + else + { + auto newBreakBodyBlock = builder.createBlock(); + newBreakBodyBlock->insertAfter(breakBlock); + builder.emitBranch(newBreakBodyBlock); + builder.setInsertInto(newBreakBodyBlock); + auto levelNeq = builder.emitNeq(targetLevelParam, builder.getIntValue(builder.getIntType(), skippedRegion->level)); + builder.emitIfElse(levelNeq, jumpToOuterBlock, breakBlock, breakBlock); + } + builder.setInsertInto(jumpToOuterBlock); if (skippedOverRegions.Contains(skippedRegion->parent)) { -- cgit v1.2.3