about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDylan DPC <dylan.dpc@gmail.com>2020-04-08 18:37:24 +0200
committerGitHub <noreply@github.com>2020-04-08 18:37:24 +0200
commite97a6e7bdcd6cbc7c3dabf4838a8152b9fefb9dd (patch)
tree801106669a999ef8b1601850c04840ea5fb9ba2e
parentb9bb12640e1c68a855e88f45056356857c9cfc17 (diff)
parenta90661a780134439fefdd17e42576b946d7102d5 (diff)
downloadrust-e97a6e7bdcd6cbc7c3dabf4838a8152b9fefb9dd.tar.gz
rust-e97a6e7bdcd6cbc7c3dabf4838a8152b9fefb9dd.zip
Rollup merge of #70876 - nnethercote:smallvec-predecessors, r=estebank
Use a `SmallVec` for `Cache::predecessors`.

This is a very small win.
-rw-r--r--src/librustc_middle/mir/cache.rs16
1 files changed, 11 insertions, 5 deletions
diff --git a/src/librustc_middle/mir/cache.rs b/src/librustc_middle/mir/cache.rs
index 00ecc7a7a0a..af0f7efc3e3 100644
--- a/src/librustc_middle/mir/cache.rs
+++ b/src/librustc_middle/mir/cache.rs
@@ -5,13 +5,15 @@ use rustc_data_structures::graph::{self, GraphPredecessors, GraphSuccessors};
 use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
 use rustc_index::vec::IndexVec;
 use rustc_serialize::{Decodable, Decoder, Encodable, Encoder};
+use smallvec::SmallVec;
 use std::iter;
 use std::ops::{Deref, DerefMut, Index, IndexMut};
 use std::vec::IntoIter;
 
 #[derive(Clone, Debug)]
 pub struct Cache {
-    predecessors: Option<IndexVec<BasicBlock, Vec<BasicBlock>>>,
+    // Typically 95%+ of the inner vectors have 4 or fewer elements.
+    predecessors: Option<IndexVec<BasicBlock, SmallVec<[BasicBlock; 4]>>>,
 }
 
 impl rustc_serialize::Encodable for Cache {
@@ -44,7 +46,7 @@ impl Cache {
 
     pub fn ensure_predecessors(&mut self, body: &Body<'_>) {
         if self.predecessors.is_none() {
-            let mut result = IndexVec::from_elem(vec![], body.basic_blocks());
+            let mut result = IndexVec::from_elem(smallvec![], body.basic_blocks());
             for (bb, data) in body.basic_blocks().iter_enumerated() {
                 if let Some(ref term) = data.terminator {
                     for &tgt in term.successors() {
@@ -58,7 +60,11 @@ impl Cache {
     }
 
     /// This will recompute the predecessors cache if it is not available
-    fn predecessors(&mut self, body: &Body<'_>) -> &IndexVec<BasicBlock, Vec<BasicBlock>> {
+    // njn: typedef?
+    fn predecessors(
+        &mut self,
+        body: &Body<'_>,
+    ) -> &IndexVec<BasicBlock, SmallVec<[BasicBlock; 4]>> {
         self.ensure_predecessors(body);
         self.predecessors.as_ref().unwrap()
     }
@@ -137,7 +143,7 @@ impl BodyAndCache<'tcx> {
         self.cache.ensure_predecessors(&self.body);
     }
 
-    pub fn predecessors(&mut self) -> &IndexVec<BasicBlock, Vec<BasicBlock>> {
+    pub fn predecessors(&mut self) -> &IndexVec<BasicBlock, SmallVec<[BasicBlock; 4]>> {
         self.cache.predecessors(&self.body)
     }
 
@@ -199,7 +205,7 @@ impl ReadOnlyBodyAndCache<'a, 'tcx> {
         Self { body, cache }
     }
 
-    pub fn predecessors(&self) -> &IndexVec<BasicBlock, Vec<BasicBlock>> {
+    pub fn predecessors(&self) -> &IndexVec<BasicBlock, SmallVec<[BasicBlock; 4]>> {
         self.cache.predecessors.as_ref().unwrap()
     }