Skip to content

Commit 18d6b37

Browse files
committed
Use entry API to avoid double lookup when interning dep nodes
1 parent a426d47 commit 18d6b37

File tree

1 file changed

+39
-30
lines changed

1 file changed

+39
-30
lines changed

src/librustc/dep_graph/graph.rs

+39-30
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use smallvec::SmallVec;
66
use rustc_data_structures::sync::{Lrc, Lock};
77
use std::env;
88
use std::hash::Hash;
9+
use std::collections::hash_map::Entry;
910
use ty::{self, TyCtxt};
1011
use util::common::{ProfileQueriesMsg, profq_msg};
1112

@@ -655,17 +656,13 @@ impl DepGraph {
655656
let (dep_node_index, did_allocation) = {
656657
let mut current = data.current.borrow_mut();
657658

658-
if let Some(&dep_node_index) = current.node_to_node_index.get(&dep_node) {
659-
// Someone else allocated it before us
660-
(dep_node_index, false)
661-
} else {
662-
// Copy the fingerprint from the previous graph,
663-
// so we don't have to recompute it
664-
let fingerprint = data.previous.fingerprint_by_index(prev_dep_node_index);
665-
// We allocating an entry for the node in the current dependency graph and
666-
// adding all the appropriate edges imported from the previous graph
667-
(current.alloc_node(*dep_node, current_deps, fingerprint), true)
668-
}
659+
// Copy the fingerprint from the previous graph,
660+
// so we don't have to recompute it
661+
let fingerprint = data.previous.fingerprint_by_index(prev_dep_node_index);
662+
663+
// We allocating an entry for the node in the current dependency graph and
664+
// adding all the appropriate edges imported from the previous graph
665+
current.intern_node(*dep_node, current_deps, fingerprint)
669666
};
670667

671668
// ... emitting any stored diagnostic ...
@@ -958,11 +955,7 @@ impl CurrentDepGraph {
958955
hash: fingerprint,
959956
};
960957

961-
if let Some(&index) = self.node_to_node_index.get(&target_dep_node) {
962-
index
963-
} else {
964-
self.alloc_node(target_dep_node, reads, Fingerprint::ZERO)
965-
}
958+
self.intern_node(target_dep_node, reads, Fingerprint::ZERO).0
966959
} else {
967960
bug!("pop_anon_task() - Expected anonymous task to be popped")
968961
}
@@ -1023,21 +1016,37 @@ impl CurrentDepGraph {
10231016
})
10241017
}
10251018

1026-
fn alloc_node(&mut self,
1027-
dep_node: DepNode,
1028-
edges: SmallVec<[DepNodeIndex; 8]>,
1029-
fingerprint: Fingerprint)
1030-
-> DepNodeIndex {
1031-
debug_assert_eq!(self.node_to_node_index.len(), self.data.len());
1019+
fn alloc_node(
1020+
&mut self,
1021+
dep_node: DepNode,
1022+
edges: SmallVec<[DepNodeIndex; 8]>,
1023+
fingerprint: Fingerprint
1024+
) -> DepNodeIndex {
10321025
debug_assert!(!self.node_to_node_index.contains_key(&dep_node));
1033-
let dep_node_index = DepNodeIndex::new(self.data.len());
1034-
self.data.push(DepNodeData {
1035-
node: dep_node,
1036-
edges,
1037-
fingerprint
1038-
});
1039-
self.node_to_node_index.insert(dep_node, dep_node_index);
1040-
dep_node_index
1026+
self.intern_node(dep_node, edges, fingerprint).0
1027+
}
1028+
1029+
fn intern_node(
1030+
&mut self,
1031+
dep_node: DepNode,
1032+
edges: SmallVec<[DepNodeIndex; 8]>,
1033+
fingerprint: Fingerprint
1034+
) -> (DepNodeIndex, bool) {
1035+
debug_assert_eq!(self.node_to_node_index.len(), self.data.len());
1036+
1037+
match self.node_to_node_index.entry(dep_node) {
1038+
Entry::Occupied(entry) => (*entry.get(), false),
1039+
Entry::Vacant(entry) => {
1040+
let dep_node_index = DepNodeIndex::new(self.data.len());
1041+
self.data.push(DepNodeData {
1042+
node: dep_node,
1043+
edges,
1044+
fingerprint
1045+
});
1046+
entry.insert(dep_node_index);
1047+
(dep_node_index, true)
1048+
}
1049+
}
10411050
}
10421051
}
10431052

0 commit comments

Comments
 (0)