about summary refs log tree commit diff
diff options
context:
space:
mode:
authorkadmin <julianknodt@gmail.com>2022-06-24 08:48:07 +0000
committerkadmin <julianknodt@gmail.com>2023-02-07 09:37:55 +0000
commit15f4eec7a986e6c9125ff3e0115d70aef6d5c711 (patch)
tree67cd590dd765ce493ffe8f9d4620bc079298d429
parent610e1a1e05e7160d775f433855138f6063169c56 (diff)
downloadrust-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.rs42
-rw-r--r--compiler/rustc_mir_transform/src/lib.rs2
-rw-r--r--tests/mir-opt/enum_opt.cand.EnumSizeOpt.32bit.diff84
-rw-r--r--tests/mir-opt/enum_opt.cand.EnumSizeOpt.64bit.diff84
-rw-r--r--tests/mir-opt/enum_opt.invalid.EnumSizeOpt.32bit.diff44
-rw-r--r--tests/mir-opt/enum_opt.invalid.EnumSizeOpt.64bit.diff44
-rw-r--r--tests/mir-opt/enum_opt.rs16
-rw-r--r--tests/mir-opt/enum_opt.trunc.EnumSizeOpt.32bit.diff66
-rw-r--r--tests/mir-opt/enum_opt.trunc.EnumSizeOpt.64bit.diff66
-rw-r--r--tests/mir-opt/enum_opt.unin.EnumSizeOpt.32bit.diff82
-rw-r--r--tests/mir-opt/enum_opt.unin.EnumSizeOpt.64bit.diff82
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
       }
   }