Auto merge of #140752 - lcnr:subrelations-infcx-perf-2, r= · rust-lang/rust@bbf9bd9 (original) (raw)
`@@ -6,6 +6,7 @@
`
6
6
`//! [c]: https://rust-lang.github.io/chalk/book/canonical_queries/canonicalization.html
`
7
7
``
8
8
`use rustc_data_structures::fx::FxHashMap;
`
``
9
`+
use rustc_data_structures::sso::SsoHashMap;
`
9
10
`use rustc_index::Idx;
`
10
11
`use rustc_middle::bug;
`
11
12
`use rustc_middle::ty::{
`
`@@ -17,8 +18,7 @@ use tracing::debug;
`
17
18
``
18
19
`use crate::infer::InferCtxt;
`
19
20
`use crate::infer::canonical::{
`
20
``
`-
Canonical, CanonicalQueryInput, CanonicalTyVarKind, CanonicalVarInfo, CanonicalVarKind,
`
21
``
`-
OriginalQueryValues,
`
``
21
`+
Canonical, CanonicalQueryInput, CanonicalVarInfo, CanonicalVarKind, OriginalQueryValues,
`
22
22
`};
`
23
23
``
24
24
`impl<'tcx> InferCtxt<'tcx> {
`
`@@ -299,6 +299,7 @@ struct Canonicalizer<'cx, 'tcx> {
`
299
299
`` // Note that indices is only used once var_values
is big enough to be
``
300
300
`// heap-allocated.
`
301
301
`indices: FxHashMap<GenericArg<'tcx>, BoundVar>,
`
``
302
`+
sub_root_lookup_table: SsoHashMap<ty::TyVid, usize>,
`
302
303
`canonicalize_mode: &'cx dyn CanonicalizeMode,
`
303
304
`needs_canonical_flags: TypeFlags,
`
304
305
``
`@@ -367,9 +368,10 @@ impl<'cx, 'tcx> TypeFolder<TyCtxt<'tcx>> for Canonicalizer<'cx, 'tcx> {
`
367
368
`// FIXME: perf problem described in #55921.
`
368
369
` ui = ty::UniverseIndex::ROOT;
`
369
370
`}
`
``
371
`+
let sub_root = self.get_or_insert_sub_root(vid);
`
370
372
`self.canonicalize_ty_var(
`
371
373
`CanonicalVarInfo {
`
372
``
`-
kind: CanonicalVarKind::Ty(CanonicalTyVarKind::General(ui)),
`
``
374
`+
kind: CanonicalVarKind::Ty { universe: ui, sub_root },
`
373
375
`},
`
374
376
` t,
`
375
377
`)
`
`@@ -382,21 +384,15 @@ impl<'cx, 'tcx> TypeFolder<TyCtxt<'tcx>> for Canonicalizer<'cx, 'tcx> {
`
382
384
`if nt != t {
`
383
385
`return self.fold_ty(nt);
`
384
386
`} else {
`
385
``
`-
self.canonicalize_ty_var(
`
386
``
`-
CanonicalVarInfo { kind: CanonicalVarKind::Ty(CanonicalTyVarKind::Int) },
`
387
``
`-
t,
`
388
``
`-
)
`
``
387
`+
self.canonicalize_ty_var(CanonicalVarInfo { kind: CanonicalVarKind::Int }, t)
`
389
388
`}
`
390
389
`}
`
391
390
` ty::Infer(ty::FloatVar(vid)) => {
`
392
391
`let nt = self.infcx.unwrap().opportunistic_resolve_float_var(vid);
`
393
392
`if nt != t {
`
394
393
`return self.fold_ty(nt);
`
395
394
`} else {
`
396
``
`-
self.canonicalize_ty_var(
`
397
``
`-
CanonicalVarInfo { kind: CanonicalVarKind::Ty(CanonicalTyVarKind::Float) },
`
398
``
`-
t,
`
399
``
`-
)
`
``
395
`+
self.canonicalize_ty_var(CanonicalVarInfo { kind: CanonicalVarKind::Float }, t)
`
400
396
`}
`
401
397
`}
`
402
398
``
`@@ -576,6 +572,7 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> {
`
576
572
`variables: SmallVec::from_slice(base.variables),
`
577
573
` query_state,
`
578
574
`indices: FxHashMap::default(),
`
``
575
`+
sub_root_lookup_table: Default::default(),
`
579
576
`binder_index: ty::INNERMOST,
`
580
577
`};
`
581
578
`if canonicalizer.query_state.var_values.spilled() {
`
`@@ -670,6 +667,13 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> {
`
670
667
`}
`
671
668
`}
`
672
669
``
``
670
`+
fn get_or_insert_sub_root(&mut self, vid: ty::TyVid) -> ty::BoundVar {
`
``
671
`+
let root_vid = self.infcx.unwrap().sub_root_var(vid);
`
``
672
`+
let idx =
`
``
673
`+
*self.sub_root_lookup_table.entry(root_vid).or_insert_with(|| self.variables.len());
`
``
674
`+
ty::BoundVar::from(idx)
`
``
675
`+
}
`
``
676
+
673
677
`` /// Replaces the universe indexes used in var_values
with their index in
``
674
678
`` /// query_state.universe_map
. This minimizes the maximum universe used in
``
675
679
`/// the canonicalized value.
`
`@@ -690,11 +694,11 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> {
`
690
694
`.iter()
`
691
695
`.map(|v| CanonicalVarInfo {
`
692
696
`kind: match v.kind {
`
693
``
`-
CanonicalVarKind::Ty(CanonicalTyVarKind::Int | CanonicalTyVarKind::Float) => {
`
``
697
`+
CanonicalVarKind::Int | CanonicalVarKind::Float => {
`
694
698
`return *v;
`
695
699
`}
`
696
``
`-
CanonicalVarKind::Ty(CanonicalTyVarKind::General(u)) => {
`
697
``
`-
CanonicalVarKind::Ty(CanonicalTyVarKind::General(reverse_universe_map[&u]))
`
``
700
`+
CanonicalVarKind::Ty { universe, sub_root } => {
`
``
701
`+
CanonicalVarKind::Ty { universe: reverse_universe_map[&universe], sub_root }
`
698
702
`}
`
699
703
`CanonicalVarKind::Region(u) => {
`
700
704
`CanonicalVarKind::Region(reverse_universe_map[&u])
`