1
Fork 0

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.
This commit is contained in:
Ali MJ Al-Nasrawy 2023-12-06 09:30:33 +00:00
parent f38d1e971d
commit 85338197d4
2 changed files with 12 additions and 4 deletions

View file

@ -150,6 +150,7 @@ impl<'tcx> InferCtxt<'tcx> {
{ {
let (param_env, value) = value.into_parts(); let (param_env, value) = value.into_parts();
let base = self.tcx.canonical_param_env_cache.get_or_insert( let base = self.tcx.canonical_param_env_cache.get_or_insert(
self.tcx,
param_env, param_env,
query_state, query_state,
|query_state| { |query_state| {

View file

@ -300,7 +300,7 @@ pub struct CanonicalParamEnvCache<'tcx> {
map: Lock< map: Lock<
FxHashMap< FxHashMap<
ty::ParamEnv<'tcx>, 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> { impl<'tcx> CanonicalParamEnvCache<'tcx> {
pub fn get_or_insert( pub fn get_or_insert(
&self, &self,
tcx: TyCtxt<'tcx>,
key: ty::ParamEnv<'tcx>, key: ty::ParamEnv<'tcx>,
state: &mut OriginalQueryValues<'tcx>, state: &mut OriginalQueryValues<'tcx>,
canonicalize_op: impl FnOnce( canonicalize_op: impl FnOnce(
&mut OriginalQueryValues<'tcx>, &mut OriginalQueryValues<'tcx>,
) -> Canonical<'tcx, ty::ParamEnv<'tcx>>, ) -> Canonical<'tcx, ty::ParamEnv<'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) { match self.map.borrow().entry(key) {
Entry::Occupied(e) => { Entry::Occupied(e) => {
let (canonical, state_cached) = e.get(); let (canonical, var_values) = e.get();
state.clone_from(state_cached); state.var_values.extend_from_slice(var_values);
canonical.clone() canonical.clone()
} }
Entry::Vacant(e) => { Entry::Vacant(e) => {
let canonical = canonicalize_op(state); 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 canonical
} }
} }