Update with comments
Changing a bunch of struct constructors to `from`, no extra destructuring, getting the type of the discriminant.
This commit is contained in:
parent
33b4d20338
commit
f7cbf2eb41
1 changed files with 41 additions and 35 deletions
|
@ -1,8 +1,8 @@
|
||||||
use crate::transform::MirPass;
|
use crate::transform::MirPass;
|
||||||
use crate::util::patch::MirPatch;
|
|
||||||
use rustc_data_structures::stable_map::FxHashMap;
|
use rustc_data_structures::stable_map::FxHashMap;
|
||||||
use rustc_middle::mir::*;
|
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_span::def_id::DefId;
|
||||||
use rustc_target::abi::{Size, TagEncoding, Variants};
|
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>) {
|
fn optim(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||||
let mut alloc_cache = FxHashMap::default();
|
let mut alloc_cache = FxHashMap::default();
|
||||||
let body_did = body.source.def_id();
|
let body_did = body.source.def_id();
|
||||||
let mut patch = MirPatch::new(body);
|
|
||||||
let (bbs, local_decls) = body.basic_blocks_and_local_decls_mut();
|
let (bbs, local_decls) = body.basic_blocks_and_local_decls_mut();
|
||||||
for bb in bbs {
|
for bb in bbs {
|
||||||
bb.expand_statements(|st| {
|
bb.expand_statements(|st| {
|
||||||
|
@ -70,15 +69,17 @@ impl<const D: u64> EnumSizeOpt<D> {
|
||||||
Rvalue::Use(Operand::Copy(rhs) | Operand::Move(rhs)),
|
Rvalue::Use(Operand::Copy(rhs) | Operand::Move(rhs)),
|
||||||
)) => {
|
)) => {
|
||||||
let ty = lhs.ty(local_decls, tcx).ty;
|
let ty = lhs.ty(local_decls, tcx).ty;
|
||||||
|
|
||||||
let source_info = st.source_info;
|
let source_info = st.source_info;
|
||||||
let span = source_info.span;
|
let span = source_info.span;
|
||||||
|
|
||||||
let (total_size, num_variants, sizes) =
|
let (total_size, num_variants, sizes) =
|
||||||
if let Some((ts, nv, s)) = Self::candidate(tcx, ty, body_did) {
|
if let Some(cand) = Self::candidate(tcx, ty, body_did) {
|
||||||
(ts, nv, s)
|
cand
|
||||||
} else {
|
} else {
|
||||||
return None;
|
return None;
|
||||||
};
|
};
|
||||||
|
let adt_def = ty.ty_adt_def().unwrap();
|
||||||
|
|
||||||
let alloc = if let Some(alloc) = alloc_cache.get(ty) {
|
let alloc = if let Some(alloc) = alloc_cache.get(ty) {
|
||||||
alloc
|
alloc
|
||||||
|
@ -111,13 +112,13 @@ impl<const D: u64> EnumSizeOpt<D> {
|
||||||
Const::from_usize(tcx, num_variants),
|
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 {
|
let store_live = Statement {
|
||||||
source_info,
|
source_info,
|
||||||
kind: StatementKind::StorageLive(size_array_local),
|
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 {
|
let constant_vals = Constant {
|
||||||
span,
|
span,
|
||||||
user_ty: None,
|
user_ty: None,
|
||||||
|
@ -133,11 +134,10 @@ impl<const D: u64> EnumSizeOpt<D> {
|
||||||
kind: StatementKind::Assign(box (place, rval)),
|
kind: StatementKind::Assign(box (place, rval)),
|
||||||
};
|
};
|
||||||
|
|
||||||
let discr_place = Place {
|
let discr_place = Place::from(
|
||||||
// How do I get the discriminant type?
|
local_decls
|
||||||
local: patch.new_temp(tcx.types.isize, span),
|
.push(LocalDecl::new(adt_def.repr.discr_type().to_ty(tcx), span)),
|
||||||
projection: List::empty(),
|
);
|
||||||
};
|
|
||||||
|
|
||||||
let store_discr = Statement {
|
let store_discr = Statement {
|
||||||
source_info,
|
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 discr_cast_place =
|
||||||
let size_place = Place {
|
Place::from(local_decls.push(LocalDecl::new(tcx.types.usize, span)));
|
||||||
local: patch.new_temp(tcx.types.usize, span),
|
|
||||||
projection: List::empty(),
|
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 {
|
let store_size = Statement {
|
||||||
source_info,
|
source_info,
|
||||||
kind: StatementKind::Assign(box (
|
kind: StatementKind::Assign(box (
|
||||||
size_place,
|
size_place,
|
||||||
Rvalue::Use(Operand::Copy(Place {
|
Rvalue::Use(Operand::Copy(Place {
|
||||||
local: size_array_local,
|
local: size_array_local,
|
||||||
projection: tcx
|
projection: tcx.intern_place_elems(&[PlaceElem::Index(
|
||||||
.intern_place_elems(&[PlaceElem::Index(discr_place.local)]),
|
discr_cast_place.local,
|
||||||
|
)]),
|
||||||
})),
|
})),
|
||||||
)),
|
)),
|
||||||
};
|
};
|
||||||
|
|
||||||
let dst = Place {
|
let dst =
|
||||||
local: patch.new_temp(tcx.mk_mut_ptr(ty), span),
|
Place::from(local_decls.push(LocalDecl::new(tcx.mk_mut_ptr(ty), span)));
|
||||||
projection: List::empty(),
|
|
||||||
};
|
|
||||||
|
|
||||||
let dst_ptr = Statement {
|
let dst_ptr = Statement {
|
||||||
source_info,
|
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_ty = tcx.mk_mut_ptr(tcx.types.u8);
|
||||||
let dst_cast_place = Place {
|
let dst_cast_place =
|
||||||
local: patch.new_temp(dst_cast_ty, span),
|
Place::from(local_decls.push(LocalDecl::new(dst_cast_ty, span)));
|
||||||
projection: List::empty(),
|
|
||||||
};
|
|
||||||
|
|
||||||
let dst_cast = Statement {
|
let dst_cast = Statement {
|
||||||
source_info,
|
source_info,
|
||||||
|
@ -192,10 +202,8 @@ impl<const D: u64> EnumSizeOpt<D> {
|
||||||
)),
|
)),
|
||||||
};
|
};
|
||||||
|
|
||||||
let src = Place {
|
let src =
|
||||||
local: patch.new_temp(tcx.mk_imm_ptr(ty), span),
|
Place::from(local_decls.push(LocalDecl::new(tcx.mk_imm_ptr(ty), span)));
|
||||||
projection: List::empty(),
|
|
||||||
};
|
|
||||||
|
|
||||||
let src_ptr = Statement {
|
let src_ptr = Statement {
|
||||||
source_info,
|
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_ty = tcx.mk_imm_ptr(tcx.types.u8);
|
||||||
let src_cast_place = Place {
|
let src_cast_place =
|
||||||
local: patch.new_temp(src_cast_ty, span),
|
Place::from(local_decls.push(LocalDecl::new(src_cast_ty, span)));
|
||||||
projection: List::empty(),
|
|
||||||
};
|
|
||||||
|
|
||||||
let src_cast = Statement {
|
let src_cast = Statement {
|
||||||
source_info,
|
source_info,
|
||||||
|
@ -245,6 +251,7 @@ impl<const D: u64> EnumSizeOpt<D> {
|
||||||
store_live,
|
store_live,
|
||||||
const_assign,
|
const_assign,
|
||||||
store_discr,
|
store_discr,
|
||||||
|
cast_discr,
|
||||||
store_size,
|
store_size,
|
||||||
dst_ptr,
|
dst_ptr,
|
||||||
dst_cast,
|
dst_cast,
|
||||||
|
@ -261,6 +268,5 @@ impl<const D: u64> EnumSizeOpt<D> {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
patch.apply(body);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue