Skip to content

Commit

Permalink
trans: split trans_consume off from trans_operand.
Browse files Browse the repository at this point in the history
  • Loading branch information
eddyb committed Jun 20, 2016
1 parent 5522e67 commit 93c32b5
Showing 1 changed file with 50 additions and 40 deletions.
90 changes: 50 additions & 40 deletions src/librustc_trans/mir/operand.rs
Expand Up @@ -164,56 +164,66 @@ impl<'bcx, 'tcx> MirContext<'bcx, 'tcx> {
OperandRef { val: val, ty: ty }
}

pub fn trans_operand(&mut self,
pub fn trans_consume(&mut self,
bcx: &BlockAndBuilder<'bcx, 'tcx>,
operand: &mir::Operand<'tcx>)
lvalue: &mir::Lvalue<'tcx>)
-> OperandRef<'tcx>
{
debug!("trans_operand(operand={:?})", operand);
debug!("trans_consume(lvalue={:?})", lvalue);

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
}
}
// 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)
};
}
_ => {}
}
// 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)
}

// 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>)
-> OperandRef<'tcx>
{
debug!("trans_operand(operand={:?})", operand);

match *operand {
mir::Operand::Consume(ref lvalue) => {
self.trans_consume(bcx, lvalue)
}

mir::Operand::Constant(ref constant) => {
Expand Down

0 comments on commit 93c32b5

Please sign in to comment.