trans: split trans_consume off from trans_operand.
This commit is contained in:
parent
5522e678bc
commit
93c32b55e2
1 changed files with 51 additions and 41 deletions
|
@ -164,6 +164,56 @@ impl<'bcx, 'tcx> MirContext<'bcx, 'tcx> {
|
||||||
OperandRef { val: val, ty: ty }
|
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,
|
pub fn trans_operand(&mut self,
|
||||||
bcx: &BlockAndBuilder<'bcx, 'tcx>,
|
bcx: &BlockAndBuilder<'bcx, 'tcx>,
|
||||||
operand: &mir::Operand<'tcx>)
|
operand: &mir::Operand<'tcx>)
|
||||||
|
@ -173,47 +223,7 @@ impl<'bcx, 'tcx> MirContext<'bcx, 'tcx> {
|
||||||
|
|
||||||
match *operand {
|
match *operand {
|
||||||
mir::Operand::Consume(ref lvalue) => {
|
mir::Operand::Consume(ref lvalue) => {
|
||||||
// watch out for temporaries that do not have an
|
self.trans_consume(bcx, lvalue)
|
||||||
// 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)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mir::Operand::Constant(ref constant) => {
|
mir::Operand::Constant(ref constant) => {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue