]> git.lizzy.rs Git - rust.git/commitdiff
trans: noop drops don't need their lvalue in an alloca.
authorEduard Burtescu <edy.burt@gmail.com>
Thu, 9 Jun 2016 15:15:15 +0000 (18:15 +0300)
committerEduard Burtescu <edy.burt@gmail.com>
Mon, 20 Jun 2016 20:18:21 +0000 (23:18 +0300)
src/librustc_trans/mir/analyze.rs
src/librustc_trans/mir/block.rs

index 93ac002f2a98943e60cf0d3a32ad9b976812a3f8..65581d43f8820ca21fa13da1d6dddad1aee0e1bd 100644 (file)
@@ -18,6 +18,7 @@
 use rustc::mir::visit::{Visitor, LvalueContext};
 use rustc::mir::traversal;
 use common::{self, Block, BlockAndBuilder};
+use glue;
 use super::rvalue;
 
 pub fn lvalue_temps<'bcx,'tcx>(bcx: Block<'bcx,'tcx>,
@@ -138,13 +139,21 @@ fn visit_lvalue(&mut self,
                     LvalueContext::Consume => {
                     }
                     LvalueContext::Store |
-                    LvalueContext::Drop |
                     LvalueContext::Inspect |
                     LvalueContext::Borrow { .. } |
                     LvalueContext::Slice { .. } |
                     LvalueContext::Projection => {
                         self.mark_as_lvalue(temp.index());
                     }
+                    LvalueContext::Drop => {
+                        let ty = self.mir.temp_decls[index as usize].ty;
+                        let ty = self.bcx.monomorphize(&ty);
+
+                        // Only need the lvalue if we're actually dropping it.
+                        if glue::type_needs_drop(self.bcx.tcx(), ty) {
+                            self.mark_as_lvalue(index as usize);
+                        }
+                    }
                 }
             }
             _ => {
index bdcf3dd8cd41884e61eb24f35ef47fe9d048ed22..4591fa28578118c9ad3e3571e790209e411823ee 100644 (file)
@@ -196,13 +196,16 @@ pub fn trans_block(&mut self, bb: mir::BasicBlock) {
             }
 
             mir::TerminatorKind::Drop { ref location, target, unwind } => {
-                let lvalue = self.trans_lvalue(&bcx, location);
-                let ty = lvalue.ty.to_ty(bcx.tcx());
+                let ty = mir.lvalue_ty(bcx.tcx(), location).to_ty(bcx.tcx());
+                let ty = bcx.monomorphize(&ty);
+
                 // Double check for necessity to drop
                 if !glue::type_needs_drop(bcx.tcx(), ty) {
                     funclet_br(self, bcx, target);
                     return;
                 }
+
+                let lvalue = self.trans_lvalue(&bcx, location);
                 let drop_fn = glue::get_drop_glue(bcx.ccx(), ty);
                 let drop_ty = glue::get_drop_glue_type(bcx.tcx(), ty);
                 let llvalue = if drop_ty != ty {