-
Notifications
You must be signed in to change notification settings - Fork 5.3k
[mono][interp] Disable inlining of methods that always throw #122587
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
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.
|
Tagging subscribers to this area: @BrzVlad, @kotlarmilos |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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
|
/backport to release/10.0 |
|
Started backporting to |
… 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 <brezaevlad@gmail.com>
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