Fix find pattern vs peephole optimization bug #4094
Closed
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.
Ref https://bugs.ruby-lang.org/issues/17534
It turned out (see the ticket above) that
iseq_peephole_optimize
incorrectly optimizes find pattern iseq.Consider the following example:
And that's the crash dump:
The instructions added before
while_begin
chunk were eliminated, others left, thus making the stack state invalid.The proposed solution is to mark patterns as unremoveable. As far as I understand, there is no other case for unreachable patterns except from trivial lasgn/dasgn from the example above (which shouldn't happen in real-life).