diff options
| author | Bryan Garza <1396101+bryangarza@users.noreply.github.com> | 2023-01-06 22:04:25 +0000 |
|---|---|---|
| committer | Bryan Garza <1396101+bryangarza@users.noreply.github.com> | 2023-01-24 00:01:37 +0000 |
| commit | 1bbd655888ec50220e6cd34e846c816c1cad8f17 (patch) | |
| tree | 0c70e62ed5b06b30be9d93245cb70c51d7a9ffad /compiler/rustc_data_structures | |
| parent | 7618163a1caf0d6dfa5618c8369742720c90ef6b (diff) | |
| download | rust-1bbd655888ec50220e6cd34e846c816c1cad8f17.tar.gz rust-1bbd655888ec50220e6cd34e846c816c1cad8f17.zip | |
Improve efficiency of has_back_edge(...)
Diffstat (limited to 'compiler/rustc_data_structures')
| -rw-r--r-- | compiler/rustc_data_structures/src/graph/dominators/mod.rs | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/compiler/rustc_data_structures/src/graph/dominators/mod.rs b/compiler/rustc_data_structures/src/graph/dominators/mod.rs index 38a687af7e6..0a21a4249c8 100644 --- a/compiler/rustc_data_structures/src/graph/dominators/mod.rs +++ b/compiler/rustc_data_structures/src/graph/dominators/mod.rs @@ -304,13 +304,18 @@ fn compress( } } +/// Tracks the list of dominators for each node. #[derive(Clone, Debug)] pub struct Dominators<N: Idx> { post_order_rank: IndexVec<N, usize>, + // Even though we track only the immediate dominator of each node, it's + // possible to get its full list of dominators by looking up the dominator + // of each dominator. (See the `impl Iterator for Iter` definition). immediate_dominators: IndexVec<N, Option<N>>, } impl<Node: Idx> Dominators<Node> { + /// Whether the given Node has an immediate dominator. pub fn is_reachable(&self, node: Node) -> bool { self.immediate_dominators[node].is_some() } @@ -320,6 +325,8 @@ impl<Node: Idx> Dominators<Node> { self.immediate_dominators[node].unwrap() } + /// Provides an iterator over each dominator up the CFG, for the given Node. + /// See the `impl Iterator for Iter` definition to understand how this works. pub fn dominators(&self, node: Node) -> Iter<'_, Node> { assert!(self.is_reachable(node), "node {node:?} is not reachable"); Iter { dominators: self, node: Some(node) } |
