11use rustc_data_structures:: fx:: { FxIndexMap , FxIndexSet } ;
22use rustc_data_structures:: graph:: WithSuccessors ;
3- use rustc_index:: bit_set:: { HybridBitSet , SparseBitMatrix } ;
3+ use rustc_index:: bit_set:: HybridBitSet ;
44use rustc_index:: interval:: IntervalSet ;
55use rustc_infer:: infer:: canonical:: QueryRegionConstraints ;
66use rustc_infer:: infer:: outlives:: for_liveness;
77use rustc_middle:: mir:: { BasicBlock , Body , ConstraintCategory , Local , Location } ;
88use rustc_middle:: traits:: query:: DropckOutlivesResult ;
9- use rustc_middle:: ty:: { RegionVid , Ty , TyCtxt , TypeVisitable , TypeVisitableExt } ;
9+ use rustc_middle:: ty:: { Ty , TyCtxt , TypeVisitable , TypeVisitableExt } ;
1010use rustc_span:: DUMMY_SP ;
1111use rustc_trait_selection:: traits:: query:: type_op:: outlives:: DropckOutlives ;
1212use rustc_trait_selection:: traits:: query:: type_op:: { TypeOp , TypeOpOutput } ;
@@ -16,9 +16,8 @@ use rustc_mir_dataflow::impls::MaybeInitializedPlaces;
1616use rustc_mir_dataflow:: move_paths:: { HasMoveData , MoveData , MovePathIndex } ;
1717use rustc_mir_dataflow:: ResultsCursor ;
1818
19- use crate :: dataflow:: BorrowIndex ;
2019use crate :: {
21- region_infer:: values:: { self , PointIndex , RegionValueElements } ,
20+ region_infer:: values:: { self , LiveLoans , PointIndex , RegionValueElements } ,
2221 type_check:: liveness:: local_use_map:: LocalUseMap ,
2322 type_check:: liveness:: polonius,
2423 type_check:: NormalizeLocation ,
@@ -52,15 +51,12 @@ pub(super) fn trace<'mir, 'tcx>(
5251 let local_use_map = & LocalUseMap :: build ( & relevant_live_locals, elements, body) ;
5352
5453 // When using `-Zpolonius=next`, compute the set of loans that can reach a given region.
55- let num_loans = typeck. borrowck_context . borrow_set . len ( ) ;
56- let mut inflowing_loans = SparseBitMatrix :: new ( num_loans) ;
5754 if typeck. tcx ( ) . sess . opts . unstable_opts . polonius . is_next_enabled ( ) {
58- let borrowck_context = & typeck. borrowck_context ;
55+ let borrowck_context = & mut typeck. borrowck_context ;
5956 let borrow_set = & borrowck_context. borrow_set ;
57+ let mut live_loans = LiveLoans :: new ( borrow_set. len ( ) ) ;
6058 let outlives_constraints = & borrowck_context. constraints . outlives_constraints ;
61-
62- let num_region_vars = typeck. infcx . num_region_vars ( ) ;
63- let graph = outlives_constraints. graph ( num_region_vars) ;
59+ let graph = outlives_constraints. graph ( typeck. infcx . num_region_vars ( ) ) ;
6460 let region_graph =
6561 graph. region_graph ( outlives_constraints, borrowck_context. universal_regions . fr_static ) ;
6662
@@ -73,9 +69,13 @@ pub(super) fn trace<'mir, 'tcx>(
7369 continue ;
7470 }
7571
76- inflowing_loans. insert ( succ, loan) ;
72+ live_loans . inflowing_loans . insert ( succ, loan) ;
7773 }
7874 }
75+
76+ // Store the inflowing loans in the liveness constraints: they will be used to compute live
77+ // loans when liveness data is recorded there.
78+ borrowck_context. constraints . liveness_constraints . loans = Some ( live_loans) ;
7979 } ;
8080
8181 let cx = LivenessContext {
@@ -86,7 +86,6 @@ pub(super) fn trace<'mir, 'tcx>(
8686 local_use_map,
8787 move_data,
8888 drop_data : FxIndexMap :: default ( ) ,
89- inflowing_loans,
9089 } ;
9190
9291 let mut results = LivenessResults :: new ( cx) ;
@@ -124,9 +123,6 @@ struct LivenessContext<'me, 'typeck, 'flow, 'tcx> {
124123 /// Index indicating where each variable is assigned, used, or
125124 /// dropped.
126125 local_use_map : & ' me LocalUseMap ,
127-
128- /// Set of loans that flow into a given region, when using `-Zpolonius=next`.
129- inflowing_loans : SparseBitMatrix < RegionVid , BorrowIndex > ,
130126}
131127
132128struct DropData < ' tcx > {
@@ -517,14 +513,7 @@ impl<'tcx> LivenessContext<'_, '_, '_, 'tcx> {
517513 live_at : & IntervalSet < PointIndex > ,
518514 ) {
519515 debug ! ( "add_use_live_facts_for(value={:?})" , value) ;
520-
521- Self :: make_all_regions_live (
522- self . elements ,
523- self . typeck ,
524- value,
525- live_at,
526- & self . inflowing_loans ,
527- ) ;
516+ Self :: make_all_regions_live ( self . elements , self . typeck , value, live_at) ;
528517 }
529518
530519 /// Some variable with type `live_ty` is "drop live" at `location`
@@ -575,14 +564,7 @@ impl<'tcx> LivenessContext<'_, '_, '_, 'tcx> {
575564 // All things in the `outlives` array may be touched by
576565 // the destructor and must be live at this point.
577566 for & kind in & drop_data. dropck_result . kinds {
578- Self :: make_all_regions_live (
579- self . elements ,
580- self . typeck ,
581- kind,
582- live_at,
583- & self . inflowing_loans ,
584- ) ;
585-
567+ Self :: make_all_regions_live ( self . elements , self . typeck , kind, live_at) ;
586568 polonius:: add_drop_of_var_derefs_origin ( self . typeck , dropped_local, & kind) ;
587569 }
588570 }
@@ -592,20 +574,13 @@ impl<'tcx> LivenessContext<'_, '_, '_, 'tcx> {
592574 typeck : & mut TypeChecker < ' _ , ' tcx > ,
593575 value : impl TypeVisitable < TyCtxt < ' tcx > > ,
594576 live_at : & IntervalSet < PointIndex > ,
595- inflowing_loans : & SparseBitMatrix < RegionVid , BorrowIndex > ,
596577 ) {
597578 debug ! ( "make_all_regions_live(value={:?})" , value) ;
598579 debug ! (
599580 "make_all_regions_live: live_at={}" ,
600581 values:: pretty_print_points( elements, live_at. iter( ) ) ,
601582 ) ;
602583
603- // When using `-Zpolonius=next`, we want to record the loans that flow into this value's
604- // regions as being live at the given `live_at` points: this will be used to compute the
605- // location where a loan goes out of scope.
606- let num_loans = typeck. borrowck_context . borrow_set . len ( ) ;
607- let value_loans = & mut HybridBitSet :: new_empty ( num_loans) ;
608-
609584 value. visit_with ( & mut for_liveness:: FreeRegionsVisitor {
610585 tcx : typeck. tcx ( ) ,
611586 param_env : typeck. param_env ,
@@ -617,21 +592,8 @@ impl<'tcx> LivenessContext<'_, '_, '_, 'tcx> {
617592 . constraints
618593 . liveness_constraints
619594 . add_points ( live_region_vid, live_at) ;
620-
621- // There can only be inflowing loans for this region when we are using
622- // `-Zpolonius=next`.
623- if let Some ( inflowing) = inflowing_loans. row ( live_region_vid) {
624- value_loans. union ( inflowing) ;
625- }
626595 } ,
627596 } ) ;
628-
629- // Record the loans reaching the value.
630- if !value_loans. is_empty ( ) {
631- for point in live_at. iter ( ) {
632- typeck. borrowck_context . live_loans . union_row ( point, value_loans) ;
633- }
634- }
635597 }
636598
637599 fn compute_drop_data (
0 commit comments