Clean up and speed up inference variable resolving code - #160913
Clean up and speed up inference variable resolving code#160913jdonszelmann wants to merge 4 commits into
Conversation
|
@bors try @rust-timer queue |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
Clean up and speed up resolving code
This comment has been minimized.
This comment has been minimized.
3dde145 to
b5fe24d
Compare
This comment has been minimized.
This comment has been minimized.
| match self.inner.borrow_mut().type_variables().probe(vid) { | ||
| TypeVariableValue::Known { value } => Ok(value), | ||
| match value { | ||
| TypeVariableValue::Known { value } => Ok(self.shallow_resolve_non_recursive(value)), |
There was a problem hiding this comment.
this method (and the one below) now also does the recursive resolving shallow_resolve already did. No tests change here.
| // Cold because the case in which a tyvar resolves to an intvar which resolves to a type is | ||
| // quite rare. It's way more common for `shallow_resolve_non_recursive` to return ty. | ||
| #[cold] | ||
| fn shallow_resolve_infer_non_recursive(&self, infer: InferTy, ty: Ty<'tcx>) -> Ty<'tcx> { |
There was a problem hiding this comment.
the non-recursive caase helps ~0.5% on local benchmarks. Not much, but still a bit.
| /// In cases where we do, this can aid performance. | ||
| #[inline(always)] | ||
| fn shallow_resolve_ty_var(&self, v: TyVid, ty: Ty<'tcx>) -> Ty<'tcx> { | ||
| fn shallow_resolve_ty_var_with_ty(&self, v: TyVid, ty: Option<Ty<'tcx>>) -> Ty<'tcx> { |
There was a problem hiding this comment.
By taking an Option here, we can merge more methods' implementations. Doing this has 0 performance overhead, #[inline(always)] makes sure the callsites that always call with Some get optimized properly.
There was a problem hiding this comment.
could we instead change this function to not take a ty and return and Option instead?
This comment has been minimized.
This comment has been minimized.
|
💔 Test for 7e8d4ec failed: CI. Failed job:
|
b5fe24d to
6b88c26
Compare
|
@bors try (failed due to missing rustdoc changes now applied) |
|
Unknown argument "(failed". Did you mean to use |
This comment has been minimized.
This comment has been minimized.
|
@bors try |
This comment has been minimized.
This comment has been minimized.
Clean up and speed up resolving code
This comment has been minimized.
This comment has been minimized.
|
@rustbot review |
| Ty::new_int_var(self.tcx, inner.int_unification_table().find(vid)) | ||
| } | ||
| } | ||
| pub fn shallow_resolve_int_var(&self, vid: ty::IntVid) -> Ty<'tcx> { |
There was a problem hiding this comment.
if we return None if the inner function doesn't make progress, could we always be explicit about reconstructing the type in the caller to make it explicit where we (likely unnecessarily) do so?
| .borrow_mut() | ||
| .unwrap_region_constraints() | ||
| .opportunistic_resolve_var(canonicalizer.tcx, vid); | ||
| .shallow_resolve_region_var(canonicalizer.tcx, vid); |
There was a problem hiding this comment.
we don't reuse r here if the root doesn't change 🤔 feels like doing so would be good for perf 🤔
This comment was marked as outdated.
This comment was marked as outdated.
This comment has been minimized.
This comment has been minimized.
06dd748 to
9ddd601
Compare
This comment has been minimized.
This comment has been minimized.
9ddd601 to
68fded2
Compare
This comment has been minimized.
This comment has been minimized.
68fded2 to
aad9f36
Compare
This comment has been minimized.
This comment has been minimized.
| &mut self, | ||
| tcx: TyCtxt<'tcx>, | ||
| vid: ty::RegionVid, | ||
| ) -> ty::Region<'tcx> { |
There was a problem hiding this comment.
also separate: I feel like shallow_resolve_X should return Option and None if the vid doesn't change 🤔
there are a bunch of callers which shouldn't rebuild the ty/region here
| Err(_) => Ty::new_var(self.tcx, self.root_var(vid)), | ||
| } | ||
| fn shallow_resolve_ty_var(&self, vid: ty::TyVid) -> Ty<'tcx> { | ||
| self.shallow_resolve_ty_var_with_ty(vid, None) |
There was a problem hiding this comment.
I dislike this function. Imo we should instead have shallow_resolve_ty_var_with_ty return Option<Ty> and then do the unwrap_or(ty) in the caller
| /// Resolve a type variable to a type, if known. | ||
| /// Otherwise return a type with the root vid in it. | ||
| #[inline(always)] | ||
| fn shallow_resolve_ty_var_with_ty(&self, v: TyVid, ty: Option<Ty<'tcx>>) -> Ty<'tcx> { |
This comment was marked as outdated.
This comment was marked as outdated.
aad9f36 to
25e4653
Compare
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
…er a shallow_resolve
25e4653 to
5ca7e19
Compare
|
This PR was rebased onto a different main commit. Here's a range-diff highlighting what actually changed. Rebasing is a normal part of keeping PRs up to date, so no action is needed—this note is just to help reviewers. |
View all comments
r? @lcnr
As part of #162126, I found some small performance wins resulting from the fact that
shallow_resolvenow returns root vids.Note
I've not used an LLM for any part of this PR, or any other PR I make. This includes any related work like research.