Add de-init to destination place

This commit is contained in:
kadmin 2023-02-05 22:14:40 +00:00
parent 15f4eec7a9
commit 15d4728cda
11 changed files with 181 additions and 120 deletions

View file

@ -4,6 +4,7 @@ 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};
use rustc_session::Session;
use rustc_target::abi::{HasDataLayout, Size, TagEncoding, Variants};
/// A pass that seeks to optimize unnecessary moves of large enum types, if there is a large
@ -28,14 +29,12 @@ pub struct EnumSizeOpt {
}
impl<'tcx> MirPass<'tcx> for EnumSizeOpt {
fn is_enabled(&self, sess: &Session) -> bool {
sess.opts.unstable_opts.unsound_mir_opts || sess.mir_opt_level() >= 3
}
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
let sess = tcx.sess;
// 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;
}
// NOTE: This pass may produce different MIR based on the alignment of the target
// platform, but it will still be valid.
self.optim(tcx, body);
}
}
@ -254,6 +253,9 @@ impl EnumSizeOpt {
)),
};
let deinit_old =
Statement { source_info, kind: StatementKind::Deinit(box dst) };
let copy_bytes = Statement {
source_info,
kind: StatementKind::Intrinsic(
@ -279,6 +281,7 @@ impl EnumSizeOpt {
dst_cast,
src_ptr,
src_cast,
deinit_old,
copy_bytes,
store_dead,
]

View file

@ -547,7 +547,6 @@ fn run_optimization_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
tcx,
body,
&[
&large_enums::EnumSizeOpt { discrepancy: 128 },
&reveal_all::RevealAll, // has to be done before inlining, since inlined code is in RevealAll mode.
&lower_slice_len::LowerSliceLenCalls, // has to be done before inlining, otherwise actual call will be almost always inlined. Also simple, so can just do first
&unreachable_prop::UnreachablePropagation,
@ -586,6 +585,7 @@ fn run_optimization_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
&simplify::SimplifyLocals::new("final"),
&multiple_return_terminators::MultipleReturnTerminators,
&deduplicate_blocks::DeduplicateBlocks,
&large_enums::EnumSizeOpt { discrepancy: 128 },
// Some cleanup necessary at least for LLVM and potentially other codegen backends.
&add_call_guards::CriticalCallEdges,
// Dump the end result for testing and debugging purposes.

View file

@ -1,11 +1,11 @@
- // MIR for `cand` before EnumSizeOpt
+ // MIR for `cand` after EnumSizeOpt
fn cand() -> () {
let mut _0: (); // return place in scope 0 at $DIR/enum_opt.rs:+0:15: +0:15
fn cand() -> Candidate {
let mut _0: Candidate; // return place in scope 0 at $DIR/enum_opt.rs:+0:18: +0:27
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 _3: [u8; 8196]; // 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
@ -14,25 +14,29 @@
+ 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
+ let mut _12: [usize; 2]; // in scope 0 at $DIR/enum_opt.rs:+3:3: +3:4
+ let mut _13: isize; // in scope 0 at $DIR/enum_opt.rs:+3:3: +3:4
+ let mut _14: usize; // in scope 0 at $DIR/enum_opt.rs:+3:3: +3:4
+ let mut _15: usize; // in scope 0 at $DIR/enum_opt.rs:+3:3: +3:4
+ let mut _16: *mut Candidate; // in scope 0 at $DIR/enum_opt.rs:+3:3: +3:4
+ let mut _17: *mut u8; // in scope 0 at $DIR/enum_opt.rs:+3:3: +3:4
+ let mut _18: *const Candidate; // in scope 0 at $DIR/enum_opt.rs:+3:3: +3:4
+ let mut _19: *const u8; // in scope 0 at $DIR/enum_opt.rs:+3:3: +3:4
scope 1 {
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:+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
_1 = Candidate::Small(const 1_u8); // 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
_3 = [const 1_u8; 8196]; // scope 1 at $DIR/enum_opt.rs:+2:24: +2:33
_2 = Candidate::Large(move _3); // 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
+ _4 = const [2_usize, 8197_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
@ -40,12 +44,25 @@
+ _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
+ Deinit(_8); // 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
- _0 = move _1; // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ StorageLive(_12); // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ _12 = const [2_usize, 8197_usize]; // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ _13 = discriminant(_1); // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ _14 = _13 as usize (IntToInt); // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ _15 = _12[_14]; // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ _16 = &raw mut _0; // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ _17 = _16 as *mut u8 (PtrToPtr); // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ _18 = &raw const _1; // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ _19 = _18 as *const u8 (PtrToPtr); // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ Deinit(_16); // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ copy_nonoverlapping(dst = _17, src = _19, count = _15); // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ StorageDead(_12); // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
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
}
}

View file

@ -1,11 +1,11 @@
- // MIR for `cand` before EnumSizeOpt
+ // MIR for `cand` after EnumSizeOpt
fn cand() -> () {
let mut _0: (); // return place in scope 0 at $DIR/enum_opt.rs:+0:15: +0:15
fn cand() -> Candidate {
let mut _0: Candidate; // return place in scope 0 at $DIR/enum_opt.rs:+0:18: +0:27
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 _3: [u8; 8196]; // 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
@ -14,25 +14,29 @@
+ 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
+ let mut _12: [usize; 2]; // in scope 0 at $DIR/enum_opt.rs:+3:3: +3:4
+ let mut _13: isize; // in scope 0 at $DIR/enum_opt.rs:+3:3: +3:4
+ let mut _14: usize; // in scope 0 at $DIR/enum_opt.rs:+3:3: +3:4
+ let mut _15: usize; // in scope 0 at $DIR/enum_opt.rs:+3:3: +3:4
+ let mut _16: *mut Candidate; // in scope 0 at $DIR/enum_opt.rs:+3:3: +3:4
+ let mut _17: *mut u8; // in scope 0 at $DIR/enum_opt.rs:+3:3: +3:4
+ let mut _18: *const Candidate; // in scope 0 at $DIR/enum_opt.rs:+3:3: +3:4
+ let mut _19: *const u8; // in scope 0 at $DIR/enum_opt.rs:+3:3: +3:4
scope 1 {
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:+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
_1 = Candidate::Small(const 1_u8); // 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
_3 = [const 1_u8; 8196]; // scope 1 at $DIR/enum_opt.rs:+2:24: +2:33
_2 = Candidate::Large(move _3); // 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
+ _4 = const [2_usize, 8197_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
@ -40,12 +44,25 @@
+ _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
+ Deinit(_8); // 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
- _0 = move _1; // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ StorageLive(_12); // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ _12 = const [2_usize, 8197_usize]; // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ _13 = discriminant(_1); // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ _14 = _13 as usize (IntToInt); // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ _15 = _12[_14]; // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ _16 = &raw mut _0; // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ _17 = _16 as *mut u8 (PtrToPtr); // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ _18 = &raw const _1; // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ _19 = _18 as *const u8 (PtrToPtr); // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ Deinit(_16); // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ copy_nonoverlapping(dst = _17, src = _19, count = _15); // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ StorageDead(_12); // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
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
}
}

View file

@ -1,8 +1,8 @@
- // MIR for `invalid` before EnumSizeOpt
+ // MIR for `invalid` after EnumSizeOpt
fn invalid() -> () {
let mut _0: (); // return place in scope 0 at $DIR/enum_opt.rs:+0:18: +0:18
fn invalid() -> InvalidIdxs {
let mut _0: InvalidIdxs; // return place in scope 0 at $DIR/enum_opt.rs:+0:21: +0:32
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
@ -12,20 +12,17 @@
bb0: {
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
_1 = InvalidIdxs::A; // 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
_2 = InvalidIdxs::Large(move _3); // 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
_0 = move _1; // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
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
}
}

View file

@ -1,8 +1,8 @@
- // MIR for `invalid` before EnumSizeOpt
+ // MIR for `invalid` after EnumSizeOpt
fn invalid() -> () {
let mut _0: (); // return place in scope 0 at $DIR/enum_opt.rs:+0:18: +0:18
fn invalid() -> InvalidIdxs {
let mut _0: InvalidIdxs; // return place in scope 0 at $DIR/enum_opt.rs:+0:21: +0:32
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
@ -12,20 +12,17 @@
bb0: {
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
_1 = InvalidIdxs::A; // 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
_2 = InvalidIdxs::Large(move _3); // 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
_0 = move _1; // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
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
}
}

View file

@ -1,20 +1,19 @@
// unit-test: EnumSizeOpt
// EMIT_MIR_FOR_EACH_BIT_WIDTH
// compile-flags: -Zunsound-mir-opts -Zmir-opt-level=3
// ignore-wasm32
// compile-flags: -Zunsound-mir-opts
#![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]),
Large([u8; 8196]),
None,
}
// Tests that an enum with a variant with data that is a valid candidate gets transformed.
pub enum Candidate {
Small(u8),
Large([u64; 1024]),
Large([u8; 8196]),
}
// Tests that an enum which has a discriminant much higher than the variant does not get
@ -43,34 +42,39 @@ pub enum RandOrderDiscr {
}
// EMIT_MIR enum_opt.unin.EnumSizeOpt.diff
pub fn unin() {
pub fn unin() -> NoData {
let mut a = NoData::None;
a = NoData::Large([1; 8192]);
a = NoData::Large([1; 8196]);
a
}
// EMIT_MIR enum_opt.cand.EnumSizeOpt.diff
pub fn cand() {
pub fn cand() -> Candidate {
let mut a = Candidate::Small(1);
a = Candidate::Large([1; 1024]);
a = Candidate::Large([1; 8196]);
a
}
// EMIT_MIR enum_opt.invalid.EnumSizeOpt.diff
pub fn invalid() {
pub fn invalid() -> InvalidIdxs {
let mut a = InvalidIdxs::A;
a = InvalidIdxs::Large([0; 1024]);
a
}
// EMIT_MIR enum_opt.trunc.EnumSizeOpt.diff
pub fn trunc() {
pub fn trunc() -> NotTrunctable {
let mut a = NotTrunctable::A;
a = NotTrunctable::B([0; 1024]);
a = NotTrunctable::C([0; 4096]);
a
}
pub fn rand_order() {
pub fn rand_order() -> RandOrderDiscr {
let mut a = RandOrderDiscr::A;
a = RandOrderDiscr::B([0; 1024]);
a = RandOrderDiscr::C;
a
}
pub fn main() {

View file

@ -1,8 +1,8 @@
- // MIR for `trunc` before EnumSizeOpt
+ // MIR for `trunc` after EnumSizeOpt
fn trunc() -> () {
let mut _0: (); // return place in scope 0 at $DIR/enum_opt.rs:+0:16: +0:16
fn trunc() -> NotTrunctable {
let mut _0: NotTrunctable; // return place in scope 0 at $DIR/enum_opt.rs:+0:19: +0:32
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
@ -14,29 +14,24 @@
bb0: {
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
_1 = NotTrunctable::A; // 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
_2 = NotTrunctable::B(move _3); // 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
_4 = NotTrunctable::C(move _5); // 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
_0 = move _1; // scope 1 at $DIR/enum_opt.rs:+4:3: +4:4
StorageDead(_1); // scope 0 at $DIR/enum_opt.rs:+5:1: +5:2
return; // scope 0 at $DIR/enum_opt.rs:+5:2: +5:2
}
}

View file

@ -1,8 +1,8 @@
- // MIR for `trunc` before EnumSizeOpt
+ // MIR for `trunc` after EnumSizeOpt
fn trunc() -> () {
let mut _0: (); // return place in scope 0 at $DIR/enum_opt.rs:+0:16: +0:16
fn trunc() -> NotTrunctable {
let mut _0: NotTrunctable; // return place in scope 0 at $DIR/enum_opt.rs:+0:19: +0:32
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
@ -14,29 +14,24 @@
bb0: {
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
_1 = NotTrunctable::A; // 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
_2 = NotTrunctable::B(move _3); // 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
_4 = NotTrunctable::C(move _5); // 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
_0 = move _1; // scope 1 at $DIR/enum_opt.rs:+4:3: +4:4
StorageDead(_1); // scope 0 at $DIR/enum_opt.rs:+5:1: +5:2
return; // scope 0 at $DIR/enum_opt.rs:+5:2: +5:2
}
}

View file

@ -1,11 +1,11 @@
- // MIR for `unin` before EnumSizeOpt
+ // MIR for `unin` after EnumSizeOpt
fn unin() -> () {
let mut _0: (); // return place in scope 0 at $DIR/enum_opt.rs:+0:15: +0:15
fn unin() -> NoData {
let mut _0: NoData; // return place in scope 0 at $DIR/enum_opt.rs:+0:18: +0:24
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 _3: [u8; 8196]; // 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
@ -14,24 +14,29 @@
+ 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
+ let mut _12: [usize; 2]; // in scope 0 at $DIR/enum_opt.rs:+3:3: +3:4
+ let mut _13: isize; // in scope 0 at $DIR/enum_opt.rs:+3:3: +3:4
+ let mut _14: usize; // in scope 0 at $DIR/enum_opt.rs:+3:3: +3:4
+ let mut _15: usize; // in scope 0 at $DIR/enum_opt.rs:+3:3: +3:4
+ let mut _16: *mut NoData; // in scope 0 at $DIR/enum_opt.rs:+3:3: +3:4
+ let mut _17: *mut u8; // in scope 0 at $DIR/enum_opt.rs:+3:3: +3:4
+ let mut _18: *const NoData; // in scope 0 at $DIR/enum_opt.rs:+3:3: +3:4
+ let mut _19: *const u8; // in scope 0 at $DIR/enum_opt.rs:+3:3: +3:4
scope 1 {
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:+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
_1 = NoData::None; // 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
_3 = [const 1_u8; 8196]; // scope 1 at $DIR/enum_opt.rs:+2:21: +2:30
_2 = NoData::Large(move _3); // 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
+ _4 = const [8197_usize, 1_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
@ -39,12 +44,25 @@
+ _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
+ Deinit(_8); // 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
- _0 = move _1; // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ StorageLive(_12); // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ _12 = const [8197_usize, 1_usize]; // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ _13 = discriminant(_1); // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ _14 = _13 as usize (IntToInt); // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ _15 = _12[_14]; // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ _16 = &raw mut _0; // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ _17 = _16 as *mut u8 (PtrToPtr); // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ _18 = &raw const _1; // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ _19 = _18 as *const u8 (PtrToPtr); // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ Deinit(_16); // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ copy_nonoverlapping(dst = _17, src = _19, count = _15); // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ StorageDead(_12); // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
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
}
}

View file

@ -1,11 +1,11 @@
- // MIR for `unin` before EnumSizeOpt
+ // MIR for `unin` after EnumSizeOpt
fn unin() -> () {
let mut _0: (); // return place in scope 0 at $DIR/enum_opt.rs:+0:15: +0:15
fn unin() -> NoData {
let mut _0: NoData; // return place in scope 0 at $DIR/enum_opt.rs:+0:18: +0:24
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 _3: [u8; 8196]; // 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
@ -14,24 +14,29 @@
+ 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
+ let mut _12: [usize; 2]; // in scope 0 at $DIR/enum_opt.rs:+3:3: +3:4
+ let mut _13: isize; // in scope 0 at $DIR/enum_opt.rs:+3:3: +3:4
+ let mut _14: usize; // in scope 0 at $DIR/enum_opt.rs:+3:3: +3:4
+ let mut _15: usize; // in scope 0 at $DIR/enum_opt.rs:+3:3: +3:4
+ let mut _16: *mut NoData; // in scope 0 at $DIR/enum_opt.rs:+3:3: +3:4
+ let mut _17: *mut u8; // in scope 0 at $DIR/enum_opt.rs:+3:3: +3:4
+ let mut _18: *const NoData; // in scope 0 at $DIR/enum_opt.rs:+3:3: +3:4
+ let mut _19: *const u8; // in scope 0 at $DIR/enum_opt.rs:+3:3: +3:4
scope 1 {
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:+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
_1 = NoData::None; // 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
_3 = [const 1_u8; 8196]; // scope 1 at $DIR/enum_opt.rs:+2:21: +2:30
_2 = NoData::Large(move _3); // 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
+ _4 = const [8197_usize, 1_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
@ -39,12 +44,25 @@
+ _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
+ Deinit(_8); // 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
- _0 = move _1; // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ StorageLive(_12); // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ _12 = const [8197_usize, 1_usize]; // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ _13 = discriminant(_1); // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ _14 = _13 as usize (IntToInt); // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ _15 = _12[_14]; // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ _16 = &raw mut _0; // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ _17 = _16 as *mut u8 (PtrToPtr); // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ _18 = &raw const _1; // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ _19 = _18 as *const u8 (PtrToPtr); // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ Deinit(_16); // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ copy_nonoverlapping(dst = _17, src = _19, count = _15); // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
+ StorageDead(_12); // scope 1 at $DIR/enum_opt.rs:+3:3: +3:4
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
}
}