diff options
| author | Ali MJ Al-Nasrawy <alimjalnasrawy@gmail.com> | 2023-12-06 09:30:33 +0000 |
|---|---|---|
| committer | Ali MJ Al-Nasrawy <alimjalnasrawy@gmail.com> | 2023-12-13 14:57:52 +0000 |
| commit | 85338197d402e0d94f9113bef4e3343921f3391d (patch) | |
| tree | 9c1d3e1cadd369c5f5cee113a7153e2b52d29270 /compiler | |
| parent | f38d1e971dcba3a3e9739d0d5aaf5f14329118bd (diff) | |
| download | rust-85338197d402e0d94f9113bef4e3343921f3391d.tar.gz rust-85338197d402e0d94f9113bef4e3343921f3391d.zip | |
don't store OriginalQueryValues::universe_map
ParamEnv is canonicalized in *queries input* rather than query response. In such case we don't "preserve universes" of canonical variable. This means that `universe_map` always has the default value, which is wasteful to store in the cache.
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/rustc_infer/src/infer/canonical/canonicalizer.rs | 1 | ||||
| -rw-r--r-- | compiler/rustc_middle/src/infer/canonical.rs | 15 |
2 files changed, 12 insertions, 4 deletions
diff --git a/compiler/rustc_infer/src/infer/canonical/canonicalizer.rs b/compiler/rustc_infer/src/infer/canonical/canonicalizer.rs index d3ab3c0afe2..ed4de390000 100644 --- a/compiler/rustc_infer/src/infer/canonical/canonicalizer.rs +++ b/compiler/rustc_infer/src/infer/canonical/canonicalizer.rs @@ -150,6 +150,7 @@ impl<'tcx> InferCtxt<'tcx> { { let (param_env, value) = value.into_parts(); let base = self.tcx.canonical_param_env_cache.get_or_insert( + self.tcx, param_env, query_state, |query_state| { diff --git a/compiler/rustc_middle/src/infer/canonical.rs b/compiler/rustc_middle/src/infer/canonical.rs index 9208cd5febb..c231a0f0b64 100644 --- a/compiler/rustc_middle/src/infer/canonical.rs +++ b/compiler/rustc_middle/src/infer/canonical.rs @@ -300,7 +300,7 @@ pub struct CanonicalParamEnvCache<'tcx> { map: Lock< FxHashMap< ty::ParamEnv<'tcx>, - (Canonical<'tcx, ty::ParamEnv<'tcx>>, OriginalQueryValues<'tcx>), + (Canonical<'tcx, ty::ParamEnv<'tcx>>, &'tcx [GenericArg<'tcx>]), >, >, } @@ -308,21 +308,28 @@ pub struct CanonicalParamEnvCache<'tcx> { impl<'tcx> CanonicalParamEnvCache<'tcx> { pub fn get_or_insert( &self, + tcx: TyCtxt<'tcx>, key: ty::ParamEnv<'tcx>, state: &mut OriginalQueryValues<'tcx>, canonicalize_op: impl FnOnce( &mut OriginalQueryValues<'tcx>, ) -> Canonical<'tcx, ty::ParamEnv<'tcx>>, ) -> Canonical<'tcx, ty::ParamEnv<'tcx>> { + assert_eq!(state.var_values.len(), 0); + assert_eq!(state.universe_map.len(), 1); + debug_assert_eq!(&*state.universe_map, &[ty::UniverseIndex::ROOT]); + match self.map.borrow().entry(key) { Entry::Occupied(e) => { - let (canonical, state_cached) = e.get(); - state.clone_from(state_cached); + let (canonical, var_values) = e.get(); + state.var_values.extend_from_slice(var_values); canonical.clone() } Entry::Vacant(e) => { let canonical = canonicalize_op(state); - e.insert((canonical.clone(), state.clone())); + let OriginalQueryValues { var_values, universe_map } = state; + assert_eq!(universe_map.len(), 1); + e.insert((canonical.clone(), tcx.arena.alloc_slice(var_values))); canonical } } |
