Skip to content

Commit 837b610

Browse files
committed
Pre-intern some TyKind::Bound values.
We already do the same thing for bound regions. This is a small perf win for the new trait solver.
1 parent bc64bfd commit 837b610

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

compiler/rustc_middle/src/ty/context.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1041,6 +1041,8 @@ const NUM_PREINTERNED_TY_VARS: u32 = 100;
10411041
const NUM_PREINTERNED_FRESH_TYS: u32 = 20;
10421042
const NUM_PREINTERNED_FRESH_INT_TYS: u32 = 3;
10431043
const NUM_PREINTERNED_FRESH_FLOAT_TYS: u32 = 3;
1044+
const NUM_PREINTERNED_ANON_BOUND_TYS_I: u32 = 3;
1045+
const NUM_PREINTERNED_ANON_BOUND_TYS_V: u32 = 20;
10441046

10451047
// This number may seem high, but it is reached in all but the smallest crates.
10461048
const NUM_PREINTERNED_RE_VARS: u32 = 500;
@@ -1088,6 +1090,11 @@ pub struct CommonTypes<'tcx> {
10881090

10891091
/// Pre-interned `Infer(ty::FreshFloatTy(n))` for small values of `n`.
10901092
pub fresh_float_tys: Vec<Ty<'tcx>>,
1093+
1094+
/// Pre-interned values of the form:
1095+
/// `Bound(DebruijnIndex(i), BoundTy { var: v, kind: BoundTyKind::Anon})`
1096+
/// for small values of `i` and `v`.
1097+
pub anon_bound_tys: Vec<Vec<Ty<'tcx>>>,
10911098
}
10921099

10931100
pub struct CommonLifetimes<'tcx> {
@@ -1131,6 +1138,19 @@ impl<'tcx> CommonTypes<'tcx> {
11311138
let fresh_float_tys: Vec<_> =
11321139
(0..NUM_PREINTERNED_FRESH_FLOAT_TYS).map(|n| mk(Infer(ty::FreshFloatTy(n)))).collect();
11331140

1141+
let anon_bound_tys = (0..NUM_PREINTERNED_ANON_BOUND_TYS_I)
1142+
.map(|i| {
1143+
(0..NUM_PREINTERNED_ANON_BOUND_TYS_V)
1144+
.map(|v| {
1145+
mk(ty::Bound(
1146+
ty::DebruijnIndex::from(i),
1147+
ty::BoundTy { var: ty::BoundVar::from(v), kind: ty::BoundTyKind::Anon },
1148+
))
1149+
})
1150+
.collect()
1151+
})
1152+
.collect();
1153+
11341154
CommonTypes {
11351155
unit: mk(Tuple(List::empty())),
11361156
bool: mk(Bool),
@@ -1161,6 +1181,7 @@ impl<'tcx> CommonTypes<'tcx> {
11611181
fresh_tys,
11621182
fresh_int_tys,
11631183
fresh_float_tys,
1184+
anon_bound_tys,
11641185
}
11651186
}
11661187
}

compiler/rustc_middle/src/ty/sty.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,15 @@ impl<'tcx> Ty<'tcx> {
485485
index: ty::DebruijnIndex,
486486
bound_ty: ty::BoundTy,
487487
) -> Ty<'tcx> {
488-
Ty::new(tcx, Bound(index, bound_ty))
488+
// Use a pre-interned one when possible.
489+
if let ty::BoundTy { var, kind: ty::BoundTyKind::Anon } = bound_ty
490+
&& let Some(inner) = tcx.types.anon_bound_tys.get(index.as_usize())
491+
&& let Some(ty) = inner.get(var.as_usize()).copied()
492+
{
493+
ty
494+
} else {
495+
Ty::new(tcx, Bound(index, bound_ty))
496+
}
489497
}
490498

491499
#[inline]

0 commit comments

Comments
 (0)