From 7bcc9ae422e03cfc7855363c7e39cf737b8d3ed6 Mon Sep 17 00:00:00 2001 From: Paul Trojahn Date: Thu, 3 Jun 2021 19:24:48 +0200 Subject: [PATCH] Avoid cloning LocalDecls --- compiler/rustc_middle/src/mir/mod.rs | 5 +++++ compiler/rustc_mir/src/transform/inline.rs | 8 +------- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/compiler/rustc_middle/src/mir/mod.rs b/compiler/rustc_middle/src/mir/mod.rs index b66995afc6db6..17392c0ceb1ef 100644 --- a/compiler/rustc_middle/src/mir/mod.rs +++ b/compiler/rustc_middle/src/mir/mod.rs @@ -427,6 +427,11 @@ impl<'tcx> Body<'tcx> { (arg_count + 1..local_count).map(Local::new) } + #[inline] + pub fn drain_vars_and_temps<'a>(&'a mut self) -> impl Iterator> + 'a { + self.local_decls.drain(self.arg_count + 1..) + } + /// Changes a statement to a nop. This is both faster than deleting instructions and avoids /// invalidating statement indices in `Location`s. pub fn make_statement_nop(&mut self, location: Location) { diff --git a/compiler/rustc_mir/src/transform/inline.rs b/compiler/rustc_mir/src/transform/inline.rs index c333667b3ad13..8e9da31eba11f 100644 --- a/compiler/rustc_mir/src/transform/inline.rs +++ b/compiler/rustc_mir/src/transform/inline.rs @@ -607,13 +607,7 @@ impl Inliner<'tcx> { } // Insert all of the (mapped) parts of the callee body into the caller. - caller_body.local_decls.extend( - // FIXME(eddyb) make `Range` iterable so that we can use - // `callee_body.local_decls.drain(callee_body.vars_and_temps())` - callee_body - .vars_and_temps_iter() - .map(|local| callee_body.local_decls[local].clone()), - ); + caller_body.local_decls.extend(callee_body.drain_vars_and_temps()); caller_body.source_scopes.extend(&mut callee_body.source_scopes.drain(..)); caller_body.var_debug_info.append(&mut callee_body.var_debug_info); caller_body.basic_blocks_mut().extend(callee_body.basic_blocks_mut().drain(..));