Skip to content

Commit d51fee0

Browse files
committed
Inline and remove iterate_until_fixed_point().
The commit also removes the debug statement, because they annoyed me. This change wins another 1% on `unicode_normalization`, at least partly because it no longer needs to increment `iteration`.
1 parent 70b136d commit d51fee0

File tree

1 file changed

+28
-39
lines changed
  • src/librustc/infer/lexical_region_resolve

1 file changed

+28
-39
lines changed

src/librustc/infer/lexical_region_resolve/mod.rs

+28-39
Original file line numberDiff line numberDiff line change
@@ -304,8 +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(|constraint| {
308-
debug!("expansion: constraint={:?}", constraint);
307+
let mut process_constraint = |constraint: &Constraint<'tcx>| {
309308
let (a_region, b_vid, b_data, retain) = match *constraint {
310309
Constraint::RegSubVar(a_region, b_vid) => {
311310
let b_data = var_values.value_mut(b_vid);
@@ -331,7 +330,33 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> {
331330

332331
let changed = self.expand_node(a_region, b_vid, b_data);
333332
(changed, retain)
334-
})
333+
};
334+
335+
// Using bitsets to track the remaining elements is faster than using a
336+
// `Vec` by itself (which requires removing elements, which requires
337+
// element shuffling, which is slow).
338+
let constraints: Vec<_> = self.data.constraints.keys().collect();
339+
let mut live_indices: BitSet<usize> = BitSet::new_filled(constraints.len());
340+
let mut killed_indices: BitSet<usize> = BitSet::new_empty(constraints.len());
341+
let mut changed = true;
342+
while changed {
343+
changed = false;
344+
for index in live_indices.iter() {
345+
let constraint = constraints[index];
346+
let (edge_changed, retain) = process_constraint(constraint);
347+
if edge_changed {
348+
changed = true;
349+
}
350+
if !retain {
351+
let changed = killed_indices.insert(index);
352+
debug_assert!(changed);
353+
}
354+
}
355+
live_indices.subtract(&killed_indices);
356+
357+
// We could clear `killed_indices` here, but we don't need to and
358+
// it's cheaper not to.
359+
}
335360
}
336361

337362
// This function is very hot in some workloads. There's a single callsite
@@ -866,42 +891,6 @@ impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> {
866891
}
867892
}
868893

869-
fn iterate_until_fixed_point<F>(&self, mut body: F)
870-
where
871-
F: FnMut(&Constraint<'tcx>) -> (bool, bool),
872-
{
873-
// Using bitsets to track the remaining elements is faster than using a
874-
// `Vec` by itself (which requires removing elements, which requires
875-
// element shuffling, which is slow).
876-
let constraints: Vec<_> = self.data.constraints.keys().collect();
877-
let mut live_indices: BitSet<usize> = BitSet::new_filled(constraints.len());
878-
let mut killed_indices: BitSet<usize> = BitSet::new_empty(constraints.len());
879-
let mut iteration = 0;
880-
let mut changed = true;
881-
while changed {
882-
changed = false;
883-
iteration += 1;
884-
debug!("---- Expansion iteration {}", iteration);
885-
for index in live_indices.iter() {
886-
let constraint = constraints[index];
887-
let (edge_changed, retain) = body(constraint);
888-
if edge_changed {
889-
debug!("updated due to constraint {:?}", constraint);
890-
changed = true;
891-
}
892-
if !retain {
893-
let changed = killed_indices.insert(index);
894-
debug_assert!(changed);
895-
}
896-
}
897-
live_indices.subtract(&killed_indices);
898-
899-
// We could clear `killed_indices` here, but we don't need to and
900-
// it's cheaper not to.
901-
}
902-
debug!("---- Expansion complete after {} iteration(s)", iteration);
903-
}
904-
905894
fn bound_is_met(
906895
&self,
907896
bound: &VerifyBound<'tcx>,

0 commit comments

Comments
 (0)