optimize TypeFoldable
for 2 element tuples
This commit is contained in:
parent
7d5d6c055b
commit
758f4e7158
@ -889,19 +889,6 @@ fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List<Ty<'tcx>> {
|
|
||||||
fn try_super_fold_with<F: FallibleTypeFolder<'tcx>>(
|
|
||||||
self,
|
|
||||||
folder: &mut F,
|
|
||||||
) -> Result<Self, F::Error> {
|
|
||||||
ty::util::fold_list(self, folder, |tcx, v| tcx.intern_type_list(v))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
|
||||||
self.iter().try_for_each(|t| t.visit_with(visitor))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List<ProjectionKind> {
|
impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List<ProjectionKind> {
|
||||||
fn try_super_fold_with<F: FallibleTypeFolder<'tcx>>(
|
fn try_super_fold_with<F: FallibleTypeFolder<'tcx>>(
|
||||||
self,
|
self,
|
||||||
|
@ -458,6 +458,45 @@ fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'tcx> TypeFoldable<'tcx> for &'tcx ty::List<Ty<'tcx>> {
|
||||||
|
fn try_super_fold_with<F: FallibleTypeFolder<'tcx>>(
|
||||||
|
self,
|
||||||
|
folder: &mut F,
|
||||||
|
) -> Result<Self, F::Error> {
|
||||||
|
// This code is fairly hot, though not as hot as `SubstsRef`.
|
||||||
|
//
|
||||||
|
// When compiling stage 2, I get the following results:
|
||||||
|
//
|
||||||
|
// len | total | %
|
||||||
|
// --- | --------- | -----
|
||||||
|
// 2 | 15083590 | 48.1
|
||||||
|
// 3 | 7540067 | 24.0
|
||||||
|
// 1 | 5300377 | 16.9
|
||||||
|
// 4 | 1351897 | 4.3
|
||||||
|
// 0 | 1256849 | 4.0
|
||||||
|
//
|
||||||
|
// I've tried it with some private repositories and got
|
||||||
|
// close to the same result, with 4 and 0 swapping places
|
||||||
|
// sometimes.
|
||||||
|
match self.len() {
|
||||||
|
2 => {
|
||||||
|
let param0 = self[0].try_fold_with(folder)?;
|
||||||
|
let param1 = self[1].try_fold_with(folder)?;
|
||||||
|
if param0 == self[0] && param1 == self[1] {
|
||||||
|
Ok(self)
|
||||||
|
} else {
|
||||||
|
Ok(folder.tcx().intern_type_list(&[param0, param1]))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => ty::util::fold_list(self, folder, |tcx, v| tcx.intern_type_list(v)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn super_visit_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
|
||||||
|
self.iter().try_for_each(|t| t.visit_with(visitor))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
// Public trait `Subst`
|
// Public trait `Subst`
|
||||||
//
|
//
|
||||||
|
Loading…
Reference in New Issue
Block a user