Auto merge of #99232 - lcnr:no-bound-vars-check, r=jackh726
`replace_bound_vars` fast path: check predicates, don't check consts split out from #98900 `ty::Const` doesn't have precomputed type flags, so computing `has_vars_bound_at_or_above` for constants requires us to visit the const and its contained types and constants. A noop fold should be pretty much equally as fast so removing it prevents us from walking the constant twice in case it contains bound vars. r? `@jackh726`
This commit is contained in:
commit
144227dae9
2 changed files with 10 additions and 4 deletions
|
@ -445,10 +445,13 @@ impl<'a, 'tcx> TypeFolder<'tcx> for BoundVarReplacer<'a, 'tcx> {
|
||||||
let ct = (self.fld_c)(bound_const, ct.ty());
|
let ct = (self.fld_c)(bound_const, ct.ty());
|
||||||
ty::fold::shift_vars(self.tcx, ct, self.current_index.as_u32())
|
ty::fold::shift_vars(self.tcx, ct, self.current_index.as_u32())
|
||||||
}
|
}
|
||||||
_ if ct.has_vars_bound_at_or_above(self.current_index) => ct.super_fold_with(self),
|
_ => ct.super_fold_with(self),
|
||||||
_ => ct,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn fold_predicate(&mut self, p: ty::Predicate<'tcx>) -> ty::Predicate<'tcx> {
|
||||||
|
if p.has_vars_bound_at_or_above(self.current_index) { p.super_fold_with(self) } else { p }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> TyCtxt<'tcx> {
|
impl<'tcx> TyCtxt<'tcx> {
|
||||||
|
|
|
@ -753,10 +753,13 @@ impl<'tcx> TypeFolder<'tcx> for BoundVarReplacer<'_, 'tcx> {
|
||||||
.tcx
|
.tcx
|
||||||
.mk_const(ty::ConstS { kind: ty::ConstKind::Placeholder(p), ty: ct.ty() })
|
.mk_const(ty::ConstS { kind: ty::ConstKind::Placeholder(p), ty: ct.ty() })
|
||||||
}
|
}
|
||||||
_ if ct.has_vars_bound_at_or_above(self.current_index) => ct.super_fold_with(self),
|
_ => ct.super_fold_with(self),
|
||||||
_ => ct,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn fold_predicate(&mut self, p: ty::Predicate<'tcx>) -> ty::Predicate<'tcx> {
|
||||||
|
if p.has_vars_bound_at_or_above(self.current_index) { p.super_fold_with(self) } else { p }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// The inverse of `BoundVarReplacer`: replaces placeholders with the bound vars from which they came.
|
// The inverse of `BoundVarReplacer`: replaces placeholders with the bound vars from which they came.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue