Do not clone Mir unnecessarily

This commit is contained in:
Simonas Kazlauskas 2016-10-31 02:16:21 +02:00
parent f5a702dc78
commit 8ec0b3a12a
2 changed files with 7 additions and 5 deletions

View File

@ -63,7 +63,8 @@ macro_rules! newtype_index {
}
/// Lowered representation of a single function.
#[derive(Clone, RustcEncodable, RustcDecodable, Debug)]
// Do not implement clone for Mir, its easy to do so accidently and its kind of expensive.
#[derive(RustcEncodable, RustcDecodable, Debug)]
pub struct Mir<'tcx> {
/// List of basic blocks. References to basic block use a newtyped index type `BasicBlock`
/// that indexes into this vector.

View File

@ -37,13 +37,14 @@ use super::analyze::CleanupKind;
use super::constant::Const;
use super::lvalue::{LvalueRef};
use super::operand::OperandRef;
use super::operand::OperandValue::*;
use super::operand::OperandValue::{Pair, Ref, Immediate};
use std::cell::Ref as CellRef;
impl<'bcx, 'tcx> MirContext<'bcx, 'tcx> {
pub fn trans_block(&mut self, bb: mir::BasicBlock) {
let mut bcx = self.bcx(bb);
let mir = self.mir.clone();
let data = &mir[bb];
let data = &CellRef::clone(&self.mir)[bb];
debug!("trans_block({:?}={:?})", bb, data);
@ -228,7 +229,7 @@ impl<'bcx, 'tcx> MirContext<'bcx, 'tcx> {
}
mir::TerminatorKind::Drop { ref location, target, unwind } => {
let ty = location.ty(&mir, bcx.tcx()).to_ty(bcx.tcx());
let ty = location.ty(&self.mir, bcx.tcx()).to_ty(bcx.tcx());
let ty = bcx.monomorphize(&ty);
// Double check for necessity to drop