Rollup merge of #50565 - nnethercote:try_mark_green, r=michaelwoerister
Use SmallVec for DepNodeIndex within dep_graph. This avoids a decent number of allocations, enough to speed up incremental runs of many rustc-benchmarks, the best by 2%. Here are the rustc-perf benchmarks that showed an improvement of at least 1% on one run: ``` unused-warnings-check avg: -1.7% min: -2.4% max: 0.0% unused-warnings-opt avg: -1.4% min: -2.0% max: 0.0% unused-warnings avg: -1.4% min: -2.0% max: -0.0% tokio-webpush-simple-check avg: -1.0% min: -1.7% max: 0.0% futures-opt avg: -0.9% min: -1.6% max: 0.0% encoding avg: -1.2% min: -1.6% max: -0.6% encoding-check avg: -0.9% min: -1.6% max: 0.0% encoding-opt avg: -0.8% min: -1.6% max: -0.1% futures avg: -0.9% min: -1.5% max: 0.0% futures-check avg: -0.9% min: -1.5% max: 0.1% regression-31157-check avg: -0.9% min: -1.5% max: 0.0% regex avg: -0.6% min: -1.4% max: 0.0% regression-31157-opt avg: -0.5% min: -1.4% max: 0.1% regression-31157 avg: -0.7% min: -1.4% max: 0.2% regex-opt avg: -0.6% min: -1.4% max: 0.1% hyper-check avg: -0.8% min: -1.4% max: -0.1% regex-check avg: -1.0% min: -1.4% max: 0.0% hyper-opt avg: -0.7% min: -1.4% max: -0.1% hyper avg: -0.7% min: -1.3% max: 0.1% piston-image-opt avg: -0.4% min: -1.3% max: 0.0% tokio-webpush-simple-opt avg: -0.3% min: -1.3% max: 0.0% piston-image-check avg: -0.5% min: -1.3% max: -0.0% syn-opt avg: -0.5% min: -1.3% max: 0.0% clap-rs-check avg: -0.3% min: -1.3% max: 0.2% piston-image avg: -0.5% min: -1.2% max: 0.1% syn avg: -0.5% min: -1.2% max: 0.1% syn-check avg: -0.6% min: -1.2% max: -0.1% issue-46449-opt avg: -0.4% min: -1.2% max: -0.1% parser-check avg: -0.7% min: -1.2% max: 0.1% issue-46449 avg: -0.5% min: -1.2% max: -0.0% ```
This commit is contained in:
commit
e23ec4b6f0
1 changed files with 11 additions and 10 deletions
|
@ -12,6 +12,7 @@ use errors::DiagnosticBuilder;
|
||||||
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
|
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
|
||||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||||
use rustc_data_structures::indexed_vec::{Idx, IndexVec};
|
use rustc_data_structures::indexed_vec::{Idx, IndexVec};
|
||||||
|
use rustc_data_structures::small_vec::SmallVec;
|
||||||
use rustc_data_structures::sync::{Lrc, RwLock, ReadGuard, Lock};
|
use rustc_data_structures::sync::{Lrc, RwLock, ReadGuard, Lock};
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::hash::Hash;
|
use std::hash::Hash;
|
||||||
|
@ -132,7 +133,7 @@ impl DepGraph {
|
||||||
let mut edges = Vec::new();
|
let mut edges = Vec::new();
|
||||||
for (index, edge_targets) in current_dep_graph.edges.iter_enumerated() {
|
for (index, edge_targets) in current_dep_graph.edges.iter_enumerated() {
|
||||||
let from = current_dep_graph.nodes[index];
|
let from = current_dep_graph.nodes[index];
|
||||||
for &edge_target in edge_targets {
|
for &edge_target in edge_targets.iter() {
|
||||||
let to = current_dep_graph.nodes[edge_target];
|
let to = current_dep_graph.nodes[edge_target];
|
||||||
edges.push((from, to));
|
edges.push((from, to));
|
||||||
}
|
}
|
||||||
|
@ -210,7 +211,7 @@ impl DepGraph {
|
||||||
self.with_task_impl(key, cx, arg, false, task,
|
self.with_task_impl(key, cx, arg, false, task,
|
||||||
|key| OpenTask::Regular(Lock::new(RegularOpenTask {
|
|key| OpenTask::Regular(Lock::new(RegularOpenTask {
|
||||||
node: key,
|
node: key,
|
||||||
reads: Vec::new(),
|
reads: SmallVec::new(),
|
||||||
read_set: FxHashSet(),
|
read_set: FxHashSet(),
|
||||||
})),
|
})),
|
||||||
|data, key, task| data.borrow_mut().complete_task(key, task))
|
|data, key, task| data.borrow_mut().complete_task(key, task))
|
||||||
|
@ -231,7 +232,7 @@ impl DepGraph {
|
||||||
|
|
||||||
self.with_task_impl(key, cx, input, true, identity_fn,
|
self.with_task_impl(key, cx, input, true, identity_fn,
|
||||||
|_| OpenTask::Ignore,
|
|_| OpenTask::Ignore,
|
||||||
|data, key, _| data.borrow_mut().alloc_node(key, Vec::new()))
|
|data, key, _| data.borrow_mut().alloc_node(key, SmallVec::new()))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn with_task_impl<'gcx, C, A, R>(
|
fn with_task_impl<'gcx, C, A, R>(
|
||||||
|
@ -354,7 +355,7 @@ impl DepGraph {
|
||||||
if let Some(ref data) = self.data {
|
if let Some(ref data) = self.data {
|
||||||
let (result, open_task) = ty::tls::with_context(|icx| {
|
let (result, open_task) = ty::tls::with_context(|icx| {
|
||||||
let task = OpenTask::Anon(Lock::new(AnonOpenTask {
|
let task = OpenTask::Anon(Lock::new(AnonOpenTask {
|
||||||
reads: Vec::new(),
|
reads: SmallVec::new(),
|
||||||
read_set: FxHashSet(),
|
read_set: FxHashSet(),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
@ -614,7 +615,7 @@ impl DepGraph {
|
||||||
|
|
||||||
debug_assert!(data.colors.borrow().get(prev_dep_node_index).is_none());
|
debug_assert!(data.colors.borrow().get(prev_dep_node_index).is_none());
|
||||||
|
|
||||||
let mut current_deps = Vec::new();
|
let mut current_deps = SmallVec::new();
|
||||||
|
|
||||||
for &dep_dep_node_index in prev_deps {
|
for &dep_dep_node_index in prev_deps {
|
||||||
let dep_dep_node_color = data.colors.borrow().get(dep_dep_node_index);
|
let dep_dep_node_color = data.colors.borrow().get(dep_dep_node_index);
|
||||||
|
@ -911,7 +912,7 @@ pub enum WorkProductFileKind {
|
||||||
|
|
||||||
pub(super) struct CurrentDepGraph {
|
pub(super) struct CurrentDepGraph {
|
||||||
nodes: IndexVec<DepNodeIndex, DepNode>,
|
nodes: IndexVec<DepNodeIndex, DepNode>,
|
||||||
edges: IndexVec<DepNodeIndex, Vec<DepNodeIndex>>,
|
edges: IndexVec<DepNodeIndex, SmallVec<[DepNodeIndex; 8]>>,
|
||||||
node_to_node_index: FxHashMap<DepNode, DepNodeIndex>,
|
node_to_node_index: FxHashMap<DepNode, DepNodeIndex>,
|
||||||
forbidden_edge: Option<EdgeFilter>,
|
forbidden_edge: Option<EdgeFilter>,
|
||||||
|
|
||||||
|
@ -1049,7 +1050,7 @@ impl CurrentDepGraph {
|
||||||
} = task {
|
} = task {
|
||||||
debug_assert_eq!(node, key);
|
debug_assert_eq!(node, key);
|
||||||
let krate_idx = self.node_to_node_index[&DepNode::new_no_params(DepKind::Krate)];
|
let krate_idx = self.node_to_node_index[&DepNode::new_no_params(DepKind::Krate)];
|
||||||
self.alloc_node(node, vec![krate_idx])
|
self.alloc_node(node, SmallVec::one(krate_idx))
|
||||||
} else {
|
} else {
|
||||||
bug!("complete_eval_always_task() - Expected eval always task to be popped");
|
bug!("complete_eval_always_task() - Expected eval always task to be popped");
|
||||||
}
|
}
|
||||||
|
@ -1095,7 +1096,7 @@ impl CurrentDepGraph {
|
||||||
|
|
||||||
fn alloc_node(&mut self,
|
fn alloc_node(&mut self,
|
||||||
dep_node: DepNode,
|
dep_node: DepNode,
|
||||||
edges: Vec<DepNodeIndex>)
|
edges: SmallVec<[DepNodeIndex; 8]>)
|
||||||
-> DepNodeIndex {
|
-> DepNodeIndex {
|
||||||
debug_assert_eq!(self.edges.len(), self.nodes.len());
|
debug_assert_eq!(self.edges.len(), self.nodes.len());
|
||||||
debug_assert_eq!(self.node_to_node_index.len(), self.nodes.len());
|
debug_assert_eq!(self.node_to_node_index.len(), self.nodes.len());
|
||||||
|
@ -1110,12 +1111,12 @@ impl CurrentDepGraph {
|
||||||
|
|
||||||
pub struct RegularOpenTask {
|
pub struct RegularOpenTask {
|
||||||
node: DepNode,
|
node: DepNode,
|
||||||
reads: Vec<DepNodeIndex>,
|
reads: SmallVec<[DepNodeIndex; 8]>,
|
||||||
read_set: FxHashSet<DepNodeIndex>,
|
read_set: FxHashSet<DepNodeIndex>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct AnonOpenTask {
|
pub struct AnonOpenTask {
|
||||||
reads: Vec<DepNodeIndex>,
|
reads: SmallVec<[DepNodeIndex; 8]>,
|
||||||
read_set: FxHashSet<DepNodeIndex>,
|
read_set: FxHashSet<DepNodeIndex>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue