diff options
| author | bors <bors@rust-lang.org> | 2025-06-11 03:34:30 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2025-06-11 03:34:30 +0000 |
| commit | 2b0274c71dba0e24370ebf65593da450e2e91868 (patch) | |
| tree | 4539d26fd77a5b5f9a8b0115c2fc93acd2b7a8d1 | |
| parent | 1c047506f94cd2d05228eb992b0a6bbed1942349 (diff) | |
| parent | e1567dff243135a84f8e348528da782bee1d13e9 (diff) | |
| download | rust-2b0274c71dba0e24370ebf65593da450e2e91868.tar.gz rust-2b0274c71dba0e24370ebf65593da450e2e91868.zip | |
Auto merge of #142090 - compiler-errors:perf-stable-root-var, r=lcnr
Make root vars more stable Never resolve a ty/ct vid to a higher vid as its root. This should make the optimization in rust-lang/rust#141500 more "stable" when there are a lot of vars flying around. r? `@ghost`
| -rw-r--r-- | compiler/rustc_infer/src/infer/type_variable.rs | 3 | ||||
| -rw-r--r-- | compiler/rustc_infer/src/infer/unify_key.rs | 3 | ||||
| -rw-r--r-- | compiler/rustc_type_ir/src/ty_kind.rs | 17 |
3 files changed, 6 insertions, 17 deletions
diff --git a/compiler/rustc_infer/src/infer/type_variable.rs b/compiler/rustc_infer/src/infer/type_variable.rs index 2086483b94a..6f6791804d3 100644 --- a/compiler/rustc_infer/src/infer/type_variable.rs +++ b/compiler/rustc_infer/src/infer/type_variable.rs @@ -238,6 +238,9 @@ impl<'tcx> ut::UnifyKey for TyVidEqKey<'tcx> { fn tag() -> &'static str { "TyVidEqKey" } + fn order_roots(a: Self, _: &Self::Value, b: Self, _: &Self::Value) -> Option<(Self, Self)> { + if a.vid.as_u32() < b.vid.as_u32() { Some((a, b)) } else { Some((b, a)) } + } } impl<'tcx> ut::UnifyValue for TypeVariableValue<'tcx> { diff --git a/compiler/rustc_infer/src/infer/unify_key.rs b/compiler/rustc_infer/src/infer/unify_key.rs index 3ba8aea1d3a..5e5d0e063a0 100644 --- a/compiler/rustc_infer/src/infer/unify_key.rs +++ b/compiler/rustc_infer/src/infer/unify_key.rs @@ -137,6 +137,9 @@ impl<'tcx> UnifyKey for ConstVidKey<'tcx> { fn tag() -> &'static str { "ConstVidKey" } + fn order_roots(a: Self, _: &Self::Value, b: Self, _: &Self::Value) -> Option<(Self, Self)> { + if a.vid.as_u32() < b.vid.as_u32() { Some((a, b)) } else { Some((b, a)) } + } } impl<'tcx> UnifyValue for ConstVariableValue<'tcx> { diff --git a/compiler/rustc_type_ir/src/ty_kind.rs b/compiler/rustc_type_ir/src/ty_kind.rs index 0cd98b5aa53..9669772d1a6 100644 --- a/compiler/rustc_type_ir/src/ty_kind.rs +++ b/compiler/rustc_type_ir/src/ty_kind.rs @@ -771,23 +771,6 @@ pub enum InferTy { FreshFloatTy(u32), } -/// Raw `TyVid` are used as the unification key for `sub_relations`; -/// they carry no values. -impl UnifyKey for TyVid { - type Value = (); - #[inline] - fn index(&self) -> u32 { - self.as_u32() - } - #[inline] - fn from_index(i: u32) -> TyVid { - TyVid::from_u32(i) - } - fn tag() -> &'static str { - "TyVid" - } -} - impl UnifyValue for IntVarValue { type Error = NoError; |
