From e221b24cb6d0a5331bfa04a546cea16f22c41988 Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Mon, 24 Sep 2018 12:13:23 +1000 Subject: [PATCH] Shrink StatementKind::InlineAsm. This shrinks StatementKind from 64 bytes to 48 bytes on 64-bit. --- src/librustc/mir/mod.rs | 4 ++-- src/librustc/ty/structural_impls.rs | 10 ++++++++++ src/librustc_mir/borrow_check/mod.rs | 4 ++-- src/librustc_mir/borrow_check/nll/invalidation.rs | 4 ++-- src/librustc_mir/build/expr/stmt.rs | 6 ++++-- src/librustc_mir/dataflow/move_paths/builder.rs | 2 +- 6 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/librustc/mir/mod.rs b/src/librustc/mir/mod.rs index ab1304acf2a5..6e9f5a7a215f 100644 --- a/src/librustc/mir/mod.rs +++ b/src/librustc/mir/mod.rs @@ -1633,8 +1633,8 @@ pub enum StatementKind<'tcx> { /// Execute a piece of inline Assembly. InlineAsm { asm: Box, - outputs: Vec>, - inputs: Vec>, + outputs: Box<[Place<'tcx>]>, + inputs: Box<[Operand<'tcx>]>, }, /// Assert the given places to be valid inhabitants of their type. These statements are diff --git a/src/librustc/ty/structural_impls.rs b/src/librustc/ty/structural_impls.rs index bd9dfc6b8551..aab268c07c4f 100644 --- a/src/librustc/ty/structural_impls.rs +++ b/src/librustc/ty/structural_impls.rs @@ -720,6 +720,16 @@ impl<'tcx, T: TypeFoldable<'tcx>> TypeFoldable<'tcx> for Vec { } } +impl<'tcx, T: TypeFoldable<'tcx>> TypeFoldable<'tcx> for Box<[T]> { + fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self { + self.iter().map(|t| t.fold_with(folder)).collect::>().into_boxed_slice() + } + + fn super_visit_with>(&self, visitor: &mut V) -> bool { + self.iter().any(|t| t.visit_with(visitor)) + } +} + impl<'tcx, T:TypeFoldable<'tcx>> TypeFoldable<'tcx> for ty::Binder { fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self { self.map_bound_ref(|ty| ty.fold_with(folder)) diff --git a/src/librustc_mir/borrow_check/mod.rs b/src/librustc_mir/borrow_check/mod.rs index 06884875598d..ae0a06294bf5 100644 --- a/src/librustc_mir/borrow_check/mod.rs +++ b/src/librustc_mir/borrow_check/mod.rs @@ -528,7 +528,7 @@ impl<'cx, 'gcx, 'tcx> DataflowResultsConsumer<'cx, 'tcx> for MirBorrowckCtxt<'cx ref inputs, } => { let context = ContextKind::InlineAsm.new(location); - for (o, output) in asm.outputs.iter().zip(outputs) { + for (o, output) in asm.outputs.iter().zip(outputs.iter()) { if o.is_indirect { // FIXME(eddyb) indirect inline asm outputs should // be encoeded through MIR place derefs instead. @@ -555,7 +555,7 @@ impl<'cx, 'gcx, 'tcx> DataflowResultsConsumer<'cx, 'tcx> for MirBorrowckCtxt<'cx ); } } - for input in inputs { + for input in inputs.iter() { self.consume_operand(context, (input, span), flow_state); } } diff --git a/src/librustc_mir/borrow_check/nll/invalidation.rs b/src/librustc_mir/borrow_check/nll/invalidation.rs index cd760746c125..b755482b49ae 100644 --- a/src/librustc_mir/borrow_check/nll/invalidation.rs +++ b/src/librustc_mir/borrow_check/nll/invalidation.rs @@ -118,7 +118,7 @@ impl<'cg, 'cx, 'tcx, 'gcx> Visitor<'tcx> for InvalidationGenerator<'cg, 'cx, 'tc ref inputs, } => { let context = ContextKind::InlineAsm.new(location); - for (o, output) in asm.outputs.iter().zip(outputs) { + for (o, output) in asm.outputs.iter().zip(outputs.iter()) { if o.is_indirect { // FIXME(eddyb) indirect inline asm outputs should // be encoeded through MIR place derefs instead. @@ -137,7 +137,7 @@ impl<'cg, 'cx, 'tcx, 'gcx> Visitor<'tcx> for InvalidationGenerator<'cg, 'cx, 'tc ); } } - for input in inputs { + for input in inputs.iter() { self.consume_operand(context, input); } } diff --git a/src/librustc_mir/build/expr/stmt.rs b/src/librustc_mir/build/expr/stmt.rs index 0086cff46e53..32f09599ace8 100644 --- a/src/librustc_mir/build/expr/stmt.rs +++ b/src/librustc_mir/build/expr/stmt.rs @@ -143,11 +143,13 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> { let outputs = outputs .into_iter() .map(|output| unpack!(block = this.as_place(block, output))) - .collect(); + .collect::>() + .into_boxed_slice(); let inputs = inputs .into_iter() .map(|input| unpack!(block = this.as_local_operand(block, input))) - .collect(); + .collect::>() + .into_boxed_slice(); this.cfg.push( block, Statement { diff --git a/src/librustc_mir/dataflow/move_paths/builder.rs b/src/librustc_mir/dataflow/move_paths/builder.rs index 63adcb5132a7..2884b15ca47d 100644 --- a/src/librustc_mir/dataflow/move_paths/builder.rs +++ b/src/librustc_mir/dataflow/move_paths/builder.rs @@ -290,7 +290,7 @@ impl<'b, 'a, 'gcx, 'tcx> Gatherer<'b, 'a, 'gcx, 'tcx> { self.gather_init(output, InitKind::Deep); } } - for input in inputs { + for input in inputs.iter() { self.gather_operand(input); } }