Skip to content

Commit 1941c2c

Browse files
committed
inline CanonicalTyVarKind
1 parent 35fc072 commit 1941c2c

File tree

6 files changed

+58
-83
lines changed

6 files changed

+58
-83
lines changed

compiler/rustc_infer/src/infer/canonical/canonicalizer.rs

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use tracing::debug;
1717

1818
use crate::infer::InferCtxt;
1919
use crate::infer::canonical::{
20-
Canonical, CanonicalQueryInput, CanonicalTyVarKind, CanonicalVarKind, OriginalQueryValues,
20+
Canonical, CanonicalQueryInput, CanonicalVarKind, OriginalQueryValues,
2121
};
2222

2323
impl<'tcx> InferCtxt<'tcx> {
@@ -361,10 +361,7 @@ impl<'cx, 'tcx> TypeFolder<TyCtxt<'tcx>> for Canonicalizer<'cx, 'tcx> {
361361
// FIXME: perf problem described in #55921.
362362
ui = ty::UniverseIndex::ROOT;
363363
}
364-
self.canonicalize_ty_var(
365-
CanonicalVarKind::Ty(CanonicalTyVarKind::General(ui)),
366-
t,
367-
)
364+
self.canonicalize_ty_var(CanonicalVarKind::Ty(ui), t)
368365
}
369366
}
370367
}
@@ -374,15 +371,15 @@ impl<'cx, 'tcx> TypeFolder<TyCtxt<'tcx>> for Canonicalizer<'cx, 'tcx> {
374371
if nt != t {
375372
return self.fold_ty(nt);
376373
} else {
377-
self.canonicalize_ty_var(CanonicalVarKind::Ty(CanonicalTyVarKind::Int), t)
374+
self.canonicalize_ty_var(CanonicalVarKind::Int, t)
378375
}
379376
}
380377
ty::Infer(ty::FloatVar(vid)) => {
381378
let nt = self.infcx.unwrap().opportunistic_resolve_float_var(vid);
382379
if nt != t {
383380
return self.fold_ty(nt);
384381
} else {
385-
self.canonicalize_ty_var(CanonicalVarKind::Ty(CanonicalTyVarKind::Float), t)
382+
self.canonicalize_ty_var(CanonicalVarKind::Float, t)
386383
}
387384
}
388385

@@ -679,12 +676,10 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> {
679676
self.variables
680677
.iter()
681678
.map(|&kind| match kind {
682-
CanonicalVarKind::Ty(CanonicalTyVarKind::Int | CanonicalTyVarKind::Float) => {
679+
CanonicalVarKind::Int | CanonicalVarKind::Float => {
683680
return kind;
684681
}
685-
CanonicalVarKind::Ty(CanonicalTyVarKind::General(u)) => {
686-
CanonicalVarKind::Ty(CanonicalTyVarKind::General(reverse_universe_map[&u]))
687-
}
682+
CanonicalVarKind::Ty(u) => CanonicalVarKind::Ty(reverse_universe_map[&u]),
688683
CanonicalVarKind::Region(u) => CanonicalVarKind::Region(reverse_universe_map[&u]),
689684
CanonicalVarKind::Const(u) => CanonicalVarKind::Const(reverse_universe_map[&u]),
690685
CanonicalVarKind::PlaceholderTy(placeholder) => {

compiler/rustc_infer/src/infer/canonical/mod.rs

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -108,18 +108,11 @@ impl<'tcx> InferCtxt<'tcx> {
108108
universe_map: impl Fn(ty::UniverseIndex) -> ty::UniverseIndex,
109109
) -> GenericArg<'tcx> {
110110
match kind {
111-
CanonicalVarKind::Ty(ty_kind) => {
112-
let ty = match ty_kind {
113-
CanonicalTyVarKind::General(ui) => {
114-
self.next_ty_var_in_universe(span, universe_map(ui))
115-
}
111+
CanonicalVarKind::Ty(ui) => self.next_ty_var_in_universe(span, universe_map(ui)).into(),
116112

117-
CanonicalTyVarKind::Int => self.next_int_var(),
113+
CanonicalVarKind::Int => self.next_int_var().into(),
118114

119-
CanonicalTyVarKind::Float => self.next_float_var(),
120-
};
121-
ty.into()
122-
}
115+
CanonicalVarKind::Float => self.next_float_var().into(),
123116

124117
CanonicalVarKind::PlaceholderTy(ty::PlaceholderType { universe, bound }) => {
125118
let universe_mapped = universe_map(universe);

compiler/rustc_middle/src/infer/canonical.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ use rustc_data_structures::fx::FxHashMap;
2727
use rustc_data_structures::sync::Lock;
2828
use rustc_macros::{HashStable, TypeFoldable, TypeVisitable};
2929
pub use rustc_type_ir as ir;
30-
pub use rustc_type_ir::CanonicalTyVarKind;
3130
use smallvec::SmallVec;
3231

3332
use crate::mir::ConstraintCategory;

compiler/rustc_next_trait_solver/src/canonicalizer.rs

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@ use rustc_type_ir::data_structures::{HashMap, ensure_sufficient_stack};
22
use rustc_type_ir::inherent::*;
33
use rustc_type_ir::solve::{Goal, QueryInput};
44
use rustc_type_ir::{
5-
self as ty, Canonical, CanonicalParamEnvCacheEntry, CanonicalTyVarKind, CanonicalVarKind,
6-
Flags, InferCtxtLike, Interner, TypeFlags, TypeFoldable, TypeFolder, TypeSuperFoldable,
7-
TypeVisitableExt,
5+
self as ty, Canonical, CanonicalParamEnvCacheEntry, CanonicalVarKind, Flags, InferCtxtLike,
6+
Interner, TypeFlags, TypeFoldable, TypeFolder, TypeSuperFoldable, TypeVisitableExt,
87
};
98

109
use crate::delegate::SolverDelegate;
@@ -314,14 +313,12 @@ impl<'a, D: SolverDelegate<Interner = I>, I: Interner> Canonicalizer<'a, D, I> {
314313
);
315314

316315
match self.canonicalize_mode {
317-
CanonicalizeMode::Input { .. } => CanonicalVarKind::Ty(
318-
CanonicalTyVarKind::General(ty::UniverseIndex::ROOT),
319-
),
316+
CanonicalizeMode::Input { .. } => {
317+
CanonicalVarKind::Ty(ty::UniverseIndex::ROOT)
318+
}
320319
CanonicalizeMode::Response { .. } => {
321-
CanonicalVarKind::Ty(CanonicalTyVarKind::General(
322-
self.delegate.universe_of_ty(vid).unwrap_or_else(|| {
323-
panic!("ty var should have been resolved: {t:?}")
324-
}),
320+
CanonicalVarKind::Ty(self.delegate.universe_of_ty(vid).unwrap_or_else(
321+
|| panic!("ty var should have been resolved: {t:?}"),
325322
))
326323
}
327324
}
@@ -332,15 +329,15 @@ impl<'a, D: SolverDelegate<Interner = I>, I: Interner> Canonicalizer<'a, D, I> {
332329
t,
333330
"ty vid should have been resolved fully before canonicalization"
334331
);
335-
CanonicalVarKind::Ty(CanonicalTyVarKind::Int)
332+
CanonicalVarKind::Int
336333
}
337334
ty::FloatVar(vid) => {
338335
debug_assert_eq!(
339336
self.delegate.opportunistic_resolve_float_var(vid),
340337
t,
341338
"ty vid should have been resolved fully before canonicalization"
342339
);
343-
CanonicalVarKind::Ty(CanonicalTyVarKind::Float)
340+
CanonicalVarKind::Float
344341
}
345342
ty::FreshTy(_) | ty::FreshIntTy(_) | ty::FreshFloatTy(_) => {
346343
panic!("fresh vars not expected in canonicalization")

compiler/rustc_type_ir/src/canonical.rs

Lines changed: 31 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use std::fmt;
2-
use std::hash::Hash;
32
use std::ops::Index;
43

54
use derive_where::derive_where;
@@ -91,8 +90,14 @@ impl<I: Interner, V: fmt::Display> fmt::Display for Canonical<I, V> {
9190
derive(Decodable_NoContext, Encodable_NoContext, HashStable_NoContext)
9291
)]
9392
pub enum CanonicalVarKind<I: Interner> {
94-
/// Some kind of type inference variable.
95-
Ty(CanonicalTyVarKind),
93+
/// General type variable `?T` that can be unified with arbitrary types.
94+
Ty(UniverseIndex),
95+
96+
/// Integral type variable `?I` (that can only be unified with integral types).
97+
Int,
98+
99+
/// Floating-point type variable `?F` (that can only be unified with float types).
100+
Float,
96101

97102
/// A "placeholder" that represents "any type".
98103
PlaceholderTy(I::PlaceholderTy),
@@ -117,15 +122,13 @@ impl<I: Interner> Eq for CanonicalVarKind<I> {}
117122
impl<I: Interner> CanonicalVarKind<I> {
118123
pub fn universe(self) -> UniverseIndex {
119124
match self {
120-
CanonicalVarKind::Ty(CanonicalTyVarKind::General(ui)) => ui,
125+
CanonicalVarKind::Ty(ui) => ui,
121126
CanonicalVarKind::Region(ui) => ui,
122127
CanonicalVarKind::Const(ui) => ui,
123128
CanonicalVarKind::PlaceholderTy(placeholder) => placeholder.universe(),
124129
CanonicalVarKind::PlaceholderRegion(placeholder) => placeholder.universe(),
125130
CanonicalVarKind::PlaceholderConst(placeholder) => placeholder.universe(),
126-
CanonicalVarKind::Ty(CanonicalTyVarKind::Float | CanonicalTyVarKind::Int) => {
127-
UniverseIndex::ROOT
128-
}
131+
CanonicalVarKind::Float | CanonicalVarKind::Int => UniverseIndex::ROOT,
129132
}
130133
}
131134

@@ -135,9 +138,7 @@ impl<I: Interner> CanonicalVarKind<I> {
135138
/// the updated universe is not the root.
136139
pub fn with_updated_universe(self, ui: UniverseIndex) -> CanonicalVarKind<I> {
137140
match self {
138-
CanonicalVarKind::Ty(CanonicalTyVarKind::General(_)) => {
139-
CanonicalVarKind::Ty(CanonicalTyVarKind::General(ui))
140-
}
141+
CanonicalVarKind::Ty(_) => CanonicalVarKind::Ty(ui),
141142
CanonicalVarKind::Region(_) => CanonicalVarKind::Region(ui),
142143
CanonicalVarKind::Const(_) => CanonicalVarKind::Const(ui),
143144

@@ -150,7 +151,7 @@ impl<I: Interner> CanonicalVarKind<I> {
150151
CanonicalVarKind::PlaceholderConst(placeholder) => {
151152
CanonicalVarKind::PlaceholderConst(placeholder.with_updated_universe(ui))
152153
}
153-
CanonicalVarKind::Ty(CanonicalTyVarKind::Int | CanonicalTyVarKind::Float) => {
154+
CanonicalVarKind::Int | CanonicalVarKind::Float => {
154155
assert_eq!(ui, UniverseIndex::ROOT);
155156
self
156157
}
@@ -159,19 +160,23 @@ impl<I: Interner> CanonicalVarKind<I> {
159160

160161
pub fn is_existential(self) -> bool {
161162
match self {
162-
CanonicalVarKind::Ty(_) => true,
163-
CanonicalVarKind::PlaceholderTy(_) => false,
164-
CanonicalVarKind::Region(_) => true,
165-
CanonicalVarKind::PlaceholderRegion(..) => false,
166-
CanonicalVarKind::Const(_) => true,
167-
CanonicalVarKind::PlaceholderConst(_) => false,
163+
CanonicalVarKind::Ty(_)
164+
| CanonicalVarKind::Int
165+
| CanonicalVarKind::Float
166+
| CanonicalVarKind::Region(_)
167+
| CanonicalVarKind::Const(_) => true,
168+
CanonicalVarKind::PlaceholderTy(_)
169+
| CanonicalVarKind::PlaceholderRegion(..)
170+
| CanonicalVarKind::PlaceholderConst(_) => false,
168171
}
169172
}
170173

171174
pub fn is_region(self) -> bool {
172175
match self {
173176
CanonicalVarKind::Region(_) | CanonicalVarKind::PlaceholderRegion(_) => true,
174177
CanonicalVarKind::Ty(_)
178+
| CanonicalVarKind::Int
179+
| CanonicalVarKind::Float
175180
| CanonicalVarKind::PlaceholderTy(_)
176181
| CanonicalVarKind::Const(_)
177182
| CanonicalVarKind::PlaceholderConst(_) => false,
@@ -180,7 +185,11 @@ impl<I: Interner> CanonicalVarKind<I> {
180185

181186
pub fn expect_placeholder_index(self) -> usize {
182187
match self {
183-
CanonicalVarKind::Ty(_) | CanonicalVarKind::Region(_) | CanonicalVarKind::Const(_) => {
188+
CanonicalVarKind::Ty(_)
189+
| CanonicalVarKind::Int
190+
| CanonicalVarKind::Float
191+
| CanonicalVarKind::Region(_)
192+
| CanonicalVarKind::Const(_) => {
184193
panic!("expected placeholder: {self:?}")
185194
}
186195

@@ -191,27 +200,6 @@ impl<I: Interner> CanonicalVarKind<I> {
191200
}
192201
}
193202

194-
/// Rust actually has more than one category of type variables;
195-
/// notably, the type variables we create for literals (e.g., 22 or
196-
/// 22.) can only be instantiated with integral/float types (e.g.,
197-
/// usize or f32). In order to faithfully reproduce a type, we need to
198-
/// know what set of types a given type variable can be unified with.
199-
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
200-
#[cfg_attr(
201-
feature = "nightly",
202-
derive(Decodable_NoContext, Encodable_NoContext, HashStable_NoContext)
203-
)]
204-
pub enum CanonicalTyVarKind {
205-
/// General type variable `?T` that can be unified with arbitrary types.
206-
General(UniverseIndex),
207-
208-
/// Integral type variable `?I` (that can only be unified with integral types).
209-
Int,
210-
211-
/// Floating-point type variable `?F` (that can only be unified with float types).
212-
Float,
213-
}
214-
215203
/// A set of values corresponding to the canonical variables from some
216204
/// `Canonical`. You can give these values to
217205
/// `canonical_value.instantiate` to instantiate them into the canonical
@@ -287,7 +275,10 @@ impl<I: Interner> CanonicalVarValues<I> {
287275
var_values: cx.mk_args_from_iter(infos.iter().enumerate().map(
288276
|(i, kind)| -> I::GenericArg {
289277
match kind {
290-
CanonicalVarKind::Ty(_) | CanonicalVarKind::PlaceholderTy(_) => {
278+
CanonicalVarKind::Ty(_)
279+
| CanonicalVarKind::Int
280+
| CanonicalVarKind::Float
281+
| CanonicalVarKind::PlaceholderTy(_) => {
291282
Ty::new_anon_bound(cx, ty::INNERMOST, ty::BoundVar::from_usize(i))
292283
.into()
293284
}

tests/mir-opt/address_of.address_of_reborrow.SimplifyCfg-initial.after.mir

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,30 @@
11
// MIR for `address_of_reborrow` after SimplifyCfg-initial
22

33
| User Type Annotations
4-
| 0: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty(General(U0))] }, span: $DIR/address_of.rs:8:10: 8:18, inferred_ty: *const [i32; 10]
4+
| 0: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty(U0)] }, span: $DIR/address_of.rs:8:10: 8:18, inferred_ty: *const [i32; 10]
55
| 1: user_ty: Canonical { value: Ty(*const dyn std::marker::Send), max_universe: U0, variables: [Region(U0)] }, span: $DIR/address_of.rs:10:10: 10:25, inferred_ty: *const dyn std::marker::Send
6-
| 2: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty(General(U0))] }, span: $DIR/address_of.rs:14:12: 14:20, inferred_ty: *const [i32; 10]
7-
| 3: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty(General(U0))] }, span: $DIR/address_of.rs:14:12: 14:20, inferred_ty: *const [i32; 10]
6+
| 2: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty(U0)] }, span: $DIR/address_of.rs:14:12: 14:20, inferred_ty: *const [i32; 10]
7+
| 3: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty(U0)] }, span: $DIR/address_of.rs:14:12: 14:20, inferred_ty: *const [i32; 10]
88
| 4: user_ty: Canonical { value: Ty(*const [i32; 10]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:15:12: 15:28, inferred_ty: *const [i32; 10]
99
| 5: user_ty: Canonical { value: Ty(*const [i32; 10]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:15:12: 15:28, inferred_ty: *const [i32; 10]
1010
| 6: user_ty: Canonical { value: Ty(*const dyn std::marker::Send), max_universe: U0, variables: [Region(U0)] }, span: $DIR/address_of.rs:16:12: 16:27, inferred_ty: *const dyn std::marker::Send
1111
| 7: user_ty: Canonical { value: Ty(*const dyn std::marker::Send), max_universe: U0, variables: [Region(U0)] }, span: $DIR/address_of.rs:16:12: 16:27, inferred_ty: *const dyn std::marker::Send
1212
| 8: user_ty: Canonical { value: Ty(*const [i32]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:17:12: 17:24, inferred_ty: *const [i32]
1313
| 9: user_ty: Canonical { value: Ty(*const [i32]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:17:12: 17:24, inferred_ty: *const [i32]
14-
| 10: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty(General(U0))] }, span: $DIR/address_of.rs:19:10: 19:18, inferred_ty: *const [i32; 10]
14+
| 10: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty(U0)] }, span: $DIR/address_of.rs:19:10: 19:18, inferred_ty: *const [i32; 10]
1515
| 11: user_ty: Canonical { value: Ty(*const dyn std::marker::Send), max_universe: U0, variables: [Region(U0)] }, span: $DIR/address_of.rs:21:10: 21:25, inferred_ty: *const dyn std::marker::Send
16-
| 12: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty(General(U0))] }, span: $DIR/address_of.rs:24:12: 24:20, inferred_ty: *const [i32; 10]
17-
| 13: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty(General(U0))] }, span: $DIR/address_of.rs:24:12: 24:20, inferred_ty: *const [i32; 10]
16+
| 12: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty(U0)] }, span: $DIR/address_of.rs:24:12: 24:20, inferred_ty: *const [i32; 10]
17+
| 13: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty(U0)] }, span: $DIR/address_of.rs:24:12: 24:20, inferred_ty: *const [i32; 10]
1818
| 14: user_ty: Canonical { value: Ty(*const [i32; 10]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:25:12: 25:28, inferred_ty: *const [i32; 10]
1919
| 15: user_ty: Canonical { value: Ty(*const [i32; 10]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:25:12: 25:28, inferred_ty: *const [i32; 10]
2020
| 16: user_ty: Canonical { value: Ty(*const dyn std::marker::Send), max_universe: U0, variables: [Region(U0)] }, span: $DIR/address_of.rs:26:12: 26:27, inferred_ty: *const dyn std::marker::Send
2121
| 17: user_ty: Canonical { value: Ty(*const dyn std::marker::Send), max_universe: U0, variables: [Region(U0)] }, span: $DIR/address_of.rs:26:12: 26:27, inferred_ty: *const dyn std::marker::Send
2222
| 18: user_ty: Canonical { value: Ty(*const [i32]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:27:12: 27:24, inferred_ty: *const [i32]
2323
| 19: user_ty: Canonical { value: Ty(*const [i32]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:27:12: 27:24, inferred_ty: *const [i32]
24-
| 20: user_ty: Canonical { value: Ty(*mut ^0), max_universe: U0, variables: [Ty(General(U0))] }, span: $DIR/address_of.rs:29:10: 29:16, inferred_ty: *mut [i32; 10]
24+
| 20: user_ty: Canonical { value: Ty(*mut ^0), max_universe: U0, variables: [Ty(U0)] }, span: $DIR/address_of.rs:29:10: 29:16, inferred_ty: *mut [i32; 10]
2525
| 21: user_ty: Canonical { value: Ty(*mut dyn std::marker::Send), max_universe: U0, variables: [Region(U0)] }, span: $DIR/address_of.rs:31:10: 31:23, inferred_ty: *mut dyn std::marker::Send
26-
| 22: user_ty: Canonical { value: Ty(*mut ^0), max_universe: U0, variables: [Ty(General(U0))] }, span: $DIR/address_of.rs:34:12: 34:18, inferred_ty: *mut [i32; 10]
27-
| 23: user_ty: Canonical { value: Ty(*mut ^0), max_universe: U0, variables: [Ty(General(U0))] }, span: $DIR/address_of.rs:34:12: 34:18, inferred_ty: *mut [i32; 10]
26+
| 22: user_ty: Canonical { value: Ty(*mut ^0), max_universe: U0, variables: [Ty(U0)] }, span: $DIR/address_of.rs:34:12: 34:18, inferred_ty: *mut [i32; 10]
27+
| 23: user_ty: Canonical { value: Ty(*mut ^0), max_universe: U0, variables: [Ty(U0)] }, span: $DIR/address_of.rs:34:12: 34:18, inferred_ty: *mut [i32; 10]
2828
| 24: user_ty: Canonical { value: Ty(*mut [i32; 10]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:35:12: 35:26, inferred_ty: *mut [i32; 10]
2929
| 25: user_ty: Canonical { value: Ty(*mut [i32; 10]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:35:12: 35:26, inferred_ty: *mut [i32; 10]
3030
| 26: user_ty: Canonical { value: Ty(*mut dyn std::marker::Send), max_universe: U0, variables: [Region(U0)] }, span: $DIR/address_of.rs:36:12: 36:25, inferred_ty: *mut dyn std::marker::Send

0 commit comments

Comments
 (0)