@@ -7,6 +7,8 @@ use rustc_middle::ty::RegionVid;
77
88use crate :: RegionInferenceContext ;
99use crate :: constraints:: ConstraintSccIndex ;
10+ use crate :: region_infer:: ConstraintSccs ;
11+ use crate :: universal_regions:: UniversalRegions ;
1012
1113pub ( crate ) struct ReverseSccGraph {
1214 graph : VecGraph < ConstraintSccIndex > ,
@@ -19,6 +21,29 @@ pub(crate) struct ReverseSccGraph {
1921}
2022
2123impl 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+
2247 /// Find all universal regions that are required to outlive the given SCC.
2348 pub ( super ) fn upper_bounds ( & self , scc0 : ConstraintSccIndex ) -> impl Iterator < Item = RegionVid > {
2449 let mut duplicates = FxIndexSet :: default ( ) ;
@@ -40,23 +65,7 @@ impl RegionInferenceContext<'_> {
4065 return ;
4166 }
4267
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 ( ) ) ) ;
6170 }
6271}
0 commit comments