Avoid unnecessary reallocations in domtree::with_function() (#1011)

This commit is contained in:
Sean Stangl
2019-09-10 08:18:06 -06:00
committed by GitHub
parent 63367d205c
commit 4b085b9cf7
3 changed files with 31 additions and 1 deletions

View File

@@ -226,7 +226,13 @@ impl DominatorTree {
/// Allocate and compute a dominator tree. /// Allocate and compute a dominator tree.
pub fn with_function(func: &Function, cfg: &ControlFlowGraph) -> Self { pub fn with_function(func: &Function, cfg: &ControlFlowGraph) -> Self {
let mut domtree = Self::new(); let ebb_capacity = func.layout.ebb_capacity();
let mut domtree = Self {
nodes: SecondaryMap::with_capacity(ebb_capacity),
postorder: Vec::with_capacity(ebb_capacity),
stack: Vec::new(),
valid: false,
};
domtree.compute(func, cfg); domtree.compute(func, cfg);
domtree domtree
} }

View File

@@ -60,6 +60,11 @@ impl Layout {
self.first_ebb = None; self.first_ebb = None;
self.last_ebb = None; self.last_ebb = None;
} }
/// Returns the capacity of the `EbbData` map.
pub fn ebb_capacity(&self) -> usize {
self.ebbs.capacity()
}
} }
/// Sequence numbers. /// Sequence numbers.

View File

@@ -52,6 +52,20 @@ where
} }
} }
/// Create a new, empty map with the specified capacity.
///
/// The map will be able to hold exactly `capacity` elements without reallocating.
pub fn with_capacity(capacity: usize) -> Self
where
V: Default,
{
Self {
elems: Vec::with_capacity(capacity),
default: Default::default(),
unused: PhantomData,
}
}
/// Create a new empty map with a specified default value. /// Create a new empty map with a specified default value.
/// ///
/// This constructor does not require V to implement Default. /// This constructor does not require V to implement Default.
@@ -63,6 +77,11 @@ where
} }
} }
/// Returns the number of elements the map can hold without reallocating.
pub fn capacity(&self) -> usize {
self.elems.capacity()
}
/// Get the element at `k` if it exists. /// Get the element at `k` if it exists.
pub fn get(&self, k: K) -> Option<&V> { pub fn get(&self, k: K) -> Option<&V> {
self.elems.get(k.index()) self.elems.get(k.index())