about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDylan DPC <dylan.dpc@gmail.com>2020-02-05 13:14:25 +0100
committerGitHub <noreply@github.com>2020-02-05 13:14:25 +0100
commitc1779412fa97a1d5ecded57dd43c5f802e21de89 (patch)
treebd5205706fdbacc429fb6e9932cd8b6f4736a1de
parentd694f2252122450e47ceaafe416784402210d927 (diff)
parentd62b6f204733d255a3e943388ba99f14b053bf4a (diff)
downloadrust-c1779412fa97a1d5ecded57dd43c5f802e21de89.tar.gz
rust-c1779412fa97a1d5ecded57dd43c5f802e21de89.zip
Rollup merge of #68790 - nnethercote:improve-merge_from_succ, r=nikomatsakis
Improve `merge_from_succ`

A couple of small performance wins.

r? @nikomatsakis
-rw-r--r--src/librustc_passes/liveness.rs14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/librustc_passes/liveness.rs b/src/librustc_passes/liveness.rs
index 7718139f6e9..b355a47c394 100644
--- a/src/librustc_passes/liveness.rs
+++ b/src/librustc_passes/liveness.rs
@@ -822,8 +822,15 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
             return false;
         }
 
-        let mut changed = false;
+        let mut any_changed = false;
         self.indices2(ln, succ_ln, |this, idx, succ_idx| {
+            // This is a special case, pulled out from the code below, where we
+            // don't have to do anything. It occurs about 60-70% of the time.
+            if this.rwu_table.packed_rwus[succ_idx] == INV_INV_FALSE {
+                return;
+            }
+
+            let mut changed = false;
             let mut rwu = this.rwu_table.get(idx);
             let succ_rwu = this.rwu_table.get(succ_idx);
             if succ_rwu.reader.is_valid() && !rwu.reader.is_valid() {
@@ -843,6 +850,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
 
             if changed {
                 this.rwu_table.assign_unpacked(idx, rwu);
+                any_changed = true;
             }
         });
 
@@ -851,9 +859,9 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
             ln,
             self.ln_str(succ_ln),
             first_merge,
-            changed
+            any_changed
         );
-        return changed;
+        return any_changed;
     }
 
     // Indicates that a local variable was *defined*; we know that no