Force-inline shallow_resolve
at its hottest call site.
It's a ~1% win on `keccak` and `inflate`.
This commit is contained in:
parent
3ac79c7184
commit
b73843f942
2 changed files with 11 additions and 2 deletions
|
@ -1116,7 +1116,11 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
||||||
self.resolve_type_vars_if_possible(t).to_string()
|
self.resolve_type_vars_if_possible(t).to_string()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn shallow_resolve(&self, typ: Ty<'tcx>) -> Ty<'tcx> {
|
// We have this force-inlined variant of shallow_resolve() for the one
|
||||||
|
// callsite that is extremely hot. All other callsites use the normal
|
||||||
|
// variant.
|
||||||
|
#[inline(always)]
|
||||||
|
pub fn inlined_shallow_resolve(&self, typ: Ty<'tcx>) -> Ty<'tcx> {
|
||||||
match typ.sty {
|
match typ.sty {
|
||||||
ty::TyInfer(ty::TyVar(v)) => {
|
ty::TyInfer(ty::TyVar(v)) => {
|
||||||
// Not entirely obvious: if `typ` is a type variable,
|
// Not entirely obvious: if `typ` is a type variable,
|
||||||
|
@ -1157,6 +1161,10 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn shallow_resolve(&self, typ: Ty<'tcx>) -> Ty<'tcx> {
|
||||||
|
self.inlined_shallow_resolve(typ)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn resolve_type_vars_if_possible<T>(&self, value: &T) -> T
|
pub fn resolve_type_vars_if_possible<T>(&self, value: &T) -> T
|
||||||
where T: TypeFoldable<'tcx>
|
where T: TypeFoldable<'tcx>
|
||||||
{
|
{
|
||||||
|
|
|
@ -269,7 +269,8 @@ impl<'a, 'b, 'gcx, 'tcx> ObligationProcessor for FulfillProcessor<'a, 'b, 'gcx,
|
||||||
// doing more work yet
|
// doing more work yet
|
||||||
if !pending_obligation.stalled_on.is_empty() {
|
if !pending_obligation.stalled_on.is_empty() {
|
||||||
if pending_obligation.stalled_on.iter().all(|&ty| {
|
if pending_obligation.stalled_on.iter().all(|&ty| {
|
||||||
let resolved_ty = self.selcx.infcx().shallow_resolve(&ty);
|
// Use the force-inlined variant of shallow_resolve() because this code is hot.
|
||||||
|
let resolved_ty = self.selcx.infcx().inlined_shallow_resolve(&ty);
|
||||||
resolved_ty == ty // nothing changed here
|
resolved_ty == ty // nothing changed here
|
||||||
}) {
|
}) {
|
||||||
debug!("process_predicate: pending obligation {:?} still stalled on {:?}",
|
debug!("process_predicate: pending obligation {:?} still stalled on {:?}",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue