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 }
|
||||
}
|
||||
|
||||
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) => {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue