diff options
| author | bors <bors@rust-lang.org> | 2023-12-19 19:17:25 +0000 | 
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2023-12-19 19:17:25 +0000 | 
| commit | 57ad5058d643d06c0e76bb85442ff9244d966f34 (patch) | |
| tree | e23f72f7fb8a9ce660e79153b001e058a2886e4e /compiler | |
| parent | 3a539c08891a422d34beb32d2556a08ea0357b7d (diff) | |
| parent | 27e964dbfb9907970e96bd40429563449000bfbe (diff) | |
| download | rust-57ad5058d643d06c0e76bb85442ff9244d966f34.tar.gz rust-57ad5058d643d06c0e76bb85442ff9244d966f34.zip | |
Auto merge of #119084 - aliemjay:perf-env-bounds, r=compiler-errors
fast path for declared_generic_bounds_from_env ~2% perf gain for diesel
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/rustc_infer/src/infer/outlives/verify.rs | 14 | 
1 files changed, 12 insertions, 2 deletions
| diff --git a/compiler/rustc_infer/src/infer/outlives/verify.rs b/compiler/rustc_infer/src/infer/outlives/verify.rs index bb578a482e4..dc298bb5acb 100644 --- a/compiler/rustc_infer/src/infer/outlives/verify.rs +++ b/compiler/rustc_infer/src/infer/outlives/verify.rs @@ -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 | 
