@@ -6,6 +6,7 @@ use smallvec::SmallVec;
66use rustc_data_structures:: sync:: { Lrc , Lock } ;
77use std:: env;
88use std:: hash:: Hash ;
9+ use std:: collections:: hash_map:: Entry ;
910use ty:: { self , TyCtxt } ;
1011use 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