Skip to content

Commit 812566d

Browse files
committed
Auto merge of #136593 - lukas-code:ty-value-perf, r=oli-obk
valtree performance tuning Summary: This PR makes type checking of code with many type-level constants faster. After rust-lang/rust#136180 was merged, we observed a small perf regression (rust-lang/rust#136318 (comment)). This happened because that PR introduced additional copies in the fast reject code path for consts, which is very hot for certain crates: https://github.com/rust-lang/rust/blob/6c1d960d88dd3755548b3818630acb63fa98187e/compiler/rustc_type_ir/src/fast_reject.rs#L486-L487 This PR improves the performance again by properly interning the valtrees so that copying and comparing them becomes faster. This will become especially useful with `feature(adt_const_params)`, so the fast reject code doesn't have to do a deep compare of the valtrees. Note that we can't just compare the interned consts themselves in the fast reject, because sometimes `'static` lifetimes in the type are be replaced with inference variables (due to canonicalization) on one side but not the other. A less invasive alternative that I considered is simply avoiding copies introduced by rust-lang/rust#136180 and comparing the valtrees it in-place (see commit: rust-lang/rust@9e91e50 / perf results: rust-lang/rust#136593 (comment)), however that was still measurably slower than interning. There are some minor regressions in secondary benchmarks: These happen due to changes in memory allocations and seem acceptable to me. The crates that make heavy use of valtrees show no significant changes in memory usage.
2 parents 8b45f4a + db57a5f commit 812566d

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

src/mir/index.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -304,9 +304,9 @@ The most important rule for
304304
this representation is that every value must be uniquely represented. In other
305305
words: a specific value must only be representable in one specific way. For example: there is only
306306
one way to represent an array of two integers as a `ValTree`:
307-
`ValTree::Branch(&[ValTree::Leaf(first_int), ValTree::Leaf(second_int)])`.
307+
`Branch([Leaf(first_int), Leaf(second_int)])`.
308308
Even though theoretically a `[u32; 2]` could be encoded in a `u64` and thus just be a
309-
`ValTree::Leaf(bits_of_two_u32)`, that is not a legal construction of `ValTree`
309+
`Leaf(bits_of_two_u32)`, that is not a legal construction of `ValTree`
310310
(and is very complex to do, so it is unlikely anyone is tempted to do so).
311311

312312
These rules also mean that some values are not representable. There can be no `union`s in type

0 commit comments

Comments
 (0)