diff options
| author | Wesley Wiser <wwiser@gmail.com> | 2019-11-07 19:21:40 -0500 |
|---|---|---|
| committer | Wesley Wiser <wwiser@gmail.com> | 2019-11-08 22:28:53 -0500 |
| commit | 4505ff4badd0ffe137772401c39dfa760ff9d4a6 (patch) | |
| tree | e55329296fffc4ebe47834d3442f1f05dde96eb3 | |
| parent | 8316701d37cd5a54c658220f6b6e8b1f43c5639e (diff) | |
| download | rust-4505ff4badd0ffe137772401c39dfa760ff9d4a6.tar.gz rust-4505ff4badd0ffe137772401c39dfa760ff9d4a6.zip | |
[mir-opt] Handle aggregates in SimplifyLocals pass
| -rw-r--r-- | src/librustc_mir/transform/simplify.rs | 23 | ||||
| -rw-r--r-- | src/test/incremental/hashes/struct_constructors.rs | 4 | ||||
| -rw-r--r-- | src/test/mir-opt/const_prop/return_place.rs | 3 |
3 files changed, 17 insertions, 13 deletions
diff --git a/src/librustc_mir/transform/simplify.rs b/src/librustc_mir/transform/simplify.rs index 1b90ea78c64..f6b09f20bab 100644 --- a/src/librustc_mir/transform/simplify.rs +++ b/src/librustc_mir/transform/simplify.rs @@ -359,13 +359,20 @@ impl<'a, 'tcx> Visitor<'tcx> for DeclMarker<'a, 'tcx> { // Ignore stores of constants because `ConstProp` and `CopyProp` can remove uses of many // of these locals. However, if the local is still needed, then it will be referenced in // another place and we'll mark it as being used there. - if ctx == PlaceContext::MutatingUse(MutatingUseContext::Store) { - let stmt = - &self.body.basic_blocks()[location.block].statements[location.statement_index]; - if let StatementKind::Assign(box (p, Rvalue::Use(Operand::Constant(c)))) = &stmt.kind { - if p.as_local().is_some() { - trace!("skipping store of const value {:?} to {:?}", c, local); - return; + if ctx == PlaceContext::MutatingUse(MutatingUseContext::Store) || + ctx == PlaceContext::MutatingUse(MutatingUseContext::Projection) { + let block = &self.body.basic_blocks()[location.block]; + if location.statement_index != block.statements.len() { + let stmt = + &block.statements[location.statement_index]; + + if let StatementKind::Assign( + box (p, Rvalue::Use(Operand::Constant(c))) + ) = &stmt.kind { + if !p.is_indirect() { + trace!("skipping store of const value {:?} to {:?}", c, p); + return; + } } } } @@ -392,7 +399,7 @@ impl<'tcx> MutVisitor<'tcx> for LocalUpdater<'tcx> { self.map[*l].is_some() } StatementKind::Assign(box (place, _)) => { - if let Some(local) = place.as_local() { + if let PlaceBase::Local(local) = place.base { self.map[local].is_some() } else { true diff --git a/src/test/incremental/hashes/struct_constructors.rs b/src/test/incremental/hashes/struct_constructors.rs index 456d5e74751..7ae1798c7a2 100644 --- a/src/test/incremental/hashes/struct_constructors.rs +++ b/src/test/incremental/hashes/struct_constructors.rs @@ -152,7 +152,7 @@ pub fn change_constructor_path_regular_struct() { } #[cfg(not(cfail1))] -#[rustc_clean(cfg="cfail2", except="HirBody,optimized_mir,mir_built,typeck_tables_of")] +#[rustc_clean(cfg="cfail2", except="HirBody,mir_built,typeck_tables_of")] #[rustc_clean(cfg="cfail3")] pub fn change_constructor_path_regular_struct() { let _ = RegularStruct2 { @@ -213,7 +213,7 @@ pub fn change_constructor_path_tuple_struct() { } #[cfg(not(cfail1))] -#[rustc_clean(cfg="cfail2", except="HirBody,optimized_mir,mir_built,typeck_tables_of")] +#[rustc_clean(cfg="cfail2", except="HirBody,mir_built,typeck_tables_of")] #[rustc_clean(cfg="cfail3")] pub fn change_constructor_path_tuple_struct() { let _ = TupleStruct2(0, 1, 2); diff --git a/src/test/mir-opt/const_prop/return_place.rs b/src/test/mir-opt/const_prop/return_place.rs index 64f23c0efa0..cc9951b554d 100644 --- a/src/test/mir-opt/const_prop/return_place.rs +++ b/src/test/mir-opt/const_prop/return_place.rs @@ -46,10 +46,7 @@ fn main() { // START rustc.add.PreCodegen.before.mir // fn add() -> u32 { // let mut _0: u32; -// let mut _1: (u32, bool); // bb0: { -// (_1.0: u32) = const 4u32; -// (_1.1: bool) = const false; // _0 = const 4u32; // return; // } |
