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 base = self.tcx.canonical_param_env_cache.get_or_insert(
self.tcx,
param_env,
query_state,
|query_state| {

View File

@ -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
}
}