about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAmanda Stjerna <amanda.stjerna@it.uu.se>2024-05-17 15:11:59 +0200
committerAmanda Stjerna <amanda.stjerna@it.uu.se>2024-06-12 15:47:32 +0200
commit905db03b2869d6c53893ccddd84d8b2fd3c48273 (patch)
tree8a6ca2b5e6eb5d63efc32a101358f7b015261d96
parentd2a01760bcc82302464632e38d2108e06c2a8dd9 (diff)
downloadrust-905db03b2869d6c53893ccddd84d8b2fd3c48273.tar.gz
rust-905db03b2869d6c53893ccddd84d8b2fd3c48273.zip
Simplify path compression logic
-rw-r--r--compiler/rustc_borrowck/src/constraints/mod.rs13
-rw-r--r--compiler/rustc_borrowck/src/region_infer/mod.rs2
-rw-r--r--compiler/rustc_data_structures/src/graph/scc/mod.rs19
3 files changed, 14 insertions, 20 deletions
diff --git a/compiler/rustc_borrowck/src/constraints/mod.rs b/compiler/rustc_borrowck/src/constraints/mod.rs
index b1d6fd89e27..ecb05eb09a4 100644
--- a/compiler/rustc_borrowck/src/constraints/mod.rs
+++ b/compiler/rustc_borrowck/src/constraints/mod.rs
@@ -62,15 +62,22 @@ impl scc::Annotation for RegionTracker {
 
 impl RegionTracker {
     pub fn new(rvid: RegionVid, definition: &RegionDefinition<'_>) -> Self {
+        let (representative_is_placeholder, representative_is_existential) = match definition.origin {
+            rustc_infer::infer::NllRegionVariableOrigin::FreeRegion => (false, false),
+            rustc_infer::infer::NllRegionVariableOrigin::Placeholder(_) => (true, false),
+            rustc_infer::infer::NllRegionVariableOrigin::Existential { .. } => (false, true),
+        };
+
         let placeholder_universe =
-            if definition.is_placeholder() { definition.universe } else { UniverseIndex::ROOT };
+            if representative_is_placeholder { definition.universe } else { UniverseIndex::ROOT };
+
 
         Self {
             max_placeholder_universe_reached: placeholder_universe,
             min_reachable_universe: definition.universe,
             representative: rvid,
-            representative_is_placeholder: definition.is_placeholder(),
-            representative_is_existential: definition.is_existential(),
+            representative_is_placeholder,
+            representative_is_existential,
         }
     }
     pub fn universe(self) -> UniverseIndex {
diff --git a/compiler/rustc_borrowck/src/region_infer/mod.rs b/compiler/rustc_borrowck/src/region_infer/mod.rs
index b2a91a58e5c..2f387e345ed 100644
--- a/compiler/rustc_borrowck/src/region_infer/mod.rs
+++ b/compiler/rustc_borrowck/src/region_infer/mod.rs
@@ -2163,10 +2163,12 @@ impl<'tcx> RegionDefinition<'tcx> {
         Self { origin, universe, external_name: None }
     }
 
+    #[inline(always)]
     pub fn is_placeholder(&self) -> bool {
         matches!(self.origin, NllRegionVariableOrigin::Placeholder(_))
     }
 
+    #[inline(always)]
     pub fn is_existential(&self) -> bool {
         matches!(self.origin, NllRegionVariableOrigin::Existential { .. })
     }
diff --git a/compiler/rustc_data_structures/src/graph/scc/mod.rs b/compiler/rustc_data_structures/src/graph/scc/mod.rs
index 68a055553a1..1426aa2baa4 100644
--- a/compiler/rustc_data_structures/src/graph/scc/mod.rs
+++ b/compiler/rustc_data_structures/src/graph/scc/mod.rs
@@ -393,38 +393,23 @@ where
         // `InCycleWith` upwards.
         // This loop performs the downward link encoding mentioned above. Details below!
         let node_state = {
-            let mut annotation = (self.to_annotation)(node);
-
             loop {
                 debug!("find_state(r = {node:?} in state {:?})", self.node_states[node]);
                 match self.node_states[node] {
-                    NodeState::NotVisited => break NodeState::NotVisited,
-                    NodeState::BeingVisited { depth, annotation: previous_annotation } => {
-                        break NodeState::BeingVisited {
-                            depth,
-                            annotation: previous_annotation.merge_scc(annotation),
-                        };
-                    }
+                    s @ (NodeState::NotVisited | NodeState::BeingVisited{..} | NodeState::InCycle { .. }) => break s,
                     NodeState::InCycleWith { parent } => {
                         // We test this, to be extremely sure that we never
                         // ever break our termination condition for the
                         // reverse iteration loop.
                         assert!(node != parent, "Node can not be in cycle with itself");
 
-                        annotation = annotation.merge_scc((self.to_annotation)(node));
-
                         // Store the previous node as an inverted list link
                         self.node_states[node] = NodeState::InCycleWith { parent: previous_node };
                         // Update to parent node.
                         previous_node = node;
                         node = parent;
                     }
-                    NodeState::InCycle { scc_index, annotation: previous_annotation } => {
-                        break NodeState::InCycle {
-                            scc_index,
-                            annotation: previous_annotation.merge_scc(annotation),
-                        };
-                    }
+
                 }
             }
         };