Avoid unnecessary reallocations in domtree::with_function() (#1011)
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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())
|
||||||
|
|||||||
Reference in New Issue
Block a user