use std::collections::BTreeSet;
use super::super::basic_block::BlockId;
use super::Cfg;
impl Cfg {
#[must_use]
pub fn reachable_blocks(&self) -> BTreeSet<BlockId> {
let mut visited = BTreeSet::new();
if !self.blocks.contains_key(&self.entry) {
return visited;
}
let mut stack = vec![self.entry];
while let Some(id) = stack.pop() {
if !visited.insert(id) {
continue;
}
for &succ in self.successors(id) {
if self.blocks.contains_key(&succ) {
stack.push(succ);
}
}
}
visited
}
#[must_use]
pub fn unreachable_blocks(&self) -> BTreeSet<BlockId> {
let reachable = self.reachable_blocks();
self.blocks
.keys()
.copied()
.filter(|id| !reachable.contains(id))
.collect()
}
#[must_use]
pub fn is_reachable(&self, id: BlockId) -> bool {
self.reachable_blocks().contains(&id)
}
}