Optimize allow_unwrap_types evaluation to eliminate performance regression#16652
Merged
blyxyas merged 1 commit intorust-lang:masterfrom Mar 3, 2026
Merged
Conversation
Collaborator
|
r? @Jarcho rustbot has assigned @Jarcho. Use Why was this reviewer chosen?The reviewer was selected based on:
|
Contributor
Author
Member
Member
|
Sorry for the late reply, I was (and sm) at a hackathon. From my profiling in bumpalo, the performance regression is completely gone. So I'll give this a +1 if there isn't anything else to bring up. Also we should totally backport this to beta. |
Member
|
@sengmonkham Seems that CI is failing, could you look into that? |
Contributor
Author
I have fixed all CI issues, and all checks now pass. |
Member
|
Could you please squash your commits? It would make it easier to backport to beta if we do so. |
d2a4fb1 to
7ac8be4
Compare
blyxyas
approved these changes
Mar 3, 2026
Member
cuviper
pushed a commit
to cuviper/rust
that referenced
this pull request
Apr 9, 2026
…gression (rust-lang#16652) Fixes rust-lang/rust-clippy#16605 This PR addresses the 6.2% compilation performance regression introduced by the original `allow_unwrap_types` implementation (which natively allocated AST strings on every `unwrap` call via `bumpalo`). The implementation has been refactored to pre-resolve types securely without a performance penalty: **Pre-Resolution Cache via `LateLintPass`**: Instead of executing `ty.to_string()` and `lookup_path_str` inside the immediate `unwrap_expect_used` hot check for every method call encountered, `allow-unwrap-types` configuration strings are now parsed exactly *once* per crate compilation during the `LateLintPass::check_crate` hook in `clippy_lints/src/methods/mod.rs`. **`DefId` Native Storage**: The parsed `DefId` representations are stored in-memory using highly efficient caching maps directly on the main `Methods` struct: - `unwrap_allowed_ids: FxHashSet<DefId>`: Allows instant O(1) lookups for standard types. - `unwrap_allowed_aliases: Vec<DefId>`: Tracks type aliases requiring signature substitution checking later. **Execution Relief**: Inside `unwrap_expect_used::check()`, string manipulation is completely removed and `ty::Adt` checking uses lightning-fast `.contains(&adt.did())` operations to categorically avoid regression allocation loops. This implementation strongly parallels the pre-resolution type-routing logic in `clippy_config::types::create_disallowed_map` without altering the core `clippy.toml` config requirements. <!-- TRIAGEBOT_START --> <!-- TRIAGEBOT_SUMMARY_START --> ### Summary Notes - [Beta-nomination](rust-lang/rust-clippy#16652 (comment)) by [samueltardieu](https://github.com/samueltardieu) *Managed by `@rustbot`—see [help](https://forge.rust-lang.org/triagebot/note.html) for details* <!-- TRIAGEBOT_SUMMARY_END --> <!-- TRIAGEBOT_END --> changelog: none
rust-bors bot
pushed a commit
to rust-lang/rust
that referenced
this pull request
Apr 9, 2026
[beta] reverts and backports This reverts two `dbg!` changes to avoid regressions[^1][^2] in the upcoming 1.95 release: - std: avoid tearing `dbg!` prints #149869 - don't drop arguments' temporaries in `dbg!` #154074 - ... which was previously backported in #154725 This also reverts a stabilization over a late issue[^3] of semantics: - Stabilize `assert_matches` #137487 And a few other backport/reverts from `main`: - Revert performing basic const checks in typeck on stable #154930 / #155033 - Revert "`-Znext-solver` Remove the forced ambiguity hack from search graph" #154712 - Clarify that core::range ranges do not have special syntax #155002 Clippy is backporting 2 ICE fixes and 1 perf regression (via #155051): - rust-lang/rust-clippy#16685 already backported in #154211 to stable. This makes sure that it doesn't regress again in beta/next stable - rust-lang/rust-clippy#16659 The ICE that is being fixed here was introduced in the 1.95 release cycle - rust-lang/rust-clippy#16652 Perf regression introduced in the 1.95 release cycle. [^1]: #153850 [^2]: #154988 [^3]: #154406
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.
Fixes #16605
This PR addresses the 6.2% compilation performance regression introduced by the original
allow_unwrap_typesimplementation (which natively allocated AST strings on everyunwrapcall viabumpalo).The implementation has been refactored to pre-resolve types securely without a performance penalty:
Pre-Resolution Cache via
LateLintPass: Instead of executingty.to_string()andlookup_path_strinside the immediateunwrap_expect_usedhot check for every method call encountered,allow-unwrap-typesconfiguration strings are now parsed exactly once per crate compilation during theLateLintPass::check_cratehook inclippy_lints/src/methods/mod.rs.DefIdNative Storage: The parsedDefIdrepresentations are stored in-memory using highly efficient caching maps directly on the mainMethodsstruct:unwrap_allowed_ids: FxHashSet<DefId>: Allows instant O(1) lookups for standard types.unwrap_allowed_aliases: Vec<DefId>: Tracks type aliases requiring signature substitution checking later.Execution Relief: Inside
unwrap_expect_used::check(), string manipulation is completely removed andty::Adtchecking uses lightning-fast.contains(&adt.did())operations to categorically avoid regression allocation loops. This implementation strongly parallels the pre-resolution type-routing logic inclippy_config::types::create_disallowed_mapwithout altering the coreclippy.tomlconfig requirements.Summary Notes
Managed by
@rustbot—see help for detailschangelog: none