about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRémy Rakic <remy.rakic+github@gmail.com>2023-11-23 11:28:53 +0000
committerRémy Rakic <remy.rakic+github@gmail.com>2023-11-26 12:00:32 +0000
commit459a616c4fffc39df76fda7679873624ae9073d1 (patch)
treea74e195fa4befec211a28851247702b76ed6bd03
parent3de68e074a04b08abe8cd874528583e5fbbb9df9 (diff)
downloadrust-459a616c4fffc39df76fda7679873624ae9073d1.tar.gz
rust-459a616c4fffc39df76fda7679873624ae9073d1.zip
extract polonius universal regions fact generation
-rw-r--r--compiler/rustc_borrowck/src/nll.rs39
-rw-r--r--compiler/rustc_borrowck/src/nll/polonius.rs46
2 files changed, 50 insertions, 35 deletions
diff --git a/compiler/rustc_borrowck/src/nll.rs b/compiler/rustc_borrowck/src/nll.rs
index 7a5e918ec43..705e56ea984 100644
--- a/compiler/rustc_borrowck/src/nll.rs
+++ b/compiler/rustc_borrowck/src/nll.rs
@@ -127,42 +127,13 @@ pub(crate) fn compute_regions<'cx, 'tcx>(
 
     if let Some(all_facts) = &mut all_facts {
         let _prof_timer = infcx.tcx.prof.generic_activity("polonius_fact_generation");
-        all_facts.universal_region.extend(universal_regions.universal_regions());
         polonius::emit_move_facts(all_facts, move_data, location_table, body);
-
-        // Emit universal regions facts, and their relations, for Polonius.
-        //
-        // 1: universal regions are modeled in Polonius as a pair:
-        // - the universal region vid itself.
-        // - a "placeholder loan" associated to this universal region. Since they don't exist in
-        //   the `borrow_set`, their `BorrowIndex` are synthesized as the universal region index
-        //   added to the existing number of loans, as if they succeeded them in the set.
-        //
-        let borrow_count = borrow_set.len();
-        debug!(
-            "compute_regions: polonius placeholders, num_universals={}, borrow_count={}",
-            universal_regions.len(),
-            borrow_count
+        polonius::emit_universal_region_facts(
+            all_facts,
+            borrow_set,
+            &universal_regions,
+            &universal_region_relations,
         );
-
-        for universal_region in universal_regions.universal_regions() {
-            let universal_region_idx = universal_region.index();
-            let placeholder_loan_idx = borrow_count + universal_region_idx;
-            all_facts.placeholder.push((universal_region, placeholder_loan_idx.into()));
-        }
-
-        // 2: the universal region relations `outlives` constraints are emitted as
-        //  `known_placeholder_subset` facts.
-        for (fr1, fr2) in universal_region_relations.known_outlives() {
-            if fr1 != fr2 {
-                debug!(
-                    "compute_regions: emitting polonius `known_placeholder_subset` \
-                     fr1={:?}, fr2={:?}",
-                    fr1, fr2
-                );
-                all_facts.known_placeholder_subset.push((fr1, fr2));
-            }
-        }
     }
 
     // Create the region inference context, taking ownership of the
diff --git a/compiler/rustc_borrowck/src/nll/polonius.rs b/compiler/rustc_borrowck/src/nll/polonius.rs
index 78c744384fd..d493bead772 100644
--- a/compiler/rustc_borrowck/src/nll/polonius.rs
+++ b/compiler/rustc_borrowck/src/nll/polonius.rs
@@ -6,10 +6,13 @@
 use rustc_middle::mir::{Body, LocalKind, Location, START_BLOCK};
 use rustc_mir_dataflow::move_paths::{InitKind, InitLocation, MoveData};
 
+use crate::borrow_set::BorrowSet;
 use crate::facts::AllFacts;
 use crate::location::LocationTable;
+use crate::type_check::free_region_relations::UniversalRegionRelations;
+use crate::universal_regions::UniversalRegions;
 
-/// Emit polonius facts needed for move/init analysis: moves and assignments.
+/// Emit facts needed for move/init analysis: moves and assignments.
 pub(crate) fn emit_move_facts(
     all_facts: &mut AllFacts,
     move_data: &MoveData<'_>,
@@ -82,3 +85,44 @@ pub(crate) fn emit_move_facts(
         .path_moved_at_base
         .extend(move_data.moves.iter().map(|mo| (mo.path, location_table.mid_index(mo.source))));
 }
+
+/// Emit universal regions facts, and their relations.
+pub(crate) fn emit_universal_region_facts(
+    all_facts: &mut AllFacts,
+    borrow_set: &BorrowSet<'_>,
+    universal_regions: &UniversalRegions<'_>,
+    universal_region_relations: &UniversalRegionRelations<'_>,
+) {
+    // 1: universal regions are modeled in Polonius as a pair:
+    // - the universal region vid itself.
+    // - a "placeholder loan" associated to this universal region. Since they don't exist in
+    //   the `borrow_set`, their `BorrowIndex` are synthesized as the universal region index
+    //   added to the existing number of loans, as if they succeeded them in the set.
+    //
+    all_facts.universal_region.extend(universal_regions.universal_regions());
+    let borrow_count = borrow_set.len();
+    debug!(
+        "emit_universal_region_facts: polonius placeholders, num_universals={}, borrow_count={}",
+        universal_regions.len(),
+        borrow_count
+    );
+
+    for universal_region in universal_regions.universal_regions() {
+        let universal_region_idx = universal_region.index();
+        let placeholder_loan_idx = borrow_count + universal_region_idx;
+        all_facts.placeholder.push((universal_region, placeholder_loan_idx.into()));
+    }
+
+    // 2: the universal region relations `outlives` constraints are emitted as
+    //  `known_placeholder_subset` facts.
+    for (fr1, fr2) in universal_region_relations.known_outlives() {
+        if fr1 != fr2 {
+            debug!(
+                "emit_universal_region_facts: emitting polonius `known_placeholder_subset` \
+                     fr1={:?}, fr2={:?}",
+                fr1, fr2
+            );
+            all_facts.known_placeholder_subset.push((fr1, fr2));
+        }
+    }
+}