fix Predicate perf regression
This commit is contained in:
parent
810dbf7770
commit
f15e4b30c0
2 changed files with 17 additions and 20 deletions
|
|
@ -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> {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue