diff options
| author | kadmin <julianknodt@gmail.com> | 2022-06-24 08:48:07 +0000 |
|---|---|---|
| committer | kadmin <julianknodt@gmail.com> | 2023-02-07 09:37:55 +0000 |
| commit | 15f4eec7a986e6c9125ff3e0115d70aef6d5c711 (patch) | |
| tree | 67cd590dd765ce493ffe8f9d4620bc079298d429 | |
| parent | 610e1a1e05e7160d775f433855138f6063169c56 (diff) | |
| download | rust-15f4eec7a986e6c9125ff3e0115d70aef6d5c711.tar.gz rust-15f4eec7a986e6c9125ff3e0115d70aef6d5c711.zip | |
Leave FIXME for wasm layout difference.
There is a distinction between running this on wasm and i686, even though they should be identical. This technically is not _incorrect_, it's just an unexpected difference, which is worth investigating, but not for correctness.
| -rw-r--r-- | compiler/rustc_mir_transform/src/large_enums.rs | 42 | ||||
| -rw-r--r-- | compiler/rustc_mir_transform/src/lib.rs | 2 | ||||
| -rw-r--r-- | tests/mir-opt/enum_opt.cand.EnumSizeOpt.32bit.diff | 84 | ||||
| -rw-r--r-- | tests/mir-opt/enum_opt.cand.EnumSizeOpt.64bit.diff | 84 | ||||
| -rw-r--r-- | tests/mir-opt/enum_opt.invalid.EnumSizeOpt.32bit.diff | 44 | ||||
| -rw-r--r-- | tests/mir-opt/enum_opt.invalid.EnumSizeOpt.64bit.diff | 44 | ||||
| -rw-r--r-- | tests/mir-opt/enum_opt.rs | 16 | ||||
| -rw-r--r-- | tests/mir-opt/enum_opt.trunc.EnumSizeOpt.32bit.diff | 66 | ||||
| -rw-r--r-- | tests/mir-opt/enum_opt.trunc.EnumSizeOpt.64bit.diff | 66 | ||||
| -rw-r--r-- | tests/mir-opt/enum_opt.unin.EnumSizeOpt.32bit.diff | 82 | ||||
| -rw-r--r-- | tests/mir-opt/enum_opt.unin.EnumSizeOpt.64bit.diff | 82 |
11 files changed, 297 insertions, 315 deletions
diff --git a/compiler/rustc_mir_transform/src/large_enums.rs b/compiler/rustc_mir_transform/src/large_enums.rs index 1919720de49..3f8662ad697 100644 --- a/compiler/rustc_mir_transform/src/large_enums.rs +++ b/compiler/rustc_mir_transform/src/large_enums.rs @@ -1,6 +1,6 @@ use crate::rustc_middle::ty::util::IntTypeExt; use crate::MirPass; -use rustc_data_structures::stable_map::FxHashMap; +use rustc_data_structures::fx::FxHashMap; use rustc_middle::mir::interpret::AllocId; use rustc_middle::mir::*; use rustc_middle::ty::{self, AdtDef, Const, ParamEnv, Ty, TyCtxt}; @@ -19,6 +19,10 @@ use rustc_target::abi::{HasDataLayout, Size, TagEncoding, Variants}; /// Instead of emitting moves of the large variant, /// Perform a memcpy instead. /// Based off of [this HackMD](https://hackmd.io/@ft4bxUsFT5CEUBmRKYHr7w/rJM8BBPzD). +/// +/// In summary, what this does is at runtime determine which enum variant is active, +/// and instead of copying all the bytes of the largest possible variant, +/// copy only the bytes for the currently active variant. pub struct EnumSizeOpt { pub(crate) discrepancy: u64, } @@ -26,7 +30,10 @@ pub struct EnumSizeOpt { impl<'tcx> MirPass<'tcx> for EnumSizeOpt { fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) { let sess = tcx.sess; - if (!sess.opts.debugging_opts.unsound_mir_opts) || sess.mir_opt_level() < 3 { + // FIXME(julianknodt): one thing noticed while testing this mir-opt is that there is a + // different layout of large enums on wasm. It's not clear what is causing this layout + // difference, as it should be identical to i686 (32 bit). + if (!sess.opts.unstable_opts.unsound_mir_opts) || sess.mir_opt_level() < 3 { return; } self.optim(tcx, body); @@ -56,8 +63,8 @@ impl EnumSizeOpt { Variants::Multiple { variants, .. } if variants.len() <= 1 => return None, Variants::Multiple { variants, .. } => variants, }; - let min = variants.iter().map(|v| v.size()).min().unwrap(); - let max = variants.iter().map(|v| v.size()).max().unwrap(); + let min = variants.iter().map(|v| v.size).min().unwrap(); + let max = variants.iter().map(|v| v.size).max().unwrap(); if max.bytes() - min.bytes() < self.discrepancy { return None; } @@ -92,7 +99,7 @@ impl EnumSizeOpt { for (var_idx, layout) in variants.iter_enumerated() { let curr_idx = target_bytes * adt_def.discriminant_for_variant(tcx, var_idx).val as usize; - let sz = layout.size(); + let sz = layout.size; match ptr_sized_int { rustc_target::abi::Integer::I32 => { encode_store!(curr_idx, data_layout.endian, sz.bytes() as u32); @@ -115,8 +122,11 @@ impl EnumSizeOpt { let mut alloc_cache = FxHashMap::default(); let body_did = body.source.def_id(); let param_env = tcx.param_env(body_did); - let (bbs, local_decls) = body.basic_blocks_and_local_decls_mut(); - for bb in bbs { + + let blocks = body.basic_blocks.as_mut(); + let local_decls = &mut body.local_decls; + + for bb in blocks { bb.expand_statements(|st| { if let StatementKind::Assign(box ( lhs, @@ -175,7 +185,7 @@ impl EnumSizeOpt { kind: StatementKind::Assign(box ( discr_cast_place, Rvalue::Cast( - CastKind::Misc, + CastKind::IntToInt, Operand::Copy(discr_place), tcx.types.usize, ), @@ -217,7 +227,7 @@ impl EnumSizeOpt { source_info, kind: StatementKind::Assign(box ( dst_cast_place, - Rvalue::Cast(CastKind::Misc, Operand::Copy(dst), dst_cast_ty), + Rvalue::Cast(CastKind::PtrToPtr, Operand::Copy(dst), dst_cast_ty), )), }; @@ -240,17 +250,19 @@ impl EnumSizeOpt { source_info, kind: StatementKind::Assign(box ( src_cast_place, - Rvalue::Cast(CastKind::Misc, Operand::Copy(src), src_cast_ty), + Rvalue::Cast(CastKind::PtrToPtr, Operand::Copy(src), src_cast_ty), )), }; let copy_bytes = Statement { source_info, - kind: StatementKind::CopyNonOverlapping(box CopyNonOverlapping { - src: Operand::Copy(src_cast_place), - dst: Operand::Copy(dst_cast_place), - count: Operand::Copy(size_place), - }), + kind: StatementKind::Intrinsic( + box NonDivergingIntrinsic::CopyNonOverlapping(CopyNonOverlapping { + src: Operand::Copy(src_cast_place), + dst: Operand::Copy(dst_cast_place), + count: Operand::Copy(size_place), + }), + ), }; let store_dead = Statement { diff --git a/compiler/rustc_mir_transform/src/lib.rs b/compiler/rustc_mir_transform/src/lib.rs index 8cd268eb6ce..be3652dd3e7 100644 --- a/compiler/rustc_mir_transform/src/lib.rs +++ b/compiler/rustc_mir_transform/src/lib.rs @@ -1,8 +1,8 @@ #![allow(rustc::potential_query_instability)] #![feature(box_patterns)] #![feature(drain_filter)] +#![feature(box_syntax)] #![feature(let_chains)] -#![feature(let_else)] #![feature(map_try_insert)] #![feature(min_specialization)] #![feature(never_type)] diff --git a/tests/mir-opt/enum_opt.cand.EnumSizeOpt.32bit.diff b/tests/mir-opt/enum_opt.cand.EnumSizeOpt.32bit.diff index 859fddd65c1..e0ba46c15f4 100644 --- a/tests/mir-opt/enum_opt.cand.EnumSizeOpt.32bit.diff +++ b/tests/mir-opt/enum_opt.cand.EnumSizeOpt.32bit.diff @@ -2,54 +2,50 @@ + // MIR for `cand` after EnumSizeOpt fn cand() -> () { - let mut _0: (); // return place in scope 0 at $DIR/enum_opt.rs:50:15: 50:15 - let mut _1: Candidate; // in scope 0 at $DIR/enum_opt.rs:51:7: 51:12 - let mut _2: Candidate; // in scope 0 at $DIR/enum_opt.rs:52:7: 52:34 - let mut _3: [u64; 1024]; // in scope 0 at $DIR/enum_opt.rs:52:24: 52:33 -+ let mut _4: [usize; 2]; // in scope 0 at $DIR/enum_opt.rs:52:3: 52:34 -+ let mut _5: isize; // in scope 0 at $DIR/enum_opt.rs:52:3: 52:34 -+ let mut _6: usize; // in scope 0 at $DIR/enum_opt.rs:52:3: 52:34 -+ let mut _7: usize; // in scope 0 at $DIR/enum_opt.rs:52:3: 52:34 -+ let mut _8: *mut Candidate; // in scope 0 at $DIR/enum_opt.rs:52:3: 52:34 -+ let mut _9: *mut u8; // in scope 0 at $DIR/enum_opt.rs:52:3: 52:34 -+ let mut _10: *const Candidate; // in scope 0 at $DIR/enum_opt.rs:52:3: 52:34 -+ let mut _11: *const u8; // in scope 0 at $DIR/enum_opt.rs:52:3: 52:34 + let mut _0: (); // return place in scope 0 at $DIR/enum_opt.rs:+0:15: +0:15 + let mut _1: Candidate; // in scope 0 at $DIR/enum_opt.rs:+1:7: +1:12 + let mut _2: Candidate; // in scope 0 at $DIR/enum_opt.rs:+2:7: +2:34 + let mut _3: [u64; 1024]; // in scope 0 at $DIR/enum_opt.rs:+2:24: +2:33 ++ let mut _4: [usize; 2]; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:34 ++ let mut _5: isize; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:34 ++ let mut _6: usize; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:34 ++ let mut _7: usize; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:34 ++ let mut _8: *mut Candidate; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:34 ++ let mut _9: *mut u8; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:34 ++ let mut _10: *const Candidate; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:34 ++ let mut _11: *const u8; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:34 scope 1 { - debug a => _1; // in scope 1 at $DIR/enum_opt.rs:51:7: 51:12 + debug a => _1; // in scope 1 at $DIR/enum_opt.rs:+1:7: +1:12 } bb0: { - StorageLive(_1); // scope 0 at $DIR/enum_opt.rs:51:7: 51:12 - Deinit(_1); // scope 0 at $DIR/enum_opt.rs:51:15: 51:34 - ((_1 as Small).0: u8) = const 1_u8; // scope 0 at $DIR/enum_opt.rs:51:15: 51:34 - discriminant(_1) = 0; // scope 0 at $DIR/enum_opt.rs:51:15: 51:34 - StorageLive(_2); // scope 1 at $DIR/enum_opt.rs:52:7: 52:34 - StorageLive(_3); // scope 1 at $DIR/enum_opt.rs:52:24: 52:33 - _3 = [const 1_u64; 1024]; // scope 1 at $DIR/enum_opt.rs:52:24: 52:33 - Deinit(_2); // scope 1 at $DIR/enum_opt.rs:52:7: 52:34 - ((_2 as Large).0: [u64; 1024]) = move _3; // scope 1 at $DIR/enum_opt.rs:52:7: 52:34 - discriminant(_2) = 1; // scope 1 at $DIR/enum_opt.rs:52:7: 52:34 - StorageDead(_3); // scope 1 at $DIR/enum_opt.rs:52:33: 52:34 -- _1 = move _2; // scope 1 at $DIR/enum_opt.rs:52:3: 52:34 -+ StorageLive(_4); // scope 1 at $DIR/enum_opt.rs:52:3: 52:34 -+ _4 = const [2_usize, 8196_usize]; // scope 1 at $DIR/enum_opt.rs:52:3: 52:34 -+ _5 = discriminant(_2); // scope 1 at $DIR/enum_opt.rs:52:3: 52:34 -+ _6 = _5 as usize (Misc); // scope 1 at $DIR/enum_opt.rs:52:3: 52:34 -+ _7 = _4[_6]; // scope 1 at $DIR/enum_opt.rs:52:3: 52:34 -+ _8 = &raw mut _1; // scope 1 at $DIR/enum_opt.rs:52:3: 52:34 -+ _9 = _8 as *mut u8 (Misc); // scope 1 at $DIR/enum_opt.rs:52:3: 52:34 -+ _10 = &raw const _2; // scope 1 at $DIR/enum_opt.rs:52:3: 52:34 -+ _11 = _10 as *const u8 (Misc); // scope 1 at $DIR/enum_opt.rs:52:3: 52:34 -+ copy_nonoverlapping(src=_11, dst=_9, count=_7); // scope 1 at $DIR/enum_opt.rs:52:3: 52:34 -+ StorageDead(_4); // scope 1 at $DIR/enum_opt.rs:52:3: 52:34 - StorageDead(_2); // scope 1 at $DIR/enum_opt.rs:52:33: 52:34 - _0 = const (); // scope 0 at $DIR/enum_opt.rs:50:15: 53:2 - StorageDead(_1); // scope 0 at $DIR/enum_opt.rs:53:1: 53:2 - return; // scope 0 at $DIR/enum_opt.rs:53:2: 53:2 - } - - bb1 (cleanup): { - resume; // scope 0 at $DIR/enum_opt.rs:50:1: 53:2 + StorageLive(_1); // scope 0 at $DIR/enum_opt.rs:+1:7: +1:12 + Deinit(_1); // scope 0 at $DIR/enum_opt.rs:+1:15: +1:34 + ((_1 as Small).0: u8) = const 1_u8; // scope 0 at $DIR/enum_opt.rs:+1:15: +1:34 + discriminant(_1) = 0; // scope 0 at $DIR/enum_opt.rs:+1:15: +1:34 + StorageLive(_2); // scope 1 at $DIR/enum_opt.rs:+2:7: +2:34 + StorageLive(_3); // scope 1 at $DIR/enum_opt.rs:+2:24: +2:33 + _3 = [const 1_u64; 1024]; // scope 1 at $DIR/enum_opt.rs:+2:24: +2:33 + Deinit(_2); // scope 1 at $DIR/enum_opt.rs:+2:7: +2:34 + ((_2 as Large).0: [u64; 1024]) = move _3; // scope 1 at $DIR/enum_opt.rs:+2:7: +2:34 + discriminant(_2) = 1; // scope 1 at $DIR/enum_opt.rs:+2:7: +2:34 + StorageDead(_3); // scope 1 at $DIR/enum_opt.rs:+2:33: +2:34 +- _1 = move _2; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34 ++ StorageLive(_4); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34 ++ _4 = const [2_usize, 8196_usize]; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34 ++ _5 = discriminant(_2); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34 ++ _6 = _5 as usize (IntToInt); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34 ++ _7 = _4[_6]; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34 ++ _8 = &raw mut _1; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34 ++ _9 = _8 as *mut u8 (PtrToPtr); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34 ++ _10 = &raw const _2; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34 ++ _11 = _10 as *const u8 (PtrToPtr); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34 ++ copy_nonoverlapping(dst = _9, src = _11, count = _7); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34 ++ StorageDead(_4); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34 + StorageDead(_2); // scope 1 at $DIR/enum_opt.rs:+2:33: +2:34 + _0 = const (); // scope 0 at $DIR/enum_opt.rs:+0:15: +3:2 + StorageDead(_1); // scope 0 at $DIR/enum_opt.rs:+3:1: +3:2 + return; // scope 0 at $DIR/enum_opt.rs:+3:2: +3:2 } } diff --git a/tests/mir-opt/enum_opt.cand.EnumSizeOpt.64bit.diff b/tests/mir-opt/enum_opt.cand.EnumSizeOpt.64bit.diff index c3325f2d81f..67439dba9c9 100644 --- a/tests/mir-opt/enum_opt.cand.EnumSizeOpt.64bit.diff +++ b/tests/mir-opt/enum_opt.cand.EnumSizeOpt.64bit.diff @@ -2,54 +2,50 @@ + // MIR for `cand` after EnumSizeOpt fn cand() -> () { - let mut _0: (); // return place in scope 0 at $DIR/enum_opt.rs:50:15: 50:15 - let mut _1: Candidate; // in scope 0 at $DIR/enum_opt.rs:51:7: 51:12 - let mut _2: Candidate; // in scope 0 at $DIR/enum_opt.rs:52:7: 52:34 - let mut _3: [u64; 1024]; // in scope 0 at $DIR/enum_opt.rs:52:24: 52:33 -+ let mut _4: [usize; 2]; // in scope 0 at $DIR/enum_opt.rs:52:3: 52:34 -+ let mut _5: isize; // in scope 0 at $DIR/enum_opt.rs:52:3: 52:34 -+ let mut _6: usize; // in scope 0 at $DIR/enum_opt.rs:52:3: 52:34 -+ let mut _7: usize; // in scope 0 at $DIR/enum_opt.rs:52:3: 52:34 -+ let mut _8: *mut Candidate; // in scope 0 at $DIR/enum_opt.rs:52:3: 52:34 -+ let mut _9: *mut u8; // in scope 0 at $DIR/enum_opt.rs:52:3: 52:34 -+ let mut _10: *const Candidate; // in scope 0 at $DIR/enum_opt.rs:52:3: 52:34 -+ let mut _11: *const u8; // in scope 0 at $DIR/enum_opt.rs:52:3: 52:34 + let mut _0: (); // return place in scope 0 at $DIR/enum_opt.rs:+0:15: +0:15 + let mut _1: Candidate; // in scope 0 at $DIR/enum_opt.rs:+1:7: +1:12 + let mut _2: Candidate; // in scope 0 at $DIR/enum_opt.rs:+2:7: +2:34 + let mut _3: [u64; 1024]; // in scope 0 at $DIR/enum_opt.rs:+2:24: +2:33 ++ let mut _4: [usize; 2]; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:34 ++ let mut _5: isize; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:34 ++ let mut _6: usize; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:34 ++ let mut _7: usize; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:34 ++ let mut _8: *mut Candidate; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:34 ++ let mut _9: *mut u8; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:34 ++ let mut _10: *const Candidate; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:34 ++ let mut _11: *const u8; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:34 scope 1 { - debug a => _1; // in scope 1 at $DIR/enum_opt.rs:51:7: 51:12 + debug a => _1; // in scope 1 at $DIR/enum_opt.rs:+1:7: +1:12 } bb0: { - StorageLive(_1); // scope 0 at $DIR/enum_opt.rs:51:7: 51:12 - Deinit(_1); // scope 0 at $DIR/enum_opt.rs:51:15: 51:34 - ((_1 as Small).0: u8) = const 1_u8; // scope 0 at $DIR/enum_opt.rs:51:15: 51:34 - discriminant(_1) = 0; // scope 0 at $DIR/enum_opt.rs:51:15: 51:34 - StorageLive(_2); // scope 1 at $DIR/enum_opt.rs:52:7: 52:34 - StorageLive(_3); // scope 1 at $DIR/enum_opt.rs:52:24: 52:33 - _3 = [const 1_u64; 1024]; // scope 1 at $DIR/enum_opt.rs:52:24: 52:33 - Deinit(_2); // scope 1 at $DIR/enum_opt.rs:52:7: 52:34 - ((_2 as Large).0: [u64; 1024]) = move _3; // scope 1 at $DIR/enum_opt.rs:52:7: 52:34 - discriminant(_2) = 1; // scope 1 at $DIR/enum_opt.rs:52:7: 52:34 - StorageDead(_3); // scope 1 at $DIR/enum_opt.rs:52:33: 52:34 -- _1 = move _2; // scope 1 at $DIR/enum_opt.rs:52:3: 52:34 -+ StorageLive(_4); // scope 1 at $DIR/enum_opt.rs:52:3: 52:34 -+ _4 = const [2_usize, 8200_usize]; // scope 1 at $DIR/enum_opt.rs:52:3: 52:34 -+ _5 = discriminant(_2); // scope 1 at $DIR/enum_opt.rs:52:3: 52:34 -+ _6 = _5 as usize (Misc); // scope 1 at $DIR/enum_opt.rs:52:3: 52:34 -+ _7 = _4[_6]; // scope 1 at $DIR/enum_opt.rs:52:3: 52:34 -+ _8 = &raw mut _1; // scope 1 at $DIR/enum_opt.rs:52:3: 52:34 -+ _9 = _8 as *mut u8 (Misc); // scope 1 at $DIR/enum_opt.rs:52:3: 52:34 -+ _10 = &raw const _2; // scope 1 at $DIR/enum_opt.rs:52:3: 52:34 -+ _11 = _10 as *const u8 (Misc); // scope 1 at $DIR/enum_opt.rs:52:3: 52:34 -+ copy_nonoverlapping(src=_11, dst=_9, count=_7); // scope 1 at $DIR/enum_opt.rs:52:3: 52:34 -+ StorageDead(_4); // scope 1 at $DIR/enum_opt.rs:52:3: 52:34 - StorageDead(_2); // scope 1 at $DIR/enum_opt.rs:52:33: 52:34 - _0 = const (); // scope 0 at $DIR/enum_opt.rs:50:15: 53:2 - StorageDead(_1); // scope 0 at $DIR/enum_opt.rs:53:1: 53:2 - return; // scope 0 at $DIR/enum_opt.rs:53:2: 53:2 - } - - bb1 (cleanup): { - resume; // scope 0 at $DIR/enum_opt.rs:50:1: 53:2 + StorageLive(_1); // scope 0 at $DIR/enum_opt.rs:+1:7: +1:12 + Deinit(_1); // scope 0 at $DIR/enum_opt.rs:+1:15: +1:34 + ((_1 as Small).0: u8) = const 1_u8; // scope 0 at $DIR/enum_opt.rs:+1:15: +1:34 + discriminant(_1) = 0; // scope 0 at $DIR/enum_opt.rs:+1:15: +1:34 + StorageLive(_2); // scope 1 at $DIR/enum_opt.rs:+2:7: +2:34 + StorageLive(_3); // scope 1 at $DIR/enum_opt.rs:+2:24: +2:33 + _3 = [const 1_u64; 1024]; // scope 1 at $DIR/enum_opt.rs:+2:24: +2:33 + Deinit(_2); // scope 1 at $DIR/enum_opt.rs:+2:7: +2:34 + ((_2 as Large).0: [u64; 1024]) = move _3; // scope 1 at $DIR/enum_opt.rs:+2:7: +2:34 + discriminant(_2) = 1; // scope 1 at $DIR/enum_opt.rs:+2:7: +2:34 + StorageDead(_3); // scope 1 at $DIR/enum_opt.rs:+2:33: +2:34 +- _1 = move _2; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34 ++ StorageLive(_4); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34 ++ _4 = const [2_usize, 8200_usize]; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34 ++ _5 = discriminant(_2); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34 ++ _6 = _5 as usize (IntToInt); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34 ++ _7 = _4[_6]; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34 ++ _8 = &raw mut _1; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34 ++ _9 = _8 as *mut u8 (PtrToPtr); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34 ++ _10 = &raw const _2; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34 ++ _11 = _10 as *const u8 (PtrToPtr); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34 ++ copy_nonoverlapping(dst = _9, src = _11, count = _7); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34 ++ StorageDead(_4); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34 + StorageDead(_2); // scope 1 at $DIR/enum_opt.rs:+2:33: +2:34 + _0 = const (); // scope 0 at $DIR/enum_opt.rs:+0:15: +3:2 + StorageDead(_1); // scope 0 at $DIR/enum_opt.rs:+3:1: +3:2 + return; // scope 0 at $DIR/enum_opt.rs:+3:2: +3:2 } } diff --git a/tests/mir-opt/enum_opt.invalid.EnumSizeOpt.32bit.diff b/tests/mir-opt/enum_opt.invalid.EnumSizeOpt.32bit.diff index bc16a780683..db2efa195a3 100644 --- a/tests/mir-opt/enum_opt.invalid.EnumSizeOpt.32bit.diff +++ b/tests/mir-opt/enum_opt.invalid.EnumSizeOpt.32bit.diff @@ -2,34 +2,30 @@ + // MIR for `invalid` after EnumSizeOpt fn invalid() -> () { - let mut _0: (); // return place in scope 0 at $DIR/enum_opt.rs:56:18: 56:18 - let mut _1: InvalidIdxs; // in scope 0 at $DIR/enum_opt.rs:57:7: 57:12 - let mut _2: InvalidIdxs; // in scope 0 at $DIR/enum_opt.rs:58:7: 58:36 - let mut _3: [u64; 1024]; // in scope 0 at $DIR/enum_opt.rs:58:26: 58:35 + let mut _0: (); // return place in scope 0 at $DIR/enum_opt.rs:+0:18: +0:18 + let mut _1: InvalidIdxs; // in scope 0 at $DIR/enum_opt.rs:+1:7: +1:12 + let mut _2: InvalidIdxs; // in scope 0 at $DIR/enum_opt.rs:+2:7: +2:36 + let mut _3: [u64; 1024]; // in scope 0 at $DIR/enum_opt.rs:+2:26: +2:35 scope 1 { - debug a => _1; // in scope 1 at $DIR/enum_opt.rs:57:7: 57:12 + debug a => _1; // in scope 1 at $DIR/enum_opt.rs:+1:7: +1:12 } bb0: { - StorageLive(_1); // scope 0 at $DIR/enum_opt.rs:57:7: 57:12 - Deinit(_1); // scope 0 at $DIR/enum_opt.rs:57:15: 57:29 - discriminant(_1) = 0; // scope 0 at $DIR/enum_opt.rs:57:15: 57:29 - StorageLive(_2); // scope 1 at $DIR/enum_opt.rs:58:7: 58:36 - StorageLive(_3); // scope 1 at $DIR/enum_opt.rs:58:26: 58:35 - _3 = [const 0_u64; 1024]; // scope 1 at $DIR/enum_opt.rs:58:26: 58:35 - Deinit(_2); // scope 1 at $DIR/enum_opt.rs:58:7: 58:36 - ((_2 as Large).0: [u64; 1024]) = move _3; // scope 1 at $DIR/enum_opt.rs:58:7: 58:36 - discriminant(_2) = 1; // scope 1 at $DIR/enum_opt.rs:58:7: 58:36 - StorageDead(_3); // scope 1 at $DIR/enum_opt.rs:58:35: 58:36 - _1 = move _2; // scope 1 at $DIR/enum_opt.rs:58:3: 58:36 - StorageDead(_2); // scope 1 at $DIR/enum_opt.rs:58:35: 58:36 - _0 = const (); // scope 0 at $DIR/enum_opt.rs:56:18: 59:2 - StorageDead(_1); // scope 0 at $DIR/enum_opt.rs:59:1: 59:2 - return; // scope 0 at $DIR/enum_opt.rs:59:2: 59:2 - } - - bb1 (cleanup): { - resume; // scope 0 at $DIR/enum_opt.rs:56:1: 59:2 + StorageLive(_1); // scope 0 at $DIR/enum_opt.rs:+1:7: +1:12 + Deinit(_1); // scope 0 at $DIR/enum_opt.rs:+1:15: +1:29 + discriminant(_1) = 0; // scope 0 at $DIR/enum_opt.rs:+1:15: +1:29 + StorageLive(_2); // scope 1 at $DIR/enum_opt.rs:+2:7: +2:36 + StorageLive(_3); // scope 1 at $DIR/enum_opt.rs:+2:26: +2:35 + _3 = [const 0_u64; 1024]; // scope 1 at $DIR/enum_opt.rs:+2:26: +2:35 + Deinit(_2); // scope 1 at $DIR/enum_opt.rs:+2:7: +2:36 + ((_2 as Large).0: [u64; 1024]) = move _3; // scope 1 at $DIR/enum_opt.rs:+2:7: +2:36 + discriminant(_2) = 1; // scope 1 at $DIR/enum_opt.rs:+2:7: +2:36 + StorageDead(_3); // scope 1 at $DIR/enum_opt.rs:+2:35: +2:36 + _1 = move _2; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:36 + StorageDead(_2); // scope 1 at $DIR/enum_opt.rs:+2:35: +2:36 + _0 = const (); // scope 0 at $DIR/enum_opt.rs:+0:18: +3:2 + StorageDead(_1); // scope 0 at $DIR/enum_opt.rs:+3:1: +3:2 + return; // scope 0 at $DIR/enum_opt.rs:+3:2: +3:2 } } diff --git a/tests/mir-opt/enum_opt.invalid.EnumSizeOpt.64bit.diff b/tests/mir-opt/enum_opt.invalid.EnumSizeOpt.64bit.diff index bc16a780683..db2efa195a3 100644 --- a/tests/mir-opt/enum_opt.invalid.EnumSizeOpt.64bit.diff +++ b/tests/mir-opt/enum_opt.invalid.EnumSizeOpt.64bit.diff @@ -2,34 +2,30 @@ + // MIR for `invalid` after EnumSizeOpt fn invalid() -> () { - let mut _0: (); // return place in scope 0 at $DIR/enum_opt.rs:56:18: 56:18 - let mut _1: InvalidIdxs; // in scope 0 at $DIR/enum_opt.rs:57:7: 57:12 - let mut _2: InvalidIdxs; // in scope 0 at $DIR/enum_opt.rs:58:7: 58:36 - let mut _3: [u64; 1024]; // in scope 0 at $DIR/enum_opt.rs:58:26: 58:35 + let mut _0: (); // return place in scope 0 at $DIR/enum_opt.rs:+0:18: +0:18 + let mut _1: InvalidIdxs; // in scope 0 at $DIR/enum_opt.rs:+1:7: +1:12 + let mut _2: InvalidIdxs; // in scope 0 at $DIR/enum_opt.rs:+2:7: +2:36 + let mut _3: [u64; 1024]; // in scope 0 at $DIR/enum_opt.rs:+2:26: +2:35 scope 1 { - debug a => _1; // in scope 1 at $DIR/enum_opt.rs:57:7: 57:12 + debug a => _1; // in scope 1 at $DIR/enum_opt.rs:+1:7: +1:12 } bb0: { - StorageLive(_1); // scope 0 at $DIR/enum_opt.rs:57:7: 57:12 - Deinit(_1); // scope 0 at $DIR/enum_opt.rs:57:15: 57:29 - discriminant(_1) = 0; // scope 0 at $DIR/enum_opt.rs:57:15: 57:29 - StorageLive(_2); // scope 1 at $DIR/enum_opt.rs:58:7: 58:36 - StorageLive(_3); // scope 1 at $DIR/enum_opt.rs:58:26: 58:35 - _3 = [const 0_u64; 1024]; // scope 1 at $DIR/enum_opt.rs:58:26: 58:35 - Deinit(_2); // scope 1 at $DIR/enum_opt.rs:58:7: 58:36 - ((_2 as Large).0: [u64; 1024]) = move _3; // scope 1 at $DIR/enum_opt.rs:58:7: 58:36 - discriminant(_2) = 1; // scope 1 at $DIR/enum_opt.rs:58:7: 58:36 - StorageDead(_3); // scope 1 at $DIR/enum_opt.rs:58:35: 58:36 - _1 = move _2; // scope 1 at $DIR/enum_opt.rs:58:3: 58:36 - StorageDead(_2); // scope 1 at $DIR/enum_opt.rs:58:35: 58:36 - _0 = const (); // scope 0 at $DIR/enum_opt.rs:56:18: 59:2 - StorageDead(_1); // scope 0 at $DIR/enum_opt.rs:59:1: 59:2 - return; // scope 0 at $DIR/enum_opt.rs:59:2: 59:2 - } - - bb1 (cleanup): { - resume; // scope 0 at $DIR/enum_opt.rs:56:1: 59:2 + StorageLive(_1); // scope 0 at $DIR/enum_opt.rs:+1:7: +1:12 + Deinit(_1); // scope 0 at $DIR/enum_opt.rs:+1:15: +1:29 + discriminant(_1) = 0; // scope 0 at $DIR/enum_opt.rs:+1:15: +1:29 + StorageLive(_2); // scope 1 at $DIR/enum_opt.rs:+2:7: +2:36 + StorageLive(_3); // scope 1 at $DIR/enum_opt.rs:+2:26: +2:35 + _3 = [const 0_u64; 1024]; // scope 1 at $DIR/enum_opt.rs:+2:26: +2:35 + Deinit(_2); // scope 1 at $DIR/enum_opt.rs:+2:7: +2:36 + ((_2 as Large).0: [u64; 1024]) = move _3; // scope 1 at $DIR/enum_opt.rs:+2:7: +2:36 + discriminant(_2) = 1; // scope 1 at $DIR/enum_opt.rs:+2:7: +2:36 + StorageDead(_3); // scope 1 at $DIR/enum_opt.rs:+2:35: +2:36 + _1 = move _2; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:36 + StorageDead(_2); // scope 1 at $DIR/enum_opt.rs:+2:35: +2:36 + _0 = const (); // scope 0 at $DIR/enum_opt.rs:+0:18: +3:2 + StorageDead(_1); // scope 0 at $DIR/enum_opt.rs:+3:1: +3:2 + return; // scope 0 at $DIR/enum_opt.rs:+3:2: +3:2 } } diff --git a/tests/mir-opt/enum_opt.rs b/tests/mir-opt/enum_opt.rs index 65f77af0592..6876c56cfa4 100644 --- a/tests/mir-opt/enum_opt.rs +++ b/tests/mir-opt/enum_opt.rs @@ -1,12 +1,14 @@ // EMIT_MIR_FOR_EACH_BIT_WIDTH // compile-flags: -Zunsound-mir-opts -Zmir-opt-level=3 -// ignore-wasm32-bare compiled with panic=abort by default +// ignore-wasm32 + #![feature(arbitrary_enum_discriminant, repr128)] // Tests that an enum with a variant with no data gets correctly transformed. +#[repr(C)] pub enum NoData { + Large([u8; 8192]), None, - Large([u64; 1024]), } // Tests that an enum with a variant with data that is a valid candidate gets transformed. @@ -26,7 +28,7 @@ pub enum InvalidIdxs { // Tests that an enum with too high of a discriminant index (not in bounds of usize) does not // get tformed. #[repr(u128)] -pub enum Truncatable { +pub enum NotTrunctable { A = 0, B([u8; 1024]) = 1, C([u8; 4096]) = 0x10000000000000001, @@ -43,7 +45,7 @@ pub enum RandOrderDiscr { // EMIT_MIR enum_opt.unin.EnumSizeOpt.diff pub fn unin() { let mut a = NoData::None; - a = NoData::Large([1; 1024]); + a = NoData::Large([1; 8192]); } // EMIT_MIR enum_opt.cand.EnumSizeOpt.diff @@ -60,9 +62,9 @@ pub fn invalid() { // EMIT_MIR enum_opt.trunc.EnumSizeOpt.diff pub fn trunc() { - let mut a = Truncatable::A; - a = Truncatable::B([0; 1024]); - a = Truncatable::C([0; 4096]); + let mut a = NotTrunctable::A; + a = NotTrunctable::B([0; 1024]); + a = NotTrunctable::C([0; 4096]); } pub fn rand_order() { diff --git a/tests/mir-opt/enum_opt.trunc.EnumSizeOpt.32bit.diff b/tests/mir-opt/enum_opt.trunc.EnumSizeOpt.32bit.diff index 654e385bfe7..b9d6765d8c1 100644 --- a/tests/mir-opt/enum_opt.trunc.EnumSizeOpt.32bit.diff +++ b/tests/mir-opt/enum_opt.trunc.EnumSizeOpt.32bit.diff @@ -2,45 +2,41 @@ + // MIR for `trunc` after EnumSizeOpt fn trunc() -> () { - let mut _0: (); // return place in scope 0 at $DIR/enum_opt.rs:62:16: 62:16 - let mut _1: Truncatable; // in scope 0 at $DIR/enum_opt.rs:63:7: 63:12 - let mut _2: Truncatable; // in scope 0 at $DIR/enum_opt.rs:64:7: 64:32 - let mut _3: [u8; 1024]; // in scope 0 at $DIR/enum_opt.rs:64:22: 64:31 - let mut _4: Truncatable; // in scope 0 at $DIR/enum_opt.rs:65:7: 65:32 - let mut _5: [u8; 4096]; // in scope 0 at $DIR/enum_opt.rs:65:22: 65:31 + let mut _0: (); // return place in scope 0 at $DIR/enum_opt.rs:+0:16: +0:16 + let mut _1: NotTrunctable; // in scope 0 at $DIR/enum_opt.rs:+1:7: +1:12 + let mut _2: NotTrunctable; // in scope 0 at $DIR/enum_opt.rs:+2:7: +2:34 + let mut _3: [u8; 1024]; // in scope 0 at $DIR/enum_opt.rs:+2:24: +2:33 + let mut _4: NotTrunctable; // in scope 0 at $DIR/enum_opt.rs:+3:7: +3:34 + let mut _5: [u8; 4096]; // in scope 0 at $DIR/enum_opt.rs:+3:24: +3:33 scope 1 { - debug a => _1; // in scope 1 at $DIR/enum_opt.rs:63:7: 63:12 + debug a => _1; // in scope 1 at $DIR/enum_opt.rs:+1:7: +1:12 } bb0: { - StorageLive(_1); // scope 0 at $DIR/enum_opt.rs:63:7: 63:12 - Deinit(_1); // scope 0 at $DIR/enum_opt.rs:63:15: 63:29 - discriminant(_1) = 0; // scope 0 at $DIR/enum_opt.rs:63:15: 63:29 - StorageLive(_2); // scope 1 at $DIR/enum_opt.rs:64:7: 64:32 - StorageLive(_3); // scope 1 at $DIR/enum_opt.rs:64:22: 64:31 - _3 = [const 0_u8; 1024]; // scope 1 at $DIR/enum_opt.rs:64:22: 64:31 - Deinit(_2); // scope 1 at $DIR/enum_opt.rs:64:7: 64:32 - ((_2 as B).0: [u8; 1024]) = move _3; // scope 1 at $DIR/enum_opt.rs:64:7: 64:32 - discriminant(_2) = 1; // scope 1 at $DIR/enum_opt.rs:64:7: 64:32 - StorageDead(_3); // scope 1 at $DIR/enum_opt.rs:64:31: 64:32 - _1 = move _2; // scope 1 at $DIR/enum_opt.rs:64:3: 64:32 - StorageDead(_2); // scope 1 at $DIR/enum_opt.rs:64:31: 64:32 - StorageLive(_4); // scope 1 at $DIR/enum_opt.rs:65:7: 65:32 - StorageLive(_5); // scope 1 at $DIR/enum_opt.rs:65:22: 65:31 - _5 = [const 0_u8; 4096]; // scope 1 at $DIR/enum_opt.rs:65:22: 65:31 - Deinit(_4); // scope 1 at $DIR/enum_opt.rs:65:7: 65:32 - ((_4 as C).0: [u8; 4096]) = move _5; // scope 1 at $DIR/enum_opt.rs:65:7: 65:32 - discriminant(_4) = 2; // scope 1 at $DIR/enum_opt.rs:65:7: 65:32 - StorageDead(_5); // scope 1 at $DIR/enum_opt.rs:65:31: 65:32 - _1 = move _4; // scope 1 at $DIR/enum_opt.rs:65:3: 65:32 - StorageDead(_4); // scope 1 at $DIR/enum_opt.rs:65:31: 65:32 - _0 = const (); // scope 0 at $DIR/enum_opt.rs:62:16: 66:2 - StorageDead(_1); // scope 0 at $DIR/enum_opt.rs:66:1: 66:2 - return; // scope 0 at $DIR/enum_opt.rs:66:2: 66:2 - } - - bb1 (cleanup): { - resume; // scope 0 at $DIR/enum_opt.rs:62:1: 66:2 + StorageLive(_1); // scope 0 at $DIR/enum_opt.rs:+1:7: +1:12 + Deinit(_1); // scope 0 at $DIR/enum_opt.rs:+1:15: +1:31 + discriminant(_1) = 0; // scope 0 at $DIR/enum_opt.rs:+1:15: +1:31 + StorageLive(_2); // scope 1 at $DIR/enum_opt.rs:+2:7: +2:34 + StorageLive(_3); // scope 1 at $DIR/enum_opt.rs:+2:24: +2:33 + _3 = [const 0_u8; 1024]; // scope 1 at $DIR/enum_opt.rs:+2:24: +2:33 + Deinit(_2); // scope 1 at $DIR/enum_opt.rs:+2:7: +2:34 + ((_2 as B).0: [u8; 1024]) = move _3; // scope 1 at $DIR/enum_opt.rs:+2:7: +2:34 + discriminant(_2) = 1; // scope 1 at $DIR/enum_opt.rs:+2:7: +2:34 + StorageDead(_3); // scope 1 at $DIR/enum_opt.rs:+2:33: +2:34 + _1 = move _2; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34 + StorageDead(_2); // scope 1 at $DIR/enum_opt.rs:+2:33: +2:34 + StorageLive(_4); // scope 1 at $DIR/enum_opt.rs:+3:7: +3:34 + StorageLive(_5); // scope 1 at $DIR/enum_opt.rs:+3:24: +3:33 + _5 = [const 0_u8; 4096]; // scope 1 at $DIR/enum_opt.rs:+3:24: +3:33 + Deinit(_4); // scope 1 at $DIR/enum_opt.rs:+3:7: +3:34 + ((_4 as C).0: [u8; 4096]) = move _5; // scope 1 at $DIR/enum_opt.rs:+3:7: +3:34 + discriminant(_4) = 2; // scope 1 at $DIR/enum_opt.rs:+3:7: +3:34 + StorageDead(_5); // scope 1 at $DIR/enum_opt.rs:+3:33: +3:34 + _1 = move _4; // scope 1 at $DIR/enum_opt.rs:+3:3: +3:34 + StorageDead(_4); // scope 1 at $DIR/enum_opt.rs:+3:33: +3:34 + _0 = const (); // scope 0 at $DIR/enum_opt.rs:+0:16: +4:2 + StorageDead(_1); // scope 0 at $DIR/enum_opt.rs:+4:1: +4:2 + return; // scope 0 at $DIR/enum_opt.rs:+4:2: +4:2 } } diff --git a/tests/mir-opt/enum_opt.trunc.EnumSizeOpt.64bit.diff b/tests/mir-opt/enum_opt.trunc.EnumSizeOpt.64bit.diff index 654e385bfe7..b9d6765d8c1 100644 --- a/tests/mir-opt/enum_opt.trunc.EnumSizeOpt.64bit.diff +++ b/tests/mir-opt/enum_opt.trunc.EnumSizeOpt.64bit.diff @@ -2,45 +2,41 @@ + // MIR for `trunc` after EnumSizeOpt fn trunc() -> () { - let mut _0: (); // return place in scope 0 at $DIR/enum_opt.rs:62:16: 62:16 - let mut _1: Truncatable; // in scope 0 at $DIR/enum_opt.rs:63:7: 63:12 - let mut _2: Truncatable; // in scope 0 at $DIR/enum_opt.rs:64:7: 64:32 - let mut _3: [u8; 1024]; // in scope 0 at $DIR/enum_opt.rs:64:22: 64:31 - let mut _4: Truncatable; // in scope 0 at $DIR/enum_opt.rs:65:7: 65:32 - let mut _5: [u8; 4096]; // in scope 0 at $DIR/enum_opt.rs:65:22: 65:31 + let mut _0: (); // return place in scope 0 at $DIR/enum_opt.rs:+0:16: +0:16 + let mut _1: NotTrunctable; // in scope 0 at $DIR/enum_opt.rs:+1:7: +1:12 + let mut _2: NotTrunctable; // in scope 0 at $DIR/enum_opt.rs:+2:7: +2:34 + let mut _3: [u8; 1024]; // in scope 0 at $DIR/enum_opt.rs:+2:24: +2:33 + let mut _4: NotTrunctable; // in scope 0 at $DIR/enum_opt.rs:+3:7: +3:34 + let mut _5: [u8; 4096]; // in scope 0 at $DIR/enum_opt.rs:+3:24: +3:33 scope 1 { - debug a => _1; // in scope 1 at $DIR/enum_opt.rs:63:7: 63:12 + debug a => _1; // in scope 1 at $DIR/enum_opt.rs:+1:7: +1:12 } bb0: { - StorageLive(_1); // scope 0 at $DIR/enum_opt.rs:63:7: 63:12 - Deinit(_1); // scope 0 at $DIR/enum_opt.rs:63:15: 63:29 - discriminant(_1) = 0; // scope 0 at $DIR/enum_opt.rs:63:15: 63:29 - StorageLive(_2); // scope 1 at $DIR/enum_opt.rs:64:7: 64:32 - StorageLive(_3); // scope 1 at $DIR/enum_opt.rs:64:22: 64:31 - _3 = [const 0_u8; 1024]; // scope 1 at $DIR/enum_opt.rs:64:22: 64:31 - Deinit(_2); // scope 1 at $DIR/enum_opt.rs:64:7: 64:32 - ((_2 as B).0: [u8; 1024]) = move _3; // scope 1 at $DIR/enum_opt.rs:64:7: 64:32 - discriminant(_2) = 1; // scope 1 at $DIR/enum_opt.rs:64:7: 64:32 - StorageDead(_3); // scope 1 at $DIR/enum_opt.rs:64:31: 64:32 - _1 = move _2; // scope 1 at $DIR/enum_opt.rs:64:3: 64:32 - StorageDead(_2); // scope 1 at $DIR/enum_opt.rs:64:31: 64:32 - StorageLive(_4); // scope 1 at $DIR/enum_opt.rs:65:7: 65:32 - StorageLive(_5); // scope 1 at $DIR/enum_opt.rs:65:22: 65:31 - _5 = [const 0_u8; 4096]; // scope 1 at $DIR/enum_opt.rs:65:22: 65:31 - Deinit(_4); // scope 1 at $DIR/enum_opt.rs:65:7: 65:32 - ((_4 as C).0: [u8; 4096]) = move _5; // scope 1 at $DIR/enum_opt.rs:65:7: 65:32 - discriminant(_4) = 2; // scope 1 at $DIR/enum_opt.rs:65:7: 65:32 - StorageDead(_5); // scope 1 at $DIR/enum_opt.rs:65:31: 65:32 - _1 = move _4; // scope 1 at $DIR/enum_opt.rs:65:3: 65:32 - StorageDead(_4); // scope 1 at $DIR/enum_opt.rs:65:31: 65:32 - _0 = const (); // scope 0 at $DIR/enum_opt.rs:62:16: 66:2 - StorageDead(_1); // scope 0 at $DIR/enum_opt.rs:66:1: 66:2 - return; // scope 0 at $DIR/enum_opt.rs:66:2: 66:2 - } - - bb1 (cleanup): { - resume; // scope 0 at $DIR/enum_opt.rs:62:1: 66:2 + StorageLive(_1); // scope 0 at $DIR/enum_opt.rs:+1:7: +1:12 + Deinit(_1); // scope 0 at $DIR/enum_opt.rs:+1:15: +1:31 + discriminant(_1) = 0; // scope 0 at $DIR/enum_opt.rs:+1:15: +1:31 + StorageLive(_2); // scope 1 at $DIR/enum_opt.rs:+2:7: +2:34 + StorageLive(_3); // scope 1 at $DIR/enum_opt.rs:+2:24: +2:33 + _3 = [const 0_u8; 1024]; // scope 1 at $DIR/enum_opt.rs:+2:24: +2:33 + Deinit(_2); // scope 1 at $DIR/enum_opt.rs:+2:7: +2:34 + ((_2 as B).0: [u8; 1024]) = move _3; // scope 1 at $DIR/enum_opt.rs:+2:7: +2:34 + discriminant(_2) = 1; // scope 1 at $DIR/enum_opt.rs:+2:7: +2:34 + StorageDead(_3); // scope 1 at $DIR/enum_opt.rs:+2:33: +2:34 + _1 = move _2; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:34 + StorageDead(_2); // scope 1 at $DIR/enum_opt.rs:+2:33: +2:34 + StorageLive(_4); // scope 1 at $DIR/enum_opt.rs:+3:7: +3:34 + StorageLive(_5); // scope 1 at $DIR/enum_opt.rs:+3:24: +3:33 + _5 = [const 0_u8; 4096]; // scope 1 at $DIR/enum_opt.rs:+3:24: +3:33 + Deinit(_4); // scope 1 at $DIR/enum_opt.rs:+3:7: +3:34 + ((_4 as C).0: [u8; 4096]) = move _5; // scope 1 at $DIR/enum_opt.rs:+3:7: +3:34 + discriminant(_4) = 2; // scope 1 at $DIR/enum_opt.rs:+3:7: +3:34 + StorageDead(_5); // scope 1 at $DIR/enum_opt.rs:+3:33: +3:34 + _1 = move _4; // scope 1 at $DIR/enum_opt.rs:+3:3: +3:34 + StorageDead(_4); // scope 1 at $DIR/enum_opt.rs:+3:33: +3:34 + _0 = const (); // scope 0 at $DIR/enum_opt.rs:+0:16: +4:2 + StorageDead(_1); // scope 0 at $DIR/enum_opt.rs:+4:1: +4:2 + return; // scope 0 at $DIR/enum_opt.rs:+4:2: +4:2 } } diff --git a/tests/mir-opt/enum_opt.unin.EnumSizeOpt.32bit.diff b/tests/mir-opt/enum_opt.unin.EnumSizeOpt.32bit.diff index bc72e507d5a..168677b173d 100644 --- a/tests/mir-opt/enum_opt.unin.EnumSizeOpt.32bit.diff +++ b/tests/mir-opt/enum_opt.unin.EnumSizeOpt.32bit.diff @@ -2,53 +2,49 @@ + // MIR for `unin` after EnumSizeOpt fn unin() -> () { - let mut _0: (); // return place in scope 0 at $DIR/enum_opt.rs:44:15: 44:15 - let mut _1: NoData; // in scope 0 at $DIR/enum_opt.rs:45:7: 45:12 - let mut _2: NoData; // in scope 0 at $DIR/enum_opt.rs:46:7: 46:31 - let mut _3: [u64; 1024]; // in scope 0 at $DIR/enum_opt.rs:46:21: 46:30 -+ let mut _4: [usize; 2]; // in scope 0 at $DIR/enum_opt.rs:46:3: 46:31 -+ let mut _5: isize; // in scope 0 at $DIR/enum_opt.rs:46:3: 46:31 -+ let mut _6: usize; // in scope 0 at $DIR/enum_opt.rs:46:3: 46:31 -+ let mut _7: usize; // in scope 0 at $DIR/enum_opt.rs:46:3: 46:31 -+ let mut _8: *mut NoData; // in scope 0 at $DIR/enum_opt.rs:46:3: 46:31 -+ let mut _9: *mut u8; // in scope 0 at $DIR/enum_opt.rs:46:3: 46:31 -+ let mut _10: *const NoData; // in scope 0 at $DIR/enum_opt.rs:46:3: 46:31 -+ let mut _11: *const u8; // in scope 0 at $DIR/enum_opt.rs:46:3: 46:31 + let mut _0: (); // return place in scope 0 at $DIR/enum_opt.rs:+0:15: +0:15 + let mut _1: NoData; // in scope 0 at $DIR/enum_opt.rs:+1:7: +1:12 + let mut _2: NoData; // in scope 0 at $DIR/enum_opt.rs:+2:7: +2:31 + let mut _3: [u8; 8192]; // in scope 0 at $DIR/enum_opt.rs:+2:21: +2:30 ++ let mut _4: [usize; 2]; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:31 ++ let mut _5: isize; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:31 ++ let mut _6: usize; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:31 ++ let mut _7: usize; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:31 ++ let mut _8: *mut NoData; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:31 ++ let mut _9: *mut u8; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:31 ++ let mut _10: *const NoData; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:31 ++ let mut _11: *const u8; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:31 scope 1 { - debug a => _1; // in scope 1 at $DIR/enum_opt.rs:45:7: 45:12 + debug a => _1; // in scope 1 at $DIR/enum_opt.rs:+1:7: +1:12 } bb0: { - StorageLive(_1); // scope 0 at $DIR/enum_opt.rs:45:7: 45:12 - Deinit(_1); // scope 0 at $DIR/enum_opt.rs:45:15: 45:27 - discriminant(_1) = 0; // scope 0 at $DIR/enum_opt.rs:45:15: 45:27 - StorageLive(_2); // scope 1 at $DIR/enum_opt.rs:46:7: 46:31 - StorageLive(_3); // scope 1 at $DIR/enum_opt.rs:46:21: 46:30 - _3 = [const 1_u64; 1024]; // scope 1 at $DIR/enum_opt.rs:46:21: 46:30 - Deinit(_2); // scope 1 at $DIR/enum_opt.rs:46:7: 46:31 - ((_2 as Large).0: [u64; 1024]) = move _3; // scope 1 at $DIR/enum_opt.rs:46:7: 46:31 - discriminant(_2) = 1; // scope 1 at $DIR/enum_opt.rs:46:7: 46:31 - StorageDead(_3); // scope 1 at $DIR/enum_opt.rs:46:30: 46:31 -- _1 = move _2; // scope 1 at $DIR/enum_opt.rs:46:3: 46:31 -+ StorageLive(_4); // scope 1 at $DIR/enum_opt.rs:46:3: 46:31 -+ _4 = const [4_usize, 8196_usize]; // scope 1 at $DIR/enum_opt.rs:46:3: 46:31 -+ _5 = discriminant(_2); // scope 1 at $DIR/enum_opt.rs:46:3: 46:31 -+ _6 = _5 as usize (Misc); // scope 1 at $DIR/enum_opt.rs:46:3: 46:31 -+ _7 = _4[_6]; // scope 1 at $DIR/enum_opt.rs:46:3: 46:31 -+ _8 = &raw mut _1; // scope 1 at $DIR/enum_opt.rs:46:3: 46:31 -+ _9 = _8 as *mut u8 (Misc); // scope 1 at $DIR/enum_opt.rs:46:3: 46:31 -+ _10 = &raw const _2; // scope 1 at $DIR/enum_opt.rs:46:3: 46:31 -+ _11 = _10 as *const u8 (Misc); // scope 1 at $DIR/enum_opt.rs:46:3: 46:31 -+ copy_nonoverlapping(src=_11, dst=_9, count=_7); // scope 1 at $DIR/enum_opt.rs:46:3: 46:31 -+ StorageDead(_4); // scope 1 at $DIR/enum_opt.rs:46:3: 46:31 - StorageDead(_2); // scope 1 at $DIR/enum_opt.rs:46:30: 46:31 - _0 = const (); // scope 0 at $DIR/enum_opt.rs:44:15: 47:2 - StorageDead(_1); // scope 0 at $DIR/enum_opt.rs:47:1: 47:2 - return; // scope 0 at $DIR/enum_opt.rs:47:2: 47:2 - } - - bb1 (cleanup): { - resume; // scope 0 at $DIR/enum_opt.rs:44:1: 47:2 + StorageLive(_1); // scope 0 at $DIR/enum_opt.rs:+1:7: +1:12 + Deinit(_1); // scope 0 at $DIR/enum_opt.rs:+1:15: +1:27 + discriminant(_1) = 1; // scope 0 at $DIR/enum_opt.rs:+1:15: +1:27 + StorageLive(_2); // scope 1 at $DIR/enum_opt.rs:+2:7: +2:31 + StorageLive(_3); // scope 1 at $DIR/enum_opt.rs:+2:21: +2:30 + _3 = [const 1_u8; 8192]; // scope 1 at $DIR/enum_opt.rs:+2:21: +2:30 + Deinit(_2); // scope 1 at $DIR/enum_opt.rs:+2:7: +2:31 + ((_2 as Large).0: [u8; 8192]) = move _3; // scope 1 at $DIR/enum_opt.rs:+2:7: +2:31 + discriminant(_2) = 0; // scope 1 at $DIR/enum_opt.rs:+2:7: +2:31 + StorageDead(_3); // scope 1 at $DIR/enum_opt.rs:+2:30: +2:31 +- _1 = move _2; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:31 ++ StorageLive(_4); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:31 ++ _4 = const [8196_usize, 4_usize]; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:31 ++ _5 = discriminant(_2); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:31 ++ _6 = _5 as usize (IntToInt); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:31 ++ _7 = _4[_6]; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:31 ++ _8 = &raw mut _1; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:31 ++ _9 = _8 as *mut u8 (PtrToPtr); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:31 ++ _10 = &raw const _2; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:31 ++ _11 = _10 as *const u8 (PtrToPtr); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:31 ++ copy_nonoverlapping(dst = _9, src = _11, count = _7); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:31 ++ StorageDead(_4); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:31 + StorageDead(_2); // scope 1 at $DIR/enum_opt.rs:+2:30: +2:31 + _0 = const (); // scope 0 at $DIR/enum_opt.rs:+0:15: +3:2 + StorageDead(_1); // scope 0 at $DIR/enum_opt.rs:+3:1: +3:2 + return; // scope 0 at $DIR/enum_opt.rs:+3:2: +3:2 } } diff --git a/tests/mir-opt/enum_opt.unin.EnumSizeOpt.64bit.diff b/tests/mir-opt/enum_opt.unin.EnumSizeOpt.64bit.diff index 9001268dc20..168677b173d 100644 --- a/tests/mir-opt/enum_opt.unin.EnumSizeOpt.64bit.diff +++ b/tests/mir-opt/enum_opt.unin.EnumSizeOpt.64bit.diff @@ -2,53 +2,49 @@ + // MIR for `unin` after EnumSizeOpt fn unin() -> () { - let mut _0: (); // return place in scope 0 at $DIR/enum_opt.rs:44:15: 44:15 - let mut _1: NoData; // in scope 0 at $DIR/enum_opt.rs:45:7: 45:12 - let mut _2: NoData; // in scope 0 at $DIR/enum_opt.rs:46:7: 46:31 - let mut _3: [u64; 1024]; // in scope 0 at $DIR/enum_opt.rs:46:21: 46:30 -+ let mut _4: [usize; 2]; // in scope 0 at $DIR/enum_opt.rs:46:3: 46:31 -+ let mut _5: isize; // in scope 0 at $DIR/enum_opt.rs:46:3: 46:31 -+ let mut _6: usize; // in scope 0 at $DIR/enum_opt.rs:46:3: 46:31 -+ let mut _7: usize; // in scope 0 at $DIR/enum_opt.rs:46:3: 46:31 -+ let mut _8: *mut NoData; // in scope 0 at $DIR/enum_opt.rs:46:3: 46:31 -+ let mut _9: *mut u8; // in scope 0 at $DIR/enum_opt.rs:46:3: 46:31 -+ let mut _10: *const NoData; // in scope 0 at $DIR/enum_opt.rs:46:3: 46:31 -+ let mut _11: *const u8; // in scope 0 at $DIR/enum_opt.rs:46:3: 46:31 + let mut _0: (); // return place in scope 0 at $DIR/enum_opt.rs:+0:15: +0:15 + let mut _1: NoData; // in scope 0 at $DIR/enum_opt.rs:+1:7: +1:12 + let mut _2: NoData; // in scope 0 at $DIR/enum_opt.rs:+2:7: +2:31 + let mut _3: [u8; 8192]; // in scope 0 at $DIR/enum_opt.rs:+2:21: +2:30 ++ let mut _4: [usize; 2]; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:31 ++ let mut _5: isize; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:31 ++ let mut _6: usize; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:31 ++ let mut _7: usize; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:31 ++ let mut _8: *mut NoData; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:31 ++ let mut _9: *mut u8; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:31 ++ let mut _10: *const NoData; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:31 ++ let mut _11: *const u8; // in scope 0 at $DIR/enum_opt.rs:+2:3: +2:31 scope 1 { - debug a => _1; // in scope 1 at $DIR/enum_opt.rs:45:7: 45:12 + debug a => _1; // in scope 1 at $DIR/enum_opt.rs:+1:7: +1:12 } bb0: { - StorageLive(_1); // scope 0 at $DIR/enum_opt.rs:45:7: 45:12 - Deinit(_1); // scope 0 at $DIR/enum_opt.rs:45:15: 45:27 - discriminant(_1) = 0; // scope 0 at $DIR/enum_opt.rs:45:15: 45:27 - StorageLive(_2); // scope 1 at $DIR/enum_opt.rs:46:7: 46:31 - StorageLive(_3); // scope 1 at $DIR/enum_opt.rs:46:21: 46:30 - _3 = [const 1_u64; 1024]; // scope 1 at $DIR/enum_opt.rs:46:21: 46:30 - Deinit(_2); // scope 1 at $DIR/enum_opt.rs:46:7: 46:31 - ((_2 as Large).0: [u64; 1024]) = move _3; // scope 1 at $DIR/enum_opt.rs:46:7: 46:31 - discriminant(_2) = 1; // scope 1 at $DIR/enum_opt.rs:46:7: 46:31 - StorageDead(_3); // scope 1 at $DIR/enum_opt.rs:46:30: 46:31 -- _1 = move _2; // scope 1 at $DIR/enum_opt.rs:46:3: 46:31 -+ StorageLive(_4); // scope 1 at $DIR/enum_opt.rs:46:3: 46:31 -+ _4 = const [8_usize, 8200_usize]; // scope 1 at $DIR/enum_opt.rs:46:3: 46:31 -+ _5 = discriminant(_2); // scope 1 at $DIR/enum_opt.rs:46:3: 46:31 -+ _6 = _5 as usize (Misc); // scope 1 at $DIR/enum_opt.rs:46:3: 46:31 -+ _7 = _4[_6]; // scope 1 at $DIR/enum_opt.rs:46:3: 46:31 -+ _8 = &raw mut _1; // scope 1 at $DIR/enum_opt.rs:46:3: 46:31 -+ _9 = _8 as *mut u8 (Misc); // scope 1 at $DIR/enum_opt.rs:46:3: 46:31 -+ _10 = &raw const _2; // scope 1 at $DIR/enum_opt.rs:46:3: 46:31 -+ _11 = _10 as *const u8 (Misc); // scope 1 at $DIR/enum_opt.rs:46:3: 46:31 -+ copy_nonoverlapping(src=_11, dst=_9, count=_7); // scope 1 at $DIR/enum_opt.rs:46:3: 46:31 -+ StorageDead(_4); // scope 1 at $DIR/enum_opt.rs:46:3: 46:31 - StorageDead(_2); // scope 1 at $DIR/enum_opt.rs:46:30: 46:31 - _0 = const (); // scope 0 at $DIR/enum_opt.rs:44:15: 47:2 - StorageDead(_1); // scope 0 at $DIR/enum_opt.rs:47:1: 47:2 - return; // scope 0 at $DIR/enum_opt.rs:47:2: 47:2 - } - - bb1 (cleanup): { - resume; // scope 0 at $DIR/enum_opt.rs:44:1: 47:2 + StorageLive(_1); // scope 0 at $DIR/enum_opt.rs:+1:7: +1:12 + Deinit(_1); // scope 0 at $DIR/enum_opt.rs:+1:15: +1:27 + discriminant(_1) = 1; // scope 0 at $DIR/enum_opt.rs:+1:15: +1:27 + StorageLive(_2); // scope 1 at $DIR/enum_opt.rs:+2:7: +2:31 + StorageLive(_3); // scope 1 at $DIR/enum_opt.rs:+2:21: +2:30 + _3 = [const 1_u8; 8192]; // scope 1 at $DIR/enum_opt.rs:+2:21: +2:30 + Deinit(_2); // scope 1 at $DIR/enum_opt.rs:+2:7: +2:31 + ((_2 as Large).0: [u8; 8192]) = move _3; // scope 1 at $DIR/enum_opt.rs:+2:7: +2:31 + discriminant(_2) = 0; // scope 1 at $DIR/enum_opt.rs:+2:7: +2:31 + StorageDead(_3); // scope 1 at $DIR/enum_opt.rs:+2:30: +2:31 +- _1 = move _2; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:31 ++ StorageLive(_4); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:31 ++ _4 = const [8196_usize, 4_usize]; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:31 ++ _5 = discriminant(_2); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:31 ++ _6 = _5 as usize (IntToInt); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:31 ++ _7 = _4[_6]; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:31 ++ _8 = &raw mut _1; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:31 ++ _9 = _8 as *mut u8 (PtrToPtr); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:31 ++ _10 = &raw const _2; // scope 1 at $DIR/enum_opt.rs:+2:3: +2:31 ++ _11 = _10 as *const u8 (PtrToPtr); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:31 ++ copy_nonoverlapping(dst = _9, src = _11, count = _7); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:31 ++ StorageDead(_4); // scope 1 at $DIR/enum_opt.rs:+2:3: +2:31 + StorageDead(_2); // scope 1 at $DIR/enum_opt.rs:+2:30: +2:31 + _0 = const (); // scope 0 at $DIR/enum_opt.rs:+0:15: +3:2 + StorageDead(_1); // scope 0 at $DIR/enum_opt.rs:+3:1: +3:2 + return; // scope 0 at $DIR/enum_opt.rs:+3:2: +3:2 } } |
