about summary refs log tree commit diff
diff options
context:
space:
mode:
authorNicholas Nethercote <nnethercote@mozilla.com>2018-05-01 10:01:02 +1000
committerNicholas Nethercote <nnethercote@mozilla.com>2018-05-01 22:12:49 +1000
commit94c5d38f0b5c85e2171dfe7b9ec36954d17f5fe0 (patch)
treeddc4d00ad6599bca77e7b36e304749b71ae1e79f
parentf76f6fbdea497c3cb536e33387f405cc74b99b76 (diff)
downloadrust-94c5d38f0b5c85e2171dfe7b9ec36954d17f5fe0.tar.gz
rust-94c5d38f0b5c85e2171dfe7b9ec36954d17f5fe0.zip
Use two vectors in nearest_common_ancestor.
When looking at any scope in scope chain A, we only need to look for
matches among scopes previously seen in scope chain B, and vice versa.
This halves the number of "seen before?" comparisons, speeding up some
runs of style-servo, clap-rs, and syn by 1--2%.
-rw-r--r--src/librustc/middle/region.rs11
1 files changed, 6 insertions, 5 deletions
diff --git a/src/librustc/middle/region.rs b/src/librustc/middle/region.rs
index 5f4efbeeaa8..bfc9ff6660d 100644
--- a/src/librustc/middle/region.rs
+++ b/src/librustc/middle/region.rs
@@ -690,21 +690,22 @@ impl<'tcx> ScopeTree {
         // the start. So this algorithm is faster.
         let mut ma = Some(scope_a);
         let mut mb = Some(scope_b);
-        let mut seen: SmallVec<[Scope; 32]> = SmallVec::new();
+        let mut seen_a: SmallVec<[Scope; 32]> = SmallVec::new();
+        let mut seen_b: SmallVec<[Scope; 32]> = SmallVec::new();
         loop {
             if let Some(a) = ma {
-                if seen.iter().position(|s| *s == a).is_some() {
+                if seen_b.iter().position(|s| *s == a).is_some() {
                     return a;
                 }
-                seen.push(a);
+                seen_a.push(a);
                 ma = self.parent_map.get(&a).map(|s| *s);
             }
 
             if let Some(b) = mb {
-                if seen.iter().position(|s| *s == b).is_some() {
+                if seen_a.iter().position(|s| *s == b).is_some() {
                     return b;
                 }
-                seen.push(b);
+                seen_b.push(b);
                 mb = self.parent_map.get(&b).map(|s| *s);
             }