about summary refs log tree commit diff
diff options
context:
space:
mode:
authorkadmin <julianknodt@gmail.com>2021-06-02 03:47:05 +0000
committerkadmin <julianknodt@gmail.com>2023-02-07 09:37:55 +0000
commitf7cbf2eb410915149e983b5a934567d0512e10e5 (patch)
tree9965d9735c40fe058f4147bef1a68b80f84817f4
parent33b4d203382f37917f5d5e1bc9057582529a9e90 (diff)
downloadrust-f7cbf2eb410915149e983b5a934567d0512e10e5.tar.gz
rust-f7cbf2eb410915149e983b5a934567d0512e10e5.zip
Update with comments
Changing a bunch of struct constructors to `from`, no extra destructuring,
getting the type of the discriminant.
-rw-r--r--compiler/rustc_mir/src/transform/large_enums.rs76
1 files changed, 41 insertions, 35 deletions
diff --git a/compiler/rustc_mir/src/transform/large_enums.rs b/compiler/rustc_mir/src/transform/large_enums.rs
index f5bf40846e0..efda87a1547 100644
--- a/compiler/rustc_mir/src/transform/large_enums.rs
+++ b/compiler/rustc_mir/src/transform/large_enums.rs
@@ -1,8 +1,8 @@
 use crate::transform::MirPass;
-use crate::util::patch::MirPatch;
 use rustc_data_structures::stable_map::FxHashMap;
 use rustc_middle::mir::*;
-use rustc_middle::ty::{self, Const, List, Ty, TyCtxt};
+use rustc_middle::ty::util::IntTypeExt;
+use rustc_middle::ty::{self, Const, Ty, TyCtxt};
 use rustc_span::def_id::DefId;
 use rustc_target::abi::{Size, TagEncoding, Variants};
 
@@ -60,7 +60,6 @@ impl<const D: u64> EnumSizeOpt<D> {
     fn optim(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
         let mut alloc_cache = FxHashMap::default();
         let body_did = body.source.def_id();
-        let mut patch = MirPatch::new(body);
         let (bbs, local_decls) = body.basic_blocks_and_local_decls_mut();
         for bb in bbs {
             bb.expand_statements(|st| {
@@ -70,15 +69,17 @@ impl<const D: u64> EnumSizeOpt<D> {
                         Rvalue::Use(Operand::Copy(rhs) | Operand::Move(rhs)),
                     )) => {
                         let ty = lhs.ty(local_decls, tcx).ty;
+
                         let source_info = st.source_info;
                         let span = source_info.span;
 
                         let (total_size, num_variants, sizes) =
-                            if let Some((ts, nv, s)) = Self::candidate(tcx, ty, body_did) {
-                                (ts, nv, s)
+                            if let Some(cand) = Self::candidate(tcx, ty, body_did) {
+                                cand
                             } else {
                                 return None;
                             };
+                        let adt_def = ty.ty_adt_def().unwrap();
 
                         let alloc = if let Some(alloc) = alloc_cache.get(ty) {
                             alloc
@@ -111,13 +112,13 @@ impl<const D: u64> EnumSizeOpt<D> {
                             Const::from_usize(tcx, num_variants),
                         ));
 
-                        let size_array_local = patch.new_temp(tmp_ty, span);
+                        let size_array_local = local_decls.push(LocalDecl::new(tmp_ty, span));
                         let store_live = Statement {
                             source_info,
                             kind: StatementKind::StorageLive(size_array_local),
                         };
 
-                        let place = Place { local: size_array_local, projection: List::empty() };
+                        let place = Place::from(size_array_local);
                         let constant_vals = Constant {
                             span,
                             user_ty: None,
@@ -133,11 +134,10 @@ impl<const D: u64> EnumSizeOpt<D> {
                             kind: StatementKind::Assign(box (place, rval)),
                         };
 
-                        let discr_place = Place {
-                            // How do I get the discriminant type?
-                            local: patch.new_temp(tcx.types.isize, span),
-                            projection: List::empty(),
-                        };
+                        let discr_place = Place::from(
+                            local_decls
+                                .push(LocalDecl::new(adt_def.repr.discr_type().to_ty(tcx), span)),
+                        );
 
                         let store_discr = Statement {
                             source_info,
@@ -147,28 +147,40 @@ impl<const D: u64> EnumSizeOpt<D> {
                             )),
                         };
 
-                        // FIXME(jknodt) do I need to add a storage live here for this place?
-                        let size_place = Place {
-                            local: patch.new_temp(tcx.types.usize, span),
-                            projection: List::empty(),
+                        let discr_cast_place =
+                            Place::from(local_decls.push(LocalDecl::new(tcx.types.usize, span)));
+
+                        let cast_discr = Statement {
+                            source_info,
+                            kind: StatementKind::Assign(box (
+                                discr_cast_place,
+                                Rvalue::Cast(
+                                    CastKind::Misc,
+                                    Operand::Copy(discr_place),
+                                    tcx.types.usize,
+                                ),
+                            )),
                         };
 
+                        // FIXME(jknodt) do I need to add a storage live here for this place?
+                        let size_place =
+                            Place::from(local_decls.push(LocalDecl::new(tcx.types.usize, span)));
+
                         let store_size = Statement {
                             source_info,
                             kind: StatementKind::Assign(box (
                                 size_place,
                                 Rvalue::Use(Operand::Copy(Place {
                                     local: size_array_local,
-                                    projection: tcx
-                                        .intern_place_elems(&[PlaceElem::Index(discr_place.local)]),
+                                    projection: tcx.intern_place_elems(&[PlaceElem::Index(
+                                        discr_cast_place.local,
+                                    )]),
                                 })),
                             )),
                         };
 
-                        let dst = Place {
-                            local: patch.new_temp(tcx.mk_mut_ptr(ty), span),
-                            projection: List::empty(),
-                        };
+                        let dst =
+                            Place::from(local_decls.push(LocalDecl::new(tcx.mk_mut_ptr(ty), span)));
 
                         let dst_ptr = Statement {
                             source_info,
@@ -179,10 +191,8 @@ impl<const D: u64> EnumSizeOpt<D> {
                         };
 
                         let dst_cast_ty = tcx.mk_mut_ptr(tcx.types.u8);
-                        let dst_cast_place = Place {
-                            local: patch.new_temp(dst_cast_ty, span),
-                            projection: List::empty(),
-                        };
+                        let dst_cast_place =
+                            Place::from(local_decls.push(LocalDecl::new(dst_cast_ty, span)));
 
                         let dst_cast = Statement {
                             source_info,
@@ -192,10 +202,8 @@ impl<const D: u64> EnumSizeOpt<D> {
                             )),
                         };
 
-                        let src = Place {
-                            local: patch.new_temp(tcx.mk_imm_ptr(ty), span),
-                            projection: List::empty(),
-                        };
+                        let src =
+                            Place::from(local_decls.push(LocalDecl::new(tcx.mk_imm_ptr(ty), span)));
 
                         let src_ptr = Statement {
                             source_info,
@@ -206,10 +214,8 @@ impl<const D: u64> EnumSizeOpt<D> {
                         };
 
                         let src_cast_ty = tcx.mk_imm_ptr(tcx.types.u8);
-                        let src_cast_place = Place {
-                            local: patch.new_temp(src_cast_ty, span),
-                            projection: List::empty(),
-                        };
+                        let src_cast_place =
+                            Place::from(local_decls.push(LocalDecl::new(src_cast_ty, span)));
 
                         let src_cast = Statement {
                             source_info,
@@ -245,6 +251,7 @@ impl<const D: u64> EnumSizeOpt<D> {
                             store_live,
                             const_assign,
                             store_discr,
+                            cast_discr,
                             store_size,
                             dst_ptr,
                             dst_cast,
@@ -261,6 +268,5 @@ impl<const D: u64> EnumSizeOpt<D> {
                 }
             });
         }
-        patch.apply(body);
     }
 }