clippy_utils/mir/
transitive_relation.rs1use rustc_data_structures::fx::FxHashMap;
2use rustc_index::bit_set::DenseBitSet;
3use rustc_middle::mir;
4
5#[derive(Default)]
6pub(super) struct TransitiveRelation {
7 relations: FxHashMap<mir::Local, Vec<mir::Local>>,
8}
9
10impl TransitiveRelation {
11 pub fn add(&mut self, a: mir::Local, b: mir::Local) {
13 self.relations.entry(a).or_default().push(b);
14 }
15
16 pub fn reachable_from(&self, a: mir::Local, domain_size: usize) -> DenseBitSet<mir::Local> {
18 let mut seen = DenseBitSet::new_empty(domain_size);
19 let mut stack = vec![a];
20 while let Some(u) = stack.pop() {
21 if let Some(edges) = self.relations.get(&u) {
22 for &v in edges {
23 if seen.insert(v) {
24 stack.push(v);
25 }
26 }
27 }
28 }
29 seen
30 }
31}