@@ -7,6 +7,8 @@ use rustc_middle::ty::RegionVid;
7
7
8
8
use crate :: RegionInferenceContext ;
9
9
use crate :: constraints:: ConstraintSccIndex ;
10
+ use crate :: region_infer:: ConstraintSccs ;
11
+ use crate :: universal_regions:: UniversalRegions ;
10
12
11
13
pub ( crate ) struct ReverseSccGraph {
12
14
graph : VecGraph < ConstraintSccIndex > ,
@@ -19,6 +21,29 @@ pub(crate) struct ReverseSccGraph {
19
21
}
20
22
21
23
impl ReverseSccGraph {
24
+ pub ( super ) fn compute (
25
+ constraint_sccs : & ConstraintSccs ,
26
+ universal_regions : & UniversalRegions < ' _ > ,
27
+ ) -> Self {
28
+ let graph = constraint_sccs. reverse ( ) ;
29
+ let mut paired_scc_regions = universal_regions
30
+ . universal_regions_iter ( )
31
+ . map ( |region| ( constraint_sccs. scc ( region) , region) )
32
+ . collect :: < Vec < _ > > ( ) ;
33
+ paired_scc_regions. sort ( ) ;
34
+ let universal_regions = paired_scc_regions. iter ( ) . map ( |& ( _, region) | region) . collect ( ) ;
35
+
36
+ let mut scc_regions = FxIndexMap :: default ( ) ;
37
+ let mut start = 0 ;
38
+ for chunk in paired_scc_regions. chunk_by ( |& ( scc1, _) , & ( scc2, _) | scc1 == scc2) {
39
+ let ( scc, _) = chunk[ 0 ] ;
40
+
41
+ scc_regions. insert ( scc, start..start + chunk. len ( ) ) ;
42
+ start += chunk. len ( ) ;
43
+ }
44
+ ReverseSccGraph { graph, scc_regions, universal_regions }
45
+ }
46
+
22
47
/// Find all universal regions that are required to outlive the given SCC.
23
48
pub ( super ) fn upper_bounds ( & self , scc0 : ConstraintSccIndex ) -> impl Iterator < Item = RegionVid > {
24
49
let mut duplicates = FxIndexSet :: default ( ) ;
@@ -40,23 +65,7 @@ impl RegionInferenceContext<'_> {
40
65
return ;
41
66
}
42
67
43
- let graph = self . constraint_sccs . reverse ( ) ;
44
- let mut paired_scc_regions = self
45
- . universal_regions ( )
46
- . universal_regions_iter ( )
47
- . map ( |region| ( self . constraint_sccs . scc ( region) , region) )
48
- . collect :: < Vec < _ > > ( ) ;
49
- paired_scc_regions. sort ( ) ;
50
- let universal_regions = paired_scc_regions. iter ( ) . map ( |& ( _, region) | region) . collect ( ) ;
51
-
52
- let mut scc_regions = FxIndexMap :: default ( ) ;
53
- let mut start = 0 ;
54
- for chunk in paired_scc_regions. chunk_by ( |& ( scc1, _) , & ( scc2, _) | scc1 == scc2) {
55
- let ( scc, _) = chunk[ 0 ] ;
56
- scc_regions. insert ( scc, start..start + chunk. len ( ) ) ;
57
- start += chunk. len ( ) ;
58
- }
59
-
60
- self . rev_scc_graph = Some ( ReverseSccGraph { graph, scc_regions, universal_regions } ) ;
68
+ self . rev_scc_graph =
69
+ Some ( ReverseSccGraph :: compute ( & self . constraint_sccs , self . universal_regions ( ) ) ) ;
61
70
}
62
71
}
0 commit comments