diff options
| author | Joshua Liebow-Feeser <hello@joshlf.com> | 2025-04-10 13:45:39 -0700 |
|---|---|---|
| committer | Joshua Liebow-Feeser <hello@joshlf.com> | 2025-04-23 11:45:00 -0700 |
| commit | 4326a44e6f0859077b7789d42416b9291b0ff4d1 (patch) | |
| tree | 713ed8f802314f672e8d51725b158eb1a6c1dc9e /compiler/rustc_transmute/src/layout/tree.rs | |
| parent | be181dd75c83d72fcc95538e235768bc367b76b9 (diff) | |
| download | rust-4326a44e6f0859077b7789d42416b9291b0ff4d1.tar.gz rust-4326a44e6f0859077b7789d42416b9291b0ff4d1.zip | |
transmutability: Mark edges by ranges, not values
In the `Tree` and `Dfa` representations of a type's layout, store byte ranges rather than needing to separately store each byte value. This permits us to, for example, represent a `u8` using a single 0..=255 edge in the DFA rather than using 256 separate edges. This leads to drastic performance improvements. For example, on the author's 2024 MacBook Pro, the time to convert the `Tree` representation of a `u64` to its equivalent DFA representation drops from ~8.5ms to ~1us, a reduction of ~8,500x. See `bench_dfa_from_tree`. Similarly, the time to execute a transmutability query from `u64` to `u64` drops from ~35us to ~1.7us, a reduction of ~20x. See `bench_transmute`.
Diffstat (limited to 'compiler/rustc_transmute/src/layout/tree.rs')
| -rw-r--r-- | compiler/rustc_transmute/src/layout/tree.rs | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/compiler/rustc_transmute/src/layout/tree.rs b/compiler/rustc_transmute/src/layout/tree.rs index 70ecc75403f..6a09be18ef9 100644 --- a/compiler/rustc_transmute/src/layout/tree.rs +++ b/compiler/rustc_transmute/src/layout/tree.rs @@ -54,22 +54,22 @@ where /// A `Tree` containing a single, uninitialized byte. pub(crate) fn uninit() -> Self { - Self::Byte(Byte::Uninit) + Self::Byte(Byte::uninit()) } /// A `Tree` representing the layout of `bool`. pub(crate) fn bool() -> Self { - Self::from_bits(0x00).or(Self::from_bits(0x01)) + Self::Byte(Byte::new(0x00..=0x01)) } /// A `Tree` whose layout matches that of a `u8`. pub(crate) fn u8() -> Self { - Self::Alt((0u8..=255).map(Self::from_bits).collect()) + Self::Byte(Byte::new(0x00..=0xFF)) } /// A `Tree` whose layout accepts exactly the given bit pattern. pub(crate) fn from_bits(bits: u8) -> Self { - Self::Byte(Byte::Init(bits)) + Self::Byte(Byte::from_val(bits)) } /// A `Tree` whose layout is a number of the given width. |
