From 93c32b55e2f03bc88d3d1601626bcd9059924005 Mon Sep 17 00:00:00 2001 From: Eduard Burtescu Date: Thu, 9 Jun 2016 18:13:16 +0300 Subject: [PATCH] trans: split trans_consume off from trans_operand. --- src/librustc_trans/mir/operand.rs | 92 +++++++++++++++++-------------- 1 file changed, 51 insertions(+), 41 deletions(-) diff --git a/src/librustc_trans/mir/operand.rs b/src/librustc_trans/mir/operand.rs index 80ff0a92d8d..980db76d632 100644 --- a/src/librustc_trans/mir/operand.rs +++ b/src/librustc_trans/mir/operand.rs @@ -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) => {