mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-26 00:34:06 +00:00
Auto merge of #119084 - aliemjay:perf-env-bounds, r=compiler-errors
fast path for declared_generic_bounds_from_env ~2% perf gain for diesel
This commit is contained in:
commit
57ad5058d6
@ -1,7 +1,7 @@
|
||||
use crate::infer::outlives::components::{compute_alias_components_recursive, Component};
|
||||
use crate::infer::outlives::env::RegionBoundPairs;
|
||||
use crate::infer::region_constraints::VerifyIfEq;
|
||||
use crate::infer::VerifyBound;
|
||||
use crate::infer::{GenericKind, VerifyBound};
|
||||
use rustc_data_structures::sso::SsoHashSet;
|
||||
use rustc_middle::ty::GenericArg;
|
||||
use rustc_middle::ty::{self, OutlivesPredicate, Ty, TyCtxt};
|
||||
@ -240,10 +240,20 @@ impl<'cx, 'tcx> VerifyBoundCx<'cx, 'tcx> {
|
||||
"declared_generic_bounds_from_env_for_erased_ty: region_bound_pair = {:?}",
|
||||
(r, p)
|
||||
);
|
||||
// Fast path for the common case.
|
||||
match (&p, erased_ty.kind()) {
|
||||
// In outlive routines, all types are expected to be fully normalized.
|
||||
// And therefore we can safely use structural equality for alias types.
|
||||
(GenericKind::Param(p1), ty::Param(p2)) if p1 == p2 => {}
|
||||
(GenericKind::Placeholder(p1), ty::Placeholder(p2)) if p1 == p2 => {}
|
||||
(GenericKind::Alias(a1), ty::Alias(_, a2)) if a1.def_id == a2.def_id => {}
|
||||
_ => return None,
|
||||
}
|
||||
|
||||
let p_ty = p.to_ty(tcx);
|
||||
let erased_p_ty = self.tcx.erase_regions(p_ty);
|
||||
(erased_p_ty == erased_ty)
|
||||
.then_some(ty::Binder::dummy(ty::OutlivesPredicate(p.to_ty(tcx), r)))
|
||||
.then_some(ty::Binder::dummy(ty::OutlivesPredicate(p_ty, r)))
|
||||
});
|
||||
|
||||
param_bounds
|
||||
|
Loading…
Reference in New Issue
Block a user