summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/slang/slang-ir-eliminate-multilevel-break.cpp24
1 files 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<IRUnreachable>(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))
{