about summary refs log tree commit diff
path: root/compiler
diff options
context:
space:
mode:
authorAli MJ Al-Nasrawy <alimjalnasrawy@gmail.com>2023-12-06 09:30:33 +0000
committerAli MJ Al-Nasrawy <alimjalnasrawy@gmail.com>2023-12-13 14:57:52 +0000
commit85338197d402e0d94f9113bef4e3343921f3391d (patch)
tree9c1d3e1cadd369c5f5cee113a7153e2b52d29270 /compiler
parentf38d1e971dcba3a3e9739d0d5aaf5f14329118bd (diff)
downloadrust-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.rs1
-rw-r--r--compiler/rustc_middle/src/infer/canonical.rs15
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
             }
         }