diff options
| author | bors <bors@rust-lang.org> | 2023-10-17 00:53:53 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2023-10-17 00:53:53 +0000 |
| commit | 39164b84e0c6d94b15c78fcbf9bb5cfb76693045 (patch) | |
| tree | f176fee2982540f026877973b570b9a999ca02b8 | |
| parent | 64338796ab1092e2ad01283b14606e2d8d5d28fc (diff) | |
| parent | 91f2fbc867bfc31f2e103b09e605c61f1a450b33 (diff) | |
| download | rust-39164b84e0c6d94b15c78fcbf9bb5cfb76693045.tar.gz rust-39164b84e0c6d94b15c78fcbf9bb5cfb76693045.zip | |
Auto merge of #116826 - nnethercote:fix-116780-116797, r=compiler-errors
Fix a performance regression in obligation deduplication. Commit 8378487 from #114611 changed the location of an obligation deduplication step in `opt_normalize_projection_type`. This meant that deduplication stopped happening on one path where it was still necessary, causing a couple of drastic performance regressions. This commit moves the deduplication back to the old location. The good news is that #114611 had four commits and 8378487 was of minimal importance, so the perf benefits from that PR remain. Fixes #116780, #116797. r? `@compiler-errors`
| -rw-r--r-- | compiler/rustc_trait_selection/src/traits/project.rs | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/compiler/rustc_trait_selection/src/traits/project.rs b/compiler/rustc_trait_selection/src/traits/project.rs index 73c2ff3c536..175cc2b116b 100644 --- a/compiler/rustc_trait_selection/src/traits/project.rs +++ b/compiler/rustc_trait_selection/src/traits/project.rs @@ -1233,7 +1233,7 @@ fn opt_normalize_projection_type<'a, 'b, 'tcx>( let projected_term = selcx.infcx.resolve_vars_if_possible(projected_term); - let result = if projected_term.has_projections() { + let mut result = if projected_term.has_projections() { let mut normalizer = AssocTypeNormalizer::new( selcx, param_env, @@ -1243,14 +1243,14 @@ fn opt_normalize_projection_type<'a, 'b, 'tcx>( ); let normalized_ty = normalizer.fold(projected_term); - let mut deduped = SsoHashSet::with_capacity(projected_obligations.len()); - projected_obligations.retain(|obligation| deduped.insert(obligation.clone())); - Normalized { value: normalized_ty, obligations: projected_obligations } } else { Normalized { value: projected_term, obligations: projected_obligations } }; + let mut deduped = SsoHashSet::with_capacity(result.obligations.len()); + result.obligations.retain(|obligation| deduped.insert(obligation.clone())); + if use_cache { infcx.inner.borrow_mut().projection_cache().insert_term(cache_key, result.clone()); } |
