Remove PlaceBase enum and make Place base field be local: Local
This commit is contained in:
parent
fd5aa32c35
commit
5d9b399044
50 changed files with 456 additions and 656 deletions
|
|
@ -128,17 +128,13 @@ impl<Bx: BuilderMethods<'a, 'tcx>> LocalAnalyzer<'mir, 'a, 'tcx, Bx> {
|
|||
};
|
||||
if is_consume {
|
||||
let base_ty =
|
||||
mir::Place::ty_from(place_ref.base, proj_base, *self.fx.mir, cx.tcx());
|
||||
mir::Place::ty_from(place_ref.local, proj_base, *self.fx.mir, cx.tcx());
|
||||
let base_ty = self.fx.monomorphize(&base_ty);
|
||||
|
||||
// ZSTs don't require any actual memory access.
|
||||
let elem_ty = base_ty.projection_ty(cx.tcx(), elem).ty;
|
||||
let elem_ty = self.fx.monomorphize(&elem_ty);
|
||||
let span = match place_ref.base {
|
||||
mir::PlaceBase::Local(index) => {
|
||||
self.fx.mir.local_decls[*index].source_info.span
|
||||
}
|
||||
};
|
||||
let span = self.fx.mir.local_decls[*place_ref.local].source_info.span;
|
||||
if cx.spanned_layout_of(elem_ty, span).is_zst() {
|
||||
return;
|
||||
}
|
||||
|
|
@ -178,9 +174,7 @@ impl<Bx: BuilderMethods<'a, 'tcx>> LocalAnalyzer<'mir, 'a, 'tcx, Bx> {
|
|||
// We use `NonUseContext::VarDebugInfo` for the base,
|
||||
// which might not force the base local to memory,
|
||||
// so we have to do it manually.
|
||||
match place_ref.base {
|
||||
mir::PlaceBase::Local(local) => self.visit_local(&local, context, location),
|
||||
}
|
||||
self.visit_local(place_ref.local, context, location);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -191,7 +185,7 @@ impl<Bx: BuilderMethods<'a, 'tcx>> LocalAnalyzer<'mir, 'a, 'tcx, Bx> {
|
|||
}
|
||||
|
||||
self.process_place(
|
||||
&mir::PlaceRef { base: place_ref.base, projection: proj_base },
|
||||
&mir::PlaceRef { local: place_ref.local, projection: proj_base },
|
||||
base_context,
|
||||
location,
|
||||
);
|
||||
|
|
@ -218,8 +212,8 @@ impl<Bx: BuilderMethods<'a, 'tcx>> LocalAnalyzer<'mir, 'a, 'tcx, Bx> {
|
|||
};
|
||||
}
|
||||
|
||||
self.visit_place_base(place_ref.base, context, location);
|
||||
self.visit_projection(place_ref.base, place_ref.projection, context, location);
|
||||
self.visit_place_base(place_ref.local, context, location);
|
||||
self.visit_projection(place_ref.local, place_ref.projection, context, location);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1109,7 +1109,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||
} else {
|
||||
self.codegen_place(
|
||||
bx,
|
||||
&mir::PlaceRef { base: &dest.base, projection: &dest.projection },
|
||||
&mir::PlaceRef { local: &dest.local, projection: &dest.projection },
|
||||
)
|
||||
};
|
||||
if fn_ret.is_indirect() {
|
||||
|
|
|
|||
|
|
@ -258,9 +258,7 @@ pub fn per_local_var_debug_info(
|
|||
if tcx.sess.opts.debuginfo == DebugInfo::Full || !tcx.sess.fewer_names() {
|
||||
let mut per_local = IndexVec::from_elem(vec![], &body.local_decls);
|
||||
for var in &body.var_debug_info {
|
||||
match var.place.base {
|
||||
mir::PlaceBase::Local(local) => per_local[local].push(var),
|
||||
}
|
||||
per_local[var.place.local].push(var);
|
||||
}
|
||||
Some(per_local)
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -373,43 +373,39 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||
) -> Option<OperandRef<'tcx, Bx::Value>> {
|
||||
debug!("maybe_codegen_consume_direct(place_ref={:?})", place_ref);
|
||||
|
||||
match place_ref.base {
|
||||
mir::PlaceBase::Local(index) => {
|
||||
match self.locals[*index] {
|
||||
LocalRef::Operand(Some(mut o)) => {
|
||||
// Moves out of scalar and scalar pair fields are trivial.
|
||||
for elem in place_ref.projection.iter() {
|
||||
match elem {
|
||||
mir::ProjectionElem::Field(ref f, _) => {
|
||||
o = o.extract_field(bx, f.index());
|
||||
}
|
||||
mir::ProjectionElem::Index(_)
|
||||
| mir::ProjectionElem::ConstantIndex { .. } => {
|
||||
// ZSTs don't require any actual memory access.
|
||||
// FIXME(eddyb) deduplicate this with the identical
|
||||
// checks in `codegen_consume` and `extract_field`.
|
||||
let elem = o.layout.field(bx.cx(), 0);
|
||||
if elem.is_zst() {
|
||||
o = OperandRef::new_zst(bx, elem);
|
||||
} else {
|
||||
return None;
|
||||
}
|
||||
}
|
||||
_ => return None,
|
||||
match self.locals[*place_ref.local] {
|
||||
LocalRef::Operand(Some(mut o)) => {
|
||||
// Moves out of scalar and scalar pair fields are trivial.
|
||||
for elem in place_ref.projection.iter() {
|
||||
match elem {
|
||||
mir::ProjectionElem::Field(ref f, _) => {
|
||||
o = o.extract_field(bx, f.index());
|
||||
}
|
||||
mir::ProjectionElem::Index(_)
|
||||
| mir::ProjectionElem::ConstantIndex { .. } => {
|
||||
// ZSTs don't require any actual memory access.
|
||||
// FIXME(eddyb) deduplicate this with the identical
|
||||
// checks in `codegen_consume` and `extract_field`.
|
||||
let elem = o.layout.field(bx.cx(), 0);
|
||||
if elem.is_zst() {
|
||||
o = OperandRef::new_zst(bx, elem);
|
||||
} else {
|
||||
return None;
|
||||
}
|
||||
}
|
||||
|
||||
Some(o)
|
||||
}
|
||||
LocalRef::Operand(None) => {
|
||||
bug!("use of {:?} before def", place_ref);
|
||||
}
|
||||
LocalRef::Place(..) | LocalRef::UnsizedPlace(..) => {
|
||||
// watch out for locals that do not have an
|
||||
// alloca; they are handled somewhat differently
|
||||
None
|
||||
_ => return None,
|
||||
}
|
||||
}
|
||||
|
||||
Some(o)
|
||||
}
|
||||
LocalRef::Operand(None) => {
|
||||
bug!("use of {:?} before def", place_ref);
|
||||
}
|
||||
LocalRef::Place(..) | LocalRef::UnsizedPlace(..) => {
|
||||
// watch out for locals that do not have an
|
||||
// alloca; they are handled somewhat differently
|
||||
None
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -415,28 +415,26 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||
let tcx = self.cx.tcx();
|
||||
|
||||
let result = match place_ref {
|
||||
mir::PlaceRef { base: mir::PlaceBase::Local(index), projection: [] } => {
|
||||
match self.locals[*index] {
|
||||
LocalRef::Place(place) => {
|
||||
return place;
|
||||
}
|
||||
LocalRef::UnsizedPlace(place) => {
|
||||
return bx.load_operand(place).deref(cx);
|
||||
}
|
||||
LocalRef::Operand(..) => {
|
||||
bug!("using operand local {:?} as place", place_ref);
|
||||
}
|
||||
mir::PlaceRef { local, projection: [] } => match self.locals[**local] {
|
||||
LocalRef::Place(place) => {
|
||||
return place;
|
||||
}
|
||||
}
|
||||
mir::PlaceRef { base, projection: [proj_base @ .., mir::ProjectionElem::Deref] } => {
|
||||
LocalRef::UnsizedPlace(place) => {
|
||||
return bx.load_operand(place).deref(cx);
|
||||
}
|
||||
LocalRef::Operand(..) => {
|
||||
bug!("using operand local {:?} as place", place_ref);
|
||||
}
|
||||
},
|
||||
mir::PlaceRef { local, projection: [proj_base @ .., mir::ProjectionElem::Deref] } => {
|
||||
// Load the pointer from its location.
|
||||
self.codegen_consume(bx, &mir::PlaceRef { base, projection: proj_base })
|
||||
self.codegen_consume(bx, &mir::PlaceRef { local, projection: proj_base })
|
||||
.deref(bx.cx())
|
||||
}
|
||||
mir::PlaceRef { base, projection: [proj_base @ .., elem] } => {
|
||||
mir::PlaceRef { local, projection: [proj_base @ .., elem] } => {
|
||||
// FIXME turn this recursion into iteration
|
||||
let cg_base =
|
||||
self.codegen_place(bx, &mir::PlaceRef { base, projection: proj_base });
|
||||
self.codegen_place(bx, &mir::PlaceRef { local, projection: proj_base });
|
||||
|
||||
match elem {
|
||||
mir::ProjectionElem::Deref => bug!(),
|
||||
|
|
@ -501,7 +499,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||
|
||||
pub fn monomorphized_place_ty(&self, place_ref: &mir::PlaceRef<'_, 'tcx>) -> Ty<'tcx> {
|
||||
let tcx = self.cx.tcx();
|
||||
let place_ty = mir::Place::ty_from(place_ref.base, place_ref.projection, *self.mir, tcx);
|
||||
let place_ty = mir::Place::ty_from(place_ref.local, place_ref.projection, *self.mir, tcx);
|
||||
self.monomorphize(&place_ty.ty)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue