1
Fork 0

trans: split trans_consume off from trans_operand.

This commit is contained in:
Eduard Burtescu 2016-06-09 18:13:16 +03:00
parent 5522e678bc
commit 93c32b55e2

View file

@ -164,6 +164,56 @@ impl<'bcx, 'tcx> MirContext<'bcx, 'tcx> {
OperandRef { val: val, ty: ty }
}
pub fn trans_consume(&mut self,
bcx: &BlockAndBuilder<'bcx, 'tcx>,
lvalue: &mir::Lvalue<'tcx>)
-> OperandRef<'tcx>
{
debug!("trans_consume(lvalue={:?})", lvalue);
// watch out for temporaries that do not have an
// alloca; they are handled somewhat differently
if let &mir::Lvalue::Temp(index) = lvalue {
match self.temps[index] {
TempRef::Operand(Some(o)) => {
return o;
}
TempRef::Operand(None) => {
bug!("use of {:?} before def", lvalue);
}
TempRef::Lvalue(..) => {
// use path below
}
}
}
// Moves out of pair fields are trivial.
if let &mir::Lvalue::Projection(ref proj) = lvalue {
if let mir::Lvalue::Temp(index) = proj.base {
let temp_ref = &self.temps[index];
if let &TempRef::Operand(Some(o)) = temp_ref {
match (o.val, &proj.elem) {
(OperandValue::Pair(a, b),
&mir::ProjectionElem::Field(ref f, ty)) => {
let llval = [a, b][f.index()];
return OperandRef {
val: OperandValue::Immediate(llval),
ty: bcx.monomorphize(&ty)
};
}
_ => {}
}
}
}
}
// for most lvalues, to consume them we just load them
// out from their home
let tr_lvalue = self.trans_lvalue(bcx, lvalue);
let ty = tr_lvalue.ty.to_ty(bcx.tcx());
self.trans_load(bcx, tr_lvalue.llval, ty)
}
pub fn trans_operand(&mut self,
bcx: &BlockAndBuilder<'bcx, 'tcx>,
operand: &mir::Operand<'tcx>)
@ -173,47 +223,7 @@ impl<'bcx, 'tcx> MirContext<'bcx, 'tcx> {
match *operand {
mir::Operand::Consume(ref lvalue) => {
// watch out for temporaries that do not have an
// alloca; they are handled somewhat differently
if let &mir::Lvalue::Temp(index) = lvalue {
match self.temps[index] {
TempRef::Operand(Some(o)) => {
return o;
}
TempRef::Operand(None) => {
bug!("use of {:?} before def", lvalue);
}
TempRef::Lvalue(..) => {
// use path below
}
}
}
// Moves out of pair fields are trivial.
if let &mir::Lvalue::Projection(ref proj) = lvalue {
if let mir::Lvalue::Temp(index) = proj.base {
let temp_ref = &self.temps[index];
if let &TempRef::Operand(Some(o)) = temp_ref {
match (o.val, &proj.elem) {
(OperandValue::Pair(a, b),
&mir::ProjectionElem::Field(ref f, ty)) => {
let llval = [a, b][f.index()];
return OperandRef {
val: OperandValue::Immediate(llval),
ty: bcx.monomorphize(&ty)
};
}
_ => {}
}
}
}
}
// for most lvalues, to consume them we just load them
// out from their home
let tr_lvalue = self.trans_lvalue(bcx, lvalue);
let ty = tr_lvalue.ty.to_ty(bcx.tcx());
self.trans_load(bcx, tr_lvalue.llval, ty)
self.trans_consume(bcx, lvalue)
}
mir::Operand::Constant(ref constant) => {