From a771b0f07538ccfc58a07207be6a5e5519c58fe2 Mon Sep 17 00:00:00 2001 From: "Felix S. Klock II" Date: Wed, 18 Apr 2018 14:22:08 +0200 Subject: [PATCH] Work around rust-lang/rust#49998 with experimental code that does less updating of cause map. This seems to avoid poor scaling on src/test/ui/span/dropck_vec_cycle_checked.rs --- src/librustc/session/config.rs | 2 ++ .../borrow_check/nll/region_infer/values.rs | 14 ++++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs index 59823390a0a5..2e6689efee57 100644 --- a/src/librustc/session/config.rs +++ b/src/librustc/session/config.rs @@ -1259,6 +1259,8 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options, useful for profiling / PGO."), relro_level: Option = (None, parse_relro_level, [TRACKED], "choose which RELRO level to use"), + nll_subminimal_causes: bool = (false, parse_bool, [UNTRACKED], + "when tracking region error causes, accept subminimal results for faster execution."), disable_nll_user_type_assert: bool = (false, parse_bool, [UNTRACKED], "disable user provided type assertion in NLL"), trans_time_graph: bool = (false, parse_bool, [UNTRACKED], diff --git a/src/librustc_mir/borrow_check/nll/region_infer/values.rs b/src/librustc_mir/borrow_check/nll/region_infer/values.rs index 2f0b4c24bd6f..d15d85792d99 100644 --- a/src/librustc_mir/borrow_check/nll/region_infer/values.rs +++ b/src/librustc_mir/borrow_check/nll/region_infer/values.rs @@ -14,7 +14,7 @@ use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::indexed_vec::Idx; use rustc_data_structures::indexed_vec::IndexVec; use rustc::mir::{BasicBlock, Location, Mir}; -use rustc::ty::RegionVid; +use rustc::ty::{self, RegionVid}; use syntax::codemap::Span; use super::{Cause, CauseExt, TrackCauses}; @@ -263,7 +263,17 @@ impl RegionValues { if let Some(causes) = &mut self.causes { let cause = make_cause(causes); let old_cause = causes.get_mut(&(r, i)).unwrap(); - if cause < **old_cause { + // #49998: compare using root cause alone to avoid + // useless traffic from similar outlives chains. + + let overwrite = if ty::tls::with(|tcx| { + tcx.sess.opts.debugging_opts.nll_subminimal_causes + }) { + cause.root_cause() < old_cause.root_cause() + } else { + cause < **old_cause + }; + if overwrite { *old_cause = Rc::new(cause); return true; }