-
Notifications
You must be signed in to change notification settings - Fork 13.4k
Optimize try_expand_impl_trait_type
#65293
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
Conversation
@bors try |
⌛ Trying commit 6493e6b with merge 0d2ff89f766a2f16a09c41ee7c65453980e81908... |
☀️ Try build successful - checks-azure |
@rust-timer queue |
Awaiting bors try build completion |
@rust-timer build 0d2ff89f766a2f16a09c41ee7c65453980e81908 |
Queued 0d2ff89f766a2f16a09c41ee7c65453980e81908 with parent 898f36c, future comparison URL. |
@@ -697,6 +697,9 @@ impl<'tcx> TyCtxt<'tcx> { | |||
// that type, and when we finish expanding that type we remove the | |||
// its DefId. | |||
seen_opaque_tys: FxHashSet<DefId>, | |||
// Cache of all expansions we've seen so far. This is a critical | |||
// optimization for some large types produced by async fn trees. |
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.
// optimization for some large types produced by async fn trees. | |
// optimization for some large types produced by `async fn` trees. |
src/librustc/ty/util.rs
Outdated
let concrete_ty = generic_ty.subst(self.tcx, substs); | ||
let expanded_ty = self.fold_ty(concrete_ty); | ||
self.seen_opaque_tys.remove(&def_id); | ||
let expanded_ty = match self.expanded_cache.get(&def_id) { |
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.
Why not use the .entry
API?
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.
Yeah! Entry! Entry! I ❤️ Entry!
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.
Oh, I think I see why not -- the self.fold_ty
call would error out with entry
, wouldn't it?
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.
Yeah, the fact that the closure would need &mut self
prevents me from using entry
here :/
src/test/ui/impl-trait/recursive-impl-trait-type--through-non-recursize.stderr
Outdated
Show resolved
Hide resolved
@tmandry I'm not sure if we have a suitable test already, but if not, can you add something to |
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.
Presuming this helps, and if we add a perf regression test, seems good to me! Nice detective work y'all.
Finished benchmarking try commit 0d2ff89f766a2f16a09c41ee7c65453980e81908, comparison URL. |
Will do. I was hoping something would turn up in the existing test suite, but it doesn't look that way :) |
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.
I think the following test case shows the problem here:
#![type_length_limit="10000000"]
#![allow(unused)]
macro_rules! mk_async_fn {
($f:ident $g:ident) => {
async fn $g() -> i32 {
$f().await;
$f().await;
$f().await
}
}
}
async fn a() -> i32 { 1 }
mk_async_fn!(a b);
mk_async_fn!(b c);
mk_async_fn!(c d);
mk_async_fn!(d e);
mk_async_fn!(e f);
mk_async_fn!(f g);
mk_async_fn!(g h);
mk_async_fn!(h i);
mk_async_fn!(i j);
@bors try |
Optimize `try_expand_impl_trait_type` A lot of time was being spent expanding some large `impl Future` types in fuchsia. This PR takes the number of types being visited in one expansion from >3 billion to about a thousand, and eliminates the compile time regression in #65147 (in fact, compile times are better than they were before). Thanks to @matthewjasper for suggesting this change. Fixes #65147. r? @matthewjasper,@nikomatsakis
@matthewjasper thanks for supplying the benchmark! This should be ready, pending another timer run once rust-lang/rustc-perf#508 is merged. |
☀️ Try build successful - checks-azure |
6493e6b
to
802554f
Compare
@bors r=matthewjasper |
📌 Commit 802554f has been approved by |
…sper Optimize `try_expand_impl_trait_type` A lot of time was being spent expanding some large `impl Future` types in fuchsia. This PR takes the number of types being visited in one expansion from >3 billion to about a thousand, and eliminates the compile time regression in rust-lang#65147 (in fact, compile times are better than they were before). Thanks to @Mark-Simulacrum for helping identify the issue and to @matthewjasper for suggesting this change. Fixes rust-lang#65147. r? @matthewjasper,@nikomatsakis
Rollup of 14 pull requests Successful merges: - #64603 (Reducing spurious unused lifetime warnings.) - #64623 (Remove last uses of gensyms) - #65235 (don't assume we can *always* find a return type hint in async fn) - #65242 (Fix suggestion to constrain trait for method to be found) - #65265 (Cleanup librustc mir err codes) - #65293 (Optimize `try_expand_impl_trait_type`) - #65307 (Try fix incorrect "explicit lifetime name needed") - #65308 (Add long error explanation for E0574) - #65353 (save-analysis: Don't ICE when resolving qualified type paths in struct members) - #65389 (Return `false` from `needs_drop` for all zero-sized arrays.) - #65402 (Add troubleshooting section to PGO chapter in rustc book.) - #65425 (Optimize `BitIter`) - #65438 (Organize `never_type` tests) - #65444 (Implement AsRef<[T]> for List<T>) Failed merges: - #65390 (Add long error explanation for E0576) r? @ghost
discussed at T-compiler meeting. Accepted for beta-backport. |
[beta] backport rollup This includes a bunch of PRs: * Fix redundant semicolon lint interaction with proc macro attributes #64387 * Upgrade async/await to "used" keywords. #64875 * syntax: fix dropping of attribute on first param of non-method assocated fn #64894 * async/await: improve not-send errors #64895 * Silence unreachable code lint from await desugaring #64930 * Always mark rust and rust-call abi's as unwind #65020 * Account for macro invocation in `let mut $pat` diagnostic. #65123 * Ensure that associated `async fn`s have unique fresh param names #65142 * Add troubleshooting section to PGO chapter in rustc book. #65402 * Upgrade GCC to 8.3.0, glibc to 1.17.0 and crosstool-ng to 1.24.0 for dist-armv7-linux #65302 * Optimize `try_expand_impl_trait_type` #65293 * use precalculated dominators in explain_borrow #65172 * Fix ICE #64964 #64989
[beta] backport rollup This includes a bunch of PRs: * Fix redundant semicolon lint interaction with proc macro attributes #64387 * Upgrade async/await to "used" keywords. #64875 * syntax: fix dropping of attribute on first param of non-method assocated fn #64894 * async/await: improve not-send errors #64895 * Silence unreachable code lint from await desugaring #64930 * Always mark rust and rust-call abi's as unwind #65020 * Account for macro invocation in `let mut $pat` diagnostic. #65123 * Ensure that associated `async fn`s have unique fresh param names #65142 * Add troubleshooting section to PGO chapter in rustc book. #65402 * Upgrade GCC to 8.3.0, glibc to 1.17.0 and crosstool-ng to 1.24.0 for dist-armv7-linux #65302 * Optimize `try_expand_impl_trait_type` #65293 * use precalculated dominators in explain_borrow #65172 * Fix ICE #64964 #64989 * [beta] Revert "Auto merge of #62948 - matklad:failable-file-loading, r=petro… #65273 * save-analysis: Don't ICE when resolving qualified type paths in struct members #65353 * save-analysis: Nest tables when processing impl block definitions #65511 * Avoid ICE when checking `Destination` of `break` inside a closure #65518 * Avoid ICE when adjusting bad self ty #65755 * workaround msys2 bug #65762
A lot of time was being spent expanding some large
impl Future
types in fuchsia. This PR takes the number of types being visited in one expansion from >3 billion to about a thousand, and eliminates the compile time regression in #65147 (in fact, compile times are better than they were before).Thanks to @Mark-Simulacrum for helping identify the issue and to @matthewjasper for suggesting this change.
Fixes #65147.
r? @matthewjasper,@nikomatsakis