Avoid query type in generics#69910
Conversation
|
r? @eddyb (rust_highfive has picked a reviewer for you, use r? to override) |
|
r? @Zoxc |
|
I'm not sure how many unique key / value pairs we have for queries, if that isn't much lower than the total query count, this change isn't too impactful. |
|
As a crude measurement, the number of instances of |
|
That suggests that 26% of query key / value pairs are duplicates, so this is probably worthwhile. |
|
Why is my |
|
I was experimenting with it yesterday, and somehow it ended up on the wrong branch. Sorry. |
|
@bors try @rust-timer queue |
|
Awaiting bors try build completion |
Avoid query type in generics There are at the moment roughly 170 queries in librustc. The way ty::query is structured, a lot of code is duplicated for each query. I suspect this to be responsible for a part of librustc'c compile time. This PR reduces the amount of code generic on the query, replacing it by code generic on the key-value types. This is split out of #69808, and should not contain the perf regression. cc #65031
|
☀️ Try build successful - checks-azure |
|
Queued 4adbc79 with parent 54b7d21, future comparison URL. |
|
Finished benchmarking try commit 4adbc79, comparison URL. |
src/librustc/ty/query/plumbing.rs
Outdated
| pub(super) fn try_collect_active_jobs( | ||
| &self, | ||
| kind: DepKind, | ||
| make_query: impl Fn(C::Key) -> Query<'tcx> + Copy, |
There was a problem hiding this comment.
You could use &dyn for make_query here.
I measured the compilation impact of the query system to be 25% of librustc's compile time 3. February. |
|
☔ The latest upstream changes (presumably #68944) made this pull request unmergeable. Please resolve the merge conflicts. |
|
Rebased. |
|
I'd leave out the |
|
Done. |
|
@bors r+ |
|
📌 Commit 8aa1328 has been approved by |
Avoid query type in generics There are at the moment roughly 170 queries in librustc. The way ty::query is structured, a lot of code is duplicated for each query. I suspect this to be responsible for a part of librustc'c compile time. This PR reduces the amount of code generic on the query, replacing it by code generic on the key-value types. This is split out of rust-lang#69808, and should not contain the perf regression. cc rust-lang#65031
Avoid query type in generics There are at the moment roughly 170 queries in librustc. The way ty::query is structured, a lot of code is duplicated for each query. I suspect this to be responsible for a part of librustc'c compile time. This PR reduces the amount of code generic on the query, replacing it by code generic on the key-value types. This is split out of rust-lang#69808, and should not contain the perf regression. cc rust-lang#65031
Rollup of 6 pull requests Successful merges: - rust-lang#69497 (Don't unwind when hitting the macro expansion recursion limit) - rust-lang#69901 (add #[rustc_layout(debug)]) - rust-lang#69910 (Avoid query type in generics) - rust-lang#69955 (Fix abort-on-eprintln during process shutdown) - rust-lang#70032 (put type params in front of const params in generics_of) - rust-lang#70119 (rustc: use LocalDefId instead of DefId in TypeckTables.) Failed merges: r? @ghost
| &self, | ||
| state: &'tcx QueryState<'tcx, Q>, | ||
| state: &'tcx QueryState<'tcx, Self>, | ||
| get_cache: GetCache, |
There was a problem hiding this comment.
Now that you connected up the types, you should be able to just get rid of get_cache: GetCache.
| impl<'tcx, C: QueryCache> QueryState<'tcx, C> { | ||
| pub(super) fn get_lookup<K2: Hash>( | ||
| &'tcx self, | ||
| key: &K2, |
Move the query system to a dedicated crate The query system `rustc::ty::query` is split out into the `rustc_query_system` crate. Some commits are unformatted, to ease rebasing. Based on rust-lang#67761 and rust-lang#69910. r? @Zoxc
There are at the moment roughly 170 queries in librustc.
The way ty::query is structured, a lot of code is duplicated for each query.
I suspect this to be responsible for a part of librustc'c compile time.
This PR reduces the amount of code generic on the query,
replacing it by code generic on the key-value types.
This is split out of #69808,
and should not contain the perf regression.
cc #65031