]> git.lizzy.rs Git - rust.git/commitdiff
Work around rust-lang/rust#49998 with experimental code that does less updating of...
authorFelix S. Klock II <pnkfelix@pnkfx.org>
Wed, 18 Apr 2018 12:22:08 +0000 (14:22 +0200)
committerFelix S. Klock II <pnkfelix@pnkfx.org>
Wed, 18 Apr 2018 13:37:30 +0000 (15:37 +0200)
This seems to avoid poor scaling on src/test/ui/span/dropck_vec_cycle_checked.rs

src/librustc/session/config.rs
src/librustc_mir/borrow_check/nll/region_infer/values.rs

index 59823390a0a5861f6ad3472e1c4f1e007846f98d..2e6689efee572358b3279373b6759a1fd89b9261 100644 (file)
@@ -1259,6 +1259,8 @@ fn parse_edition(slot: &mut Edition, v: Option<&str>) -> bool {
         useful for profiling / PGO."),
     relro_level: Option<RelroLevel> = (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],
index 2f0b4c24bd6f14ca8aef242511a95c13e3ba53b9..d15d85792d99dc93964a96ffcbaed29eb05009e0 100644 (file)
@@ -14,7 +14,7 @@
 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 @@ fn add_internal<F>(&mut self, r: RegionVid, i: RegionElementIndex, make_cause: F
             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;
                 }