Skip to content

Commit a9a4d40

Browse files
authored
Rollup merge of #65260 - nnethercote:optimize-LexicalResolve-expansion, r=nikomatsakis
Optimize `LexicalResolve::expansion`. A win for `unicode_normalization`. r? @nikomatsakis
2 parents d2f87e3 + 8cd25e7 commit a9a4d40

File tree

1 file changed

+16
-10
lines changed
  • src/librustc/infer/lexical_region_resolve

1 file changed

+16
-10
lines changed

src/librustc/infer/lexical_region_resolve/mod.rs

+16-10
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> {
304304
}
305305

306306
fn expansion(&self, var_values: &mut LexicalRegionResolutions<'tcx>) {
307-
self.iterate_until_fixed_point("Expansion", |constraint| {
307+
self.iterate_until_fixed_point(|constraint| {
308308
debug!("expansion: constraint={:?}", constraint);
309309
let (a_region, b_vid, b_data, retain) = match *constraint {
310310
Constraint::RegSubVar(a_region, b_vid) => {
@@ -360,13 +360,21 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> {
360360
match *b_data {
361361
VarValue::Value(cur_region) => {
362362
// Identical scopes can show up quite often, if the fixed point
363-
// iteration converges slowly, skip them
363+
// iteration converges slowly. Skip them. This is purely an
364+
// optimization.
364365
if let (ReScope(a_scope), ReScope(cur_scope)) = (a_region, cur_region) {
365366
if a_scope == cur_scope {
366367
return false;
367368
}
368369
}
369370

371+
// This is a specialized version of the `lub_concrete_regions`
372+
// check below for a common case, here purely as an
373+
// optimization.
374+
if let ReEmpty = a_region {
375+
return false;
376+
}
377+
370378
let mut lub = self.lub_concrete_regions(a_region, cur_region);
371379
if lub == cur_region {
372380
return false;
@@ -407,8 +415,6 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> {
407415

408416
/// Returns the smallest region `c` such that `a <= c` and `b <= c`.
409417
fn lub_concrete_regions(&self, a: Region<'tcx>, b: Region<'tcx>) -> Region<'tcx> {
410-
let tcx = self.tcx();
411-
412418
match (a, b) {
413419
(&ty::ReClosureBound(..), _)
414420
| (_, &ty::ReClosureBound(..))
@@ -468,15 +474,15 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> {
468474

469475
// otherwise, we don't know what the free region is,
470476
// so we must conservatively say the LUB is static:
471-
tcx.lifetimes.re_static
477+
self.tcx().lifetimes.re_static
472478
}
473479

474480
(&ReScope(a_id), &ReScope(b_id)) => {
475481
// The region corresponding to an outer block is a
476482
// subtype of the region corresponding to an inner
477483
// block.
478484
let lub = self.region_rels.region_scope_tree.nearest_common_ancestor(a_id, b_id);
479-
tcx.mk_region(ReScope(lub))
485+
self.tcx().mk_region(ReScope(lub))
480486
}
481487

482488
(&ReEarlyBound(_), &ReEarlyBound(_))
@@ -490,7 +496,7 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> {
490496
if a == b {
491497
a
492498
} else {
493-
tcx.lifetimes.re_static
499+
self.tcx().lifetimes.re_static
494500
}
495501
}
496502
}
@@ -860,7 +866,7 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> {
860866
}
861867
}
862868

863-
fn iterate_until_fixed_point<F>(&self, tag: &str, mut body: F)
869+
fn iterate_until_fixed_point<F>(&self, mut body: F)
864870
where
865871
F: FnMut(&Constraint<'tcx>) -> (bool, bool),
866872
{
@@ -870,7 +876,7 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> {
870876
while changed {
871877
changed = false;
872878
iteration += 1;
873-
debug!("---- {} Iteration {}{}", "#", tag, iteration);
879+
debug!("---- Expansion iteration {}", iteration);
874880
constraints.retain(|constraint| {
875881
let (edge_changed, retain) = body(constraint);
876882
if edge_changed {
@@ -880,7 +886,7 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> {
880886
retain
881887
});
882888
}
883-
debug!("---- {} Complete after {} iteration(s)", tag, iteration);
889+
debug!("---- Expansion complete after {} iteration(s)", iteration);
884890
}
885891

886892
fn bound_is_met(

0 commit comments

Comments
 (0)