@@ -6,6 +6,7 @@ use smallvec::SmallVec;
6
6
use rustc_data_structures:: sync:: { Lrc , Lock } ;
7
7
use std:: env;
8
8
use std:: hash:: Hash ;
9
+ use std:: collections:: hash_map:: Entry ;
9
10
use ty:: { self , TyCtxt } ;
10
11
use util:: common:: { ProfileQueriesMsg , profq_msg} ;
11
12
@@ -655,17 +656,13 @@ impl DepGraph {
655
656
let ( dep_node_index, did_allocation) = {
656
657
let mut current = data. current . borrow_mut ( ) ;
657
658
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)
669
666
} ;
670
667
671
668
// ... emitting any stored diagnostic ...
@@ -958,11 +955,7 @@ impl CurrentDepGraph {
958
955
hash : fingerprint,
959
956
} ;
960
957
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
966
959
} else {
967
960
bug ! ( "pop_anon_task() - Expected anonymous task to be popped" )
968
961
}
@@ -1023,21 +1016,37 @@ impl CurrentDepGraph {
1023
1016
} )
1024
1017
}
1025
1018
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 {
1032
1025
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
+ }
1041
1050
}
1042
1051
}
1043
1052
0 commit comments