diff options
| author | bors <bors@rust-lang.org> | 2017-09-07 13:06:12 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2017-09-07 13:06:12 +0000 |
| commit | d93036a043dbd19f394ad320313bdbe81644f121 (patch) | |
| tree | 0e0c0d2a82996fc559985c54771efb1eaf7d2644 | |
| parent | d7d75eff30ff03f607ff0656a50f4be768cfdbc9 (diff) | |
| parent | f2892ad281cb11421ebae741d698e0af14d3ecf6 (diff) | |
Auto merge of #44249 - pnkfelix:debugflag-emit-end-regions, r=arielb1
Debugflag: -Z emit-end-regions Skip EndRegion emission by default. Use `-Z emit-end-regions` to reenable it. The main intent is to fix cases where `EndRegion` emission is believed to be causing excess peak memory pressure. It may also be a welcome change to people inspecting the MIR output who find the EndRegions to be a distraction. (In later follow-up PR's I will put in safe-guards against using the current mir-borrowck without enabling `EndRegion` emission. But I wanted this PR to be minimal, in part because we may wish to backport it to the beta channel if we find that it reduces peak memory usage significantly.)
| -rw-r--r-- | src/librustc/session/config.rs | 2 | ||||
| -rw-r--r-- | src/librustc/session/mod.rs | 4 | ||||
| -rw-r--r-- | src/librustc_mir/build/cfg.rs | 20 | ||||
| -rw-r--r-- | src/librustc_mir/build/scope.rs | 15 | ||||
| -rw-r--r-- | src/librustc_mir/transform/clean_end_regions.rs | 4 | ||||
| -rw-r--r-- | src/test/mir-opt/end_region_1.rs | 2 | ||||
| -rw-r--r-- | src/test/mir-opt/end_region_2.rs | 2 | ||||
| -rw-r--r-- | src/test/mir-opt/end_region_3.rs | 2 | ||||
| -rw-r--r-- | src/test/mir-opt/end_region_4.rs | 2 | ||||
| -rw-r--r-- | src/test/mir-opt/end_region_5.rs | 2 | ||||
| -rw-r--r-- | src/test/mir-opt/end_region_6.rs | 2 | ||||
| -rw-r--r-- | src/test/mir-opt/end_region_7.rs | 2 | ||||
| -rw-r--r-- | src/test/mir-opt/end_region_8.rs | 2 | ||||
| -rw-r--r-- | src/test/mir-opt/end_region_9.rs | 2 | ||||
| -rw-r--r-- | src/test/mir-opt/issue-43457.rs | 2 |
15 files changed, 39 insertions, 26 deletions
diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs index b538c6a6eca..577c905a1d5 100644 --- a/src/librustc/session/config.rs +++ b/src/librustc/session/config.rs @@ -919,6 +919,8 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options, "when debug-printing compiler state, do not include spans"), // o/w tests have closure@path identify_regions: bool = (false, parse_bool, [UNTRACKED], "make unnamed regions display as '# (where # is some non-ident unique id)"), + emit_end_regions: bool = (false, parse_bool, [UNTRACKED], + "emit EndRegion as part of MIR; enable transforms that solely process EndRegion"), borrowck_mir: bool = (false, parse_bool, [UNTRACKED], "implicitly treat functions as if they have `#[rustc_mir_borrowck]` attribute"), time_passes: bool = (false, parse_bool, [UNTRACKED], diff --git a/src/librustc/session/mod.rs b/src/librustc/session/mod.rs index 823a637c7e0..129a9f55750 100644 --- a/src/librustc/session/mod.rs +++ b/src/librustc/session/mod.rs @@ -410,6 +410,10 @@ impl Session { pub fn print_llvm_passes(&self) -> bool { self.opts.debugging_opts.print_llvm_passes } + pub fn emit_end_regions(&self) -> bool { + self.opts.debugging_opts.emit_end_regions || + (self.opts.debugging_opts.mir_emit_validate > 0) + } pub fn lto(&self) -> bool { self.opts.cg.lto } diff --git a/src/librustc_mir/build/cfg.rs b/src/librustc_mir/build/cfg.rs index d77fe5170e0..a6e31bcddd2 100644 --- a/src/librustc_mir/build/cfg.rs +++ b/src/librustc_mir/build/cfg.rs @@ -16,6 +16,7 @@ use build::CFG; use rustc::middle::region; use rustc::mir::*; +use rustc::ty; impl<'tcx> CFG<'tcx> { pub fn block_data(&self, blk: BasicBlock) -> &BasicBlockData<'tcx> { @@ -44,14 +45,17 @@ impl<'tcx> CFG<'tcx> { self.block_data_mut(block).statements.push(statement); } - pub fn push_end_region(&mut self, - block: BasicBlock, - source_info: SourceInfo, - region_scope: region::Scope) { - self.push(block, Statement { - source_info, - kind: StatementKind::EndRegion(region_scope), - }); + pub fn push_end_region<'a, 'gcx:'a+'tcx>(&mut self, + tcx: ty::TyCtxt<'a, 'gcx, 'tcx>, + block: BasicBlock, + source_info: SourceInfo, + region_scope: region::Scope) { + if tcx.sess.emit_end_regions() { + self.push(block, Statement { + source_info, + kind: StatementKind::EndRegion(region_scope), + }); + } } pub fn push_assign(&mut self, diff --git a/src/librustc_mir/build/scope.rs b/src/librustc_mir/build/scope.rs index ed598c876f3..c08620c1e41 100644 --- a/src/librustc_mir/build/scope.rs +++ b/src/librustc_mir/build/scope.rs @@ -89,7 +89,7 @@ should go to. use build::{BlockAnd, BlockAndExtension, Builder, CFG}; use rustc::middle::region; -use rustc::ty::Ty; +use rustc::ty::{Ty, TyCtxt}; use rustc::mir::*; use rustc::mir::transform::MirSource; use syntax_pos::{Span}; @@ -359,7 +359,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> { self.arg_count, false)); - self.cfg.push_end_region(block, region_scope.1, scope.region_scope); + self.cfg.push_end_region(self.hir.tcx(), block, region_scope.1, scope.region_scope); block.unit() } @@ -414,7 +414,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> { false)); // End all regions for scopes out of which we are breaking. - self.cfg.push_end_region(block, region_scope.1, scope.region_scope); + self.cfg.push_end_region(self.hir.tcx(), block, region_scope.1, scope.region_scope); } } let scope = &self.scopes[len - scope_count]; @@ -463,7 +463,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> { true)); // End all regions for scopes out of which we are breaking. - self.cfg.push_end_region(block, src_info, scope.region_scope); + self.cfg.push_end_region(self.hir.tcx(), block, src_info, scope.region_scope); } self.cfg.terminate(block, src_info, TerminatorKind::GeneratorDrop); @@ -694,7 +694,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> { }; for scope in scopes.iter_mut() { - target = build_diverge_scope(cfg, scope.region_scope_span, + target = build_diverge_scope(self.hir.tcx(), cfg, scope.region_scope_span, scope, target, generator_drop); } Some(target) @@ -831,7 +831,8 @@ fn build_scope_drops<'tcx>(cfg: &mut CFG<'tcx>, block.unit() } -fn build_diverge_scope<'a, 'gcx, 'tcx>(cfg: &mut CFG<'tcx>, +fn build_diverge_scope<'a, 'gcx, 'tcx>(tcx: TyCtxt<'a, 'gcx, 'tcx>, + cfg: &mut CFG<'tcx>, span: Span, scope: &mut Scope<'tcx>, mut target: BasicBlock, @@ -893,7 +894,7 @@ fn build_diverge_scope<'a, 'gcx, 'tcx>(cfg: &mut CFG<'tcx>, // becomes trivial goto after pass that removes all EndRegions.) { let block = cfg.start_new_cleanup_block(); - cfg.push_end_region(block, source_info(span), scope.region_scope); + cfg.push_end_region(tcx, block, source_info(span), scope.region_scope); cfg.terminate(block, source_info(span), TerminatorKind::Goto { target: target }); target = block } diff --git a/src/librustc_mir/transform/clean_end_regions.rs b/src/librustc_mir/transform/clean_end_regions.rs index 55a16b2f391..a6750f400ba 100644 --- a/src/librustc_mir/transform/clean_end_regions.rs +++ b/src/librustc_mir/transform/clean_end_regions.rs @@ -39,9 +39,11 @@ struct DeleteTrivialEndRegions<'a> { impl MirPass for CleanEndRegions { fn run_pass<'a, 'tcx>(&self, - _tcx: TyCtxt<'a, 'tcx, 'tcx>, + tcx: TyCtxt<'a, 'tcx, 'tcx>, _source: MirSource, mir: &mut Mir<'tcx>) { + if !tcx.sess.emit_end_regions() { return; } + let mut gather = GatherBorrowedRegions { seen_regions: FxHashSet() }; diff --git a/src/test/mir-opt/end_region_1.rs b/src/test/mir-opt/end_region_1.rs index 54409d3543e..9c8cfc0ab20 100644 --- a/src/test/mir-opt/end_region_1.rs +++ b/src/test/mir-opt/end_region_1.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// compile-flags: -Z identify_regions +// compile-flags: -Z identify_regions -Z emit-end-regions // ignore-tidy-linelength // This is just about the simplest program that exhibits an EndRegion. diff --git a/src/test/mir-opt/end_region_2.rs b/src/test/mir-opt/end_region_2.rs index b37bd4188d9..6a4e209a14b 100644 --- a/src/test/mir-opt/end_region_2.rs +++ b/src/test/mir-opt/end_region_2.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// compile-flags: -Z identify_regions +// compile-flags: -Z identify_regions -Z emit-end-regions // ignore-tidy-linelength // We will EndRegion for borrows in a loop that occur before break but diff --git a/src/test/mir-opt/end_region_3.rs b/src/test/mir-opt/end_region_3.rs index be9fc579ab6..cb1d45e37c8 100644 --- a/src/test/mir-opt/end_region_3.rs +++ b/src/test/mir-opt/end_region_3.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// compile-flags: -Z identify_regions +// compile-flags: -Z identify_regions -Z emit-end-regions // ignore-tidy-linelength // Binding the borrow's subject outside the loop does not increase the diff --git a/src/test/mir-opt/end_region_4.rs b/src/test/mir-opt/end_region_4.rs index 58ce1ed5b84..b714b6bc55b 100644 --- a/src/test/mir-opt/end_region_4.rs +++ b/src/test/mir-opt/end_region_4.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// compile-flags: -Z identify_regions +// compile-flags: -Z identify_regions -Z emit-end-regions // ignore-tidy-linelength // Unwinding should EndRegion for in-scope borrows: Direct borrows. diff --git a/src/test/mir-opt/end_region_5.rs b/src/test/mir-opt/end_region_5.rs index be62a5473a6..a4c53675b9c 100644 --- a/src/test/mir-opt/end_region_5.rs +++ b/src/test/mir-opt/end_region_5.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// compile-flags: -Z identify_regions -Z span_free_formats +// compile-flags: -Z identify_regions -Z span_free_formats -Z emit-end-regions // ignore-tidy-linelength // Unwinding should EndRegion for in-scope borrows: Borrowing via by-ref closure. diff --git a/src/test/mir-opt/end_region_6.rs b/src/test/mir-opt/end_region_6.rs index 23b92583a11..daa94769430 100644 --- a/src/test/mir-opt/end_region_6.rs +++ b/src/test/mir-opt/end_region_6.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// compile-flags: -Z identify_regions -Z span_free_formats +// compile-flags: -Z identify_regions -Z span_free_formats -Z emit-end-regions // ignore-tidy-linelength // Unwinding should EndRegion for in-scope borrows: 2nd borrow within by-ref closure. diff --git a/src/test/mir-opt/end_region_7.rs b/src/test/mir-opt/end_region_7.rs index ee0615f2bb3..9feacd04fe0 100644 --- a/src/test/mir-opt/end_region_7.rs +++ b/src/test/mir-opt/end_region_7.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// compile-flags: -Z identify_regions -Z span_free_formats +// compile-flags: -Z identify_regions -Z span_free_formats -Z emit-end-regions // ignore-tidy-linelength // Unwinding should EndRegion for in-scope borrows: Borrow of moved data. diff --git a/src/test/mir-opt/end_region_8.rs b/src/test/mir-opt/end_region_8.rs index ef184e39c00..30dda7a4062 100644 --- a/src/test/mir-opt/end_region_8.rs +++ b/src/test/mir-opt/end_region_8.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// compile-flags: -Z identify_regions -Z span_free_formats +// compile-flags: -Z identify_regions -Z span_free_formats -Z emit-end-regions // ignore-tidy-linelength // Unwinding should EndRegion for in-scope borrows: Move of borrow into closure. diff --git a/src/test/mir-opt/end_region_9.rs b/src/test/mir-opt/end_region_9.rs index 719bc3ff9dd..bbfdc0e77a8 100644 --- a/src/test/mir-opt/end_region_9.rs +++ b/src/test/mir-opt/end_region_9.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// compile-flags: -Z identify_regions -Z span_free_formats +// compile-flags: -Z identify_regions -Z span_free_formats -Z emit-end-regions // ignore-tidy-linelength // This test models a scenario that arielb1 found during review. diff --git a/src/test/mir-opt/issue-43457.rs b/src/test/mir-opt/issue-43457.rs index 2a36672a457..3f0f5068577 100644 --- a/src/test/mir-opt/issue-43457.rs +++ b/src/test/mir-opt/issue-43457.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// compile-flags: -Z identify_regions -Z span_free_formats +// compile-flags: -Z identify_regions -Z span_free_formats -Z emit-end-regions // ignore-tidy-linelength // Regression test for #43457: an `EndRegion` was missing from output |
