From f15e4b30c0d217b647e443333902ca7a948e0f58 Mon Sep 17 00:00:00 2001 From: Bastian Kauschke Date: Sat, 23 May 2020 19:02:26 +0200 Subject: [PATCH] fix Predicate perf regression --- src/librustc_infer/traits/util.rs | 30 ++++++++++++------------------ src/librustc_middle/ty/mod.rs | 7 +++++-- 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/src/librustc_infer/traits/util.rs b/src/librustc_infer/traits/util.rs index 03f20c13068a..17b7b4e680f5 100644 --- a/src/librustc_infer/traits/util.rs +++ b/src/librustc_infer/traits/util.rs @@ -10,50 +10,44 @@ pub fn anonymize_predicate<'tcx>( tcx: TyCtxt<'tcx>, pred: ty::Predicate<'tcx>, ) -> ty::Predicate<'tcx> { - match pred.kind() { + let kind = pred.kind(); + let new = match kind { &ty::PredicateKind::Trait(ref data, constness) => { ty::PredicateKind::Trait(tcx.anonymize_late_bound_regions(data), constness) - .to_predicate(tcx) } ty::PredicateKind::RegionOutlives(data) => { ty::PredicateKind::RegionOutlives(tcx.anonymize_late_bound_regions(data)) - .to_predicate(tcx) } ty::PredicateKind::TypeOutlives(data) => { ty::PredicateKind::TypeOutlives(tcx.anonymize_late_bound_regions(data)) - .to_predicate(tcx) } ty::PredicateKind::Projection(data) => { - ty::PredicateKind::Projection(tcx.anonymize_late_bound_regions(data)).to_predicate(tcx) + ty::PredicateKind::Projection(tcx.anonymize_late_bound_regions(data)) } - &ty::PredicateKind::WellFormed(data) => { - ty::PredicateKind::WellFormed(data).to_predicate(tcx) - } + &ty::PredicateKind::WellFormed(data) => ty::PredicateKind::WellFormed(data), - &ty::PredicateKind::ObjectSafe(data) => { - ty::PredicateKind::ObjectSafe(data).to_predicate(tcx) - } + &ty::PredicateKind::ObjectSafe(data) => ty::PredicateKind::ObjectSafe(data), &ty::PredicateKind::ClosureKind(closure_def_id, closure_substs, kind) => { - ty::PredicateKind::ClosureKind(closure_def_id, closure_substs, kind).to_predicate(tcx) + ty::PredicateKind::ClosureKind(closure_def_id, closure_substs, kind) } ty::PredicateKind::Subtype(data) => { - ty::PredicateKind::Subtype(tcx.anonymize_late_bound_regions(data)).to_predicate(tcx) + ty::PredicateKind::Subtype(tcx.anonymize_late_bound_regions(data)) } &ty::PredicateKind::ConstEvaluatable(def_id, substs) => { - ty::PredicateKind::ConstEvaluatable(def_id, substs).to_predicate(tcx) + ty::PredicateKind::ConstEvaluatable(def_id, substs) } - ty::PredicateKind::ConstEquate(c1, c2) => { - ty::PredicateKind::ConstEquate(c1, c2).to_predicate(tcx) - } - } + ty::PredicateKind::ConstEquate(c1, c2) => ty::PredicateKind::ConstEquate(c1, c2), + }; + + if new != *kind { new.to_predicate(tcx) } else { pred } } struct PredicateSet<'tcx> { diff --git a/src/librustc_middle/ty/mod.rs b/src/librustc_middle/ty/mod.rs index 877784bc5066..8fa7061998fd 100644 --- a/src/librustc_middle/ty/mod.rs +++ b/src/librustc_middle/ty/mod.rs @@ -1032,6 +1032,7 @@ impl<'tcx> PartialEq for Predicate<'tcx> { impl<'tcx> Eq for Predicate<'tcx> {} impl<'tcx> Predicate<'tcx> { + #[inline(always)] pub fn kind(self) -> &'tcx PredicateKind<'tcx> { self.kind } @@ -1166,7 +1167,8 @@ impl<'tcx> Predicate<'tcx> { // this trick achieves that). let substs = &trait_ref.skip_binder().substs; - let predicate = match self.kind() { + let kind = self.kind(); + let new = match kind { &PredicateKind::Trait(ref binder, constness) => { PredicateKind::Trait(binder.map_bound(|data| data.subst(tcx, substs)), constness) } @@ -1195,7 +1197,7 @@ impl<'tcx> Predicate<'tcx> { } }; - predicate.to_predicate(tcx) + if new != *kind { new.to_predicate(tcx) } else { self } } } @@ -1314,6 +1316,7 @@ pub trait ToPredicate<'tcx> { } impl ToPredicate<'tcx> for PredicateKind<'tcx> { + #[inline(always)] fn to_predicate(&self, tcx: TyCtxt<'tcx>) -> Predicate<'tcx> { tcx.mk_predicate(*self) }