summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSai Praveen Bangaru <31557731+saipraveenb25@users.noreply.github.com>2023-04-22 17:25:33 -0400
committerGitHub <noreply@github.com>2023-04-22 17:25:33 -0400
commite8673a535e91af8fd8d31d6845af1c792f554f05 (patch)
tree11731775eb9e023e9b35e005141e717cb37a7323
parent385d3f4d29902242d7a803fb7b3d2a7513e4b5b1 (diff)
Fix corner case with multi-level break elimination (#2828)
-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))
{