Treat states after return, break, and continue as dead - #2556
Open
mohitt31 wants to merge 4 commits into
Open
Conversation
ThrudPrimrose
approved these changes
Sep 7, 2026
acalotoiu
enabled auto-merge
September 7, 2026 12:50
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
DeadStateElimination walks the CFG from the start block and follows the edges out of ReturnBlock, BreakBlock and ContinueBlock, so whatever sits after one of them still counts as reachable. Control flow does not continue past those blocks, so those states are dead and should go.
The fix is to stop the traversal when it reaches one of the three. Anything reachable only through them then falls out of the visited set and gets removed the same way as any other unreachable block.
Tests cover a return at the top level, and a break and a continue inside a loop region. There is also a test where a state is reachable both through the return and around it, so the pass has to keep it. That one passes before the change as well, it is there to catch the traversal being cut too early.
Closes #2051.