diff options
| author | Nicholas Nethercote <nnethercote@mozilla.com> | 2018-09-14 14:55:21 +1000 |
|---|---|---|
| committer | Nicholas Nethercote <nnethercote@mozilla.com> | 2018-09-14 14:55:21 +1000 |
| commit | aa9aca0d3d6aa371691d226bd41b4dd4af083a46 (patch) | |
| tree | 878ae522f906ec6b5743c045f2f1600f05c308dd | |
| parent | d6720cc810ea3dc9e051a95ff1a8dc9755c3bdb5 (diff) | |
| download | rust-aa9aca0d3d6aa371691d226bd41b4dd4af083a46.tar.gz rust-aa9aca0d3d6aa371691d226bd41b4dd4af083a46.zip | |
De-overlap the lifetimes of `flow_inits` and `flow_{un,ever_}inits`.
This reduces `max-rss` for an `nll-check` build by 27% for `keccak`, and by 8% for `inflate`.
| -rw-r--r-- | src/librustc_mir/borrow_check/mod.rs | 42 |
1 files changed, 24 insertions, 18 deletions
diff --git a/src/librustc_mir/borrow_check/mod.rs b/src/librustc_mir/borrow_check/mod.rs index 76f6bcb5e56..8b379c5ce69 100644 --- a/src/librustc_mir/borrow_check/mod.rs +++ b/src/librustc_mir/borrow_check/mod.rs @@ -177,24 +177,6 @@ fn do_mir_borrowck<'a, 'gcx, 'tcx>( MaybeInitializedPlaces::new(tcx, mir, &mdpe), |bd, i| DebugFormatted::new(&bd.move_data().move_paths[i]), )); - let flow_uninits = FlowAtLocation::new(do_dataflow( - tcx, - mir, - id, - &attributes, - &dead_unwinds, - MaybeUninitializedPlaces::new(tcx, mir, &mdpe), - |bd, i| DebugFormatted::new(&bd.move_data().move_paths[i]), - )); - let flow_ever_inits = FlowAtLocation::new(do_dataflow( - tcx, - mir, - id, - &attributes, - &dead_unwinds, - EverInitializedPlaces::new(tcx, mir, &mdpe), - |bd, i| DebugFormatted::new(&bd.move_data().inits[i]), - )); let locals_are_invalidated_at_exit = match tcx.hir.body_owner_kind(id) { hir::BodyOwnerKind::Const | hir::BodyOwnerKind::Static(_) => false, @@ -216,6 +198,12 @@ fn do_mir_borrowck<'a, 'gcx, 'tcx>( &borrow_set, &mut errors_buffer, ); + + // The various `flow_*` structures can be large. We drop `flow_inits` here + // so it doesn't overlap with the others below. This reduces peak memory + // usage significantly on some benchmarks. + drop(flow_inits); + let regioncx = Rc::new(regioncx); let flow_borrows = FlowAtLocation::new(do_dataflow( @@ -227,6 +215,24 @@ fn do_mir_borrowck<'a, 'gcx, 'tcx>( Borrows::new(tcx, mir, regioncx.clone(), def_id, body_id, &borrow_set), |rs, i| DebugFormatted::new(&rs.location(i)), )); + let flow_uninits = FlowAtLocation::new(do_dataflow( + tcx, + mir, + id, + &attributes, + &dead_unwinds, + MaybeUninitializedPlaces::new(tcx, mir, &mdpe), + |bd, i| DebugFormatted::new(&bd.move_data().move_paths[i]), + )); + let flow_ever_inits = FlowAtLocation::new(do_dataflow( + tcx, + mir, + id, + &attributes, + &dead_unwinds, + EverInitializedPlaces::new(tcx, mir, &mdpe), + |bd, i| DebugFormatted::new(&bd.move_data().inits[i]), + )); let movable_generator = match tcx.hir.get(id) { Node::Expr(&hir::Expr { |
