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:
parent
f38d1e971d
commit
85338197d4
2 changed files with 12 additions and 4 deletions
|
@ -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| {
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue