(
post_order_rank: &IndexVec<Node, usize>,
immediate_post_dominators: &IndexVec<Node, ExtNode<Node>>,
end_nodes: &[Node],
mut node1: Node,
mut node2: Node,
)
| 186 | } |
| 187 | |
| 188 | fn intersect<Node: Idx>( |
| 189 | post_order_rank: &IndexVec<Node, usize>, |
| 190 | immediate_post_dominators: &IndexVec<Node, ExtNode<Node>>, |
| 191 | end_nodes: &[Node], |
| 192 | mut node1: Node, |
| 193 | mut node2: Node, |
| 194 | ) -> ExtNode<Node> { |
| 195 | while node1 != node2 { |
| 196 | if end_nodes.contains(&node1) && end_nodes.contains(&node2) { |
| 197 | return ExtNode::Fake; |
| 198 | } |
| 199 | while post_order_rank[node1] < post_order_rank[node2] { |
| 200 | match immediate_post_dominators[node1] { |
| 201 | ExtNode::Real(Some(n)) => node1 = n, |
| 202 | ExtNode::Real(None) | ExtNode::Fake => break, |
| 203 | }; |
| 204 | } |
| 205 | |
| 206 | while post_order_rank[node2] < post_order_rank[node1] { |
| 207 | match immediate_post_dominators[node2] { |
| 208 | ExtNode::Real(Some(n)) => node2 = n, |
| 209 | ExtNode::Real(None) | ExtNode::Fake => break, |
| 210 | }; |
| 211 | } |
| 212 | } |
| 213 | |
| 214 | ExtNode::Real(Some(node1)) |
| 215 | } |
| 216 | |
| 217 | #[derive(Clone, Copy, Debug, PartialEq, Eq)] |
| 218 | pub enum ExtNode<N: Idx> { |
no outgoing calls
no test coverage detected