[mono][interp] Disable inlining of methods that always throw#122587
Merged
BrzVlad merged 1 commit intodotnet:mainfrom Dec 16, 2025
Merged
[mono][interp] Disable inlining of methods that always throw#122587BrzVlad merged 1 commit intodotnet:mainfrom
BrzVlad merged 1 commit intodotnet:mainfrom
Conversation
When inlining, we create a placeholder exit_bb that is branched to whenever the inlined method returns. When this bblock was not reachable, it was leading to some inconsistent CFG state. This is relatively easy to fix but, if exit_bb is dead, it means that the method is always throwing an exception. We shouldn't bother inlining such methods in the first place, since they are not part of hot code paths.
Contributor
|
Tagging subscribers to this area: @BrzVlad, @kotlarmilos |
Contributor
There was a problem hiding this comment.
Pull request overview
This PR improves the Mono interpreter's inlining logic by preventing the inlining of methods that always throw exceptions. Previously, when a method's exit basic block was unreachable (indicated by exit_bb->in_count == 0), it was simply marked as dead, which could lead to inconsistent CFG (control flow graph) state. The fix recognizes that such methods are not performance-sensitive and should not be inlined in the first place.
- Changed behavior from marking unreachable exit blocks as dead to failing the inline attempt for methods that always throw
- Updated comment to clarify the rationale: methods that always throw are not performance-sensitive code paths
kotlarmilos
approved these changes
Dec 16, 2025
Member
Author
|
/backport to release/10.0 |
Contributor
|
Started backporting to |
4 tasks
jeffhandley
pushed a commit
that referenced
this pull request
Jan 8, 2026
… throw (#122594) Backport of #122587 to release/10.0 /cc @BrzVlad ## Customer Impact - [x] Customer reported - [ ] Found internally Customer reported that app on blazor wasm hangs. Compiling methods that call throw helper methods (methods that always throw) with mono interpreter can lead to hangs in the runtime. MAUI ios can also be impacted in theory. ## Regression - [x] Yes - [ ] No This a regression from .NET9. Seems like the issue started happening after #108731. ## Testing Verified with sample repro provided by customer. ## Risk Low. The fix aborts inlining in methods that throw unconditionally. The common mechanism of inline abort is reused so there is no added risk here. Co-authored-by: Vlad Brezae <[email protected]>
This was referenced Jan 9, 2026
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 subscribe to this conversation on GitHub.
Already have an account?
Sign in.
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.
When inlining, we create a placeholder exit_bb that is branched to whenever the inlined method returns. When this bblock was not reachable, it was leading to some inconsistent CFG state. This is relatively easy to fix but, if exit_bb is dead, it means that the method is always throwing an exception. We shouldn't bother inlining such methods in the first place, since they are not part of hot code paths.
Fixes #122529