Skip to content

Commit

Permalink
Auto merge of #61754 - nikomatsakis:trait-caching-perf-3, r=pnkfelix
Browse files Browse the repository at this point in the history
create a "provisional cache" to restore performance in the case of cycles

Introduce a "provisional cache" that caches the results of auto trait resolutions but keeps them from entering the *main* cache until everything is ready. This turned out a bit more complex than I hoped, but I don't see another short term fix -- happy to take suggestions! In the meantime, it's very clear we need to rework the trait solver. This resolves the extreme performance slowdown experienced in #60846 -- I plan to add a perf.rust-lang.org regression test to track this.

Caveat: I've not run `x.py test` in full yet.

r? @pnkfelix
cc @arielb1

Fixes #60846
  • Loading branch information
bors committed Jun 16, 2019
2 parents 37b6a5e + 0baa925 commit e3175c3
Show file tree
Hide file tree
Showing 4 changed files with 409 additions and 85 deletions.
2 changes: 1 addition & 1 deletion src/librustc/traits/query/evaluate_obligation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> {
Err(OverflowError) => {
let mut selcx =
SelectionContext::with_query_mode(&self, TraitQueryMode::Standard);
selcx.evaluate_obligation_recursively(obligation)
selcx.evaluate_root_obligation(obligation)
.unwrap_or_else(|r| {
span_bug!(
obligation.cause.span,
Expand Down
Loading

0 comments on commit e3175c3

Please sign in to comment.