Skip to content

Commit a97b949

Browse files
committed
Use entry API to avoid double lookup when interning dep nodes
1 parent ac33d10 commit a97b949

File tree

1 file changed

+39
-30
lines changed

1 file changed

+39
-30
lines changed

src/librustc/dep_graph/graph.rs

Lines changed: 39 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use smallvec::SmallVec;
1616
use rustc_data_structures::sync::{Lrc, Lock};
1717
use std::env;
1818
use std::hash::Hash;
19+
use std::collections::hash_map::Entry;
1920
use ty::{self, TyCtxt};
2021
use util::common::{ProfileQueriesMsg, profq_msg};
2122

@@ -665,17 +666,13 @@ impl DepGraph {
665666
let (dep_node_index, did_allocation) = {
666667
let mut current = data.current.borrow_mut();
667668

668-
if let Some(&dep_node_index) = current.node_to_node_index.get(&dep_node) {
669-
// Someone else allocated it before us
670-
(dep_node_index, false)
671-
} else {
672-
// Copy the fingerprint from the previous graph,
673-
// so we don't have to recompute it
674-
let fingerprint = data.previous.fingerprint_by_index(prev_dep_node_index);
675-
// We allocating an entry for the node in the current dependency graph and
676-
// adding all the appropriate edges imported from the previous graph
677-
(current.alloc_node(*dep_node, current_deps, fingerprint), true)
678-
}
669+
// Copy the fingerprint from the previous graph,
670+
// so we don't have to recompute it
671+
let fingerprint = data.previous.fingerprint_by_index(prev_dep_node_index);
672+
673+
// We allocating an entry for the node in the current dependency graph and
674+
// adding all the appropriate edges imported from the previous graph
675+
current.intern_node(*dep_node, current_deps, fingerprint)
679676
};
680677

681678
// ... emitting any stored diagnostic ...
@@ -968,11 +965,7 @@ impl CurrentDepGraph {
968965
hash: fingerprint,
969966
};
970967

971-
if let Some(&index) = self.node_to_node_index.get(&target_dep_node) {
972-
index
973-
} else {
974-
self.alloc_node(target_dep_node, reads, Fingerprint::ZERO)
975-
}
968+
self.intern_node(target_dep_node, reads, Fingerprint::ZERO).0
976969
} else {
977970
bug!("pop_anon_task() - Expected anonymous task to be popped")
978971
}
@@ -1033,21 +1026,37 @@ impl CurrentDepGraph {
10331026
})
10341027
}
10351028

1036-
fn alloc_node(&mut self,
1037-
dep_node: DepNode,
1038-
edges: SmallVec<[DepNodeIndex; 8]>,
1039-
fingerprint: Fingerprint)
1040-
-> DepNodeIndex {
1041-
debug_assert_eq!(self.node_to_node_index.len(), self.data.len());
1029+
fn alloc_node(
1030+
&mut self,
1031+
dep_node: DepNode,
1032+
edges: SmallVec<[DepNodeIndex; 8]>,
1033+
fingerprint: Fingerprint
1034+
) -> DepNodeIndex {
10421035
debug_assert!(!self.node_to_node_index.contains_key(&dep_node));
1043-
let dep_node_index = DepNodeIndex::new(self.data.len());
1044-
self.data.push(DepNodeData {
1045-
node: dep_node,
1046-
edges,
1047-
fingerprint
1048-
});
1049-
self.node_to_node_index.insert(dep_node, dep_node_index);
1050-
dep_node_index
1036+
self.intern_node(dep_node, edges, fingerprint).0
1037+
}
1038+
1039+
fn intern_node(
1040+
&mut self,
1041+
dep_node: DepNode,
1042+
edges: SmallVec<[DepNodeIndex; 8]>,
1043+
fingerprint: Fingerprint
1044+
) -> (DepNodeIndex, bool) {
1045+
debug_assert_eq!(self.node_to_node_index.len(), self.data.len());
1046+
1047+
match self.node_to_node_index.entry(dep_node) {
1048+
Entry::Occupied(entry) => (*entry.get(), false),
1049+
Entry::Vacant(entry) => {
1050+
let dep_node_index = DepNodeIndex::new(self.data.len());
1051+
self.data.push(DepNodeData {
1052+
node: dep_node,
1053+
edges,
1054+
fingerprint
1055+
});
1056+
entry.insert(dep_node_index);
1057+
(dep_node_index, true)
1058+
}
1059+
}
10511060
}
10521061
}
10531062

0 commit comments

Comments
 (0)