use crate::{Block, Function};
use std::collections::HashSet;
impl Function {
pub fn sorted_blocks(&self) -> Vec<Block> {
let mut visited: HashSet<Block> = HashSet::new();
let mut post_order: Vec<Block> = Vec::new();
if let Some(entry) = self.entry_block() {
self.dfs(entry, &mut visited, &mut post_order);
}
post_order.into_iter().rev().collect()
}
fn dfs(&self, block: Block, visited: &mut HashSet<Block>, post_order: &mut Vec<Block>) {
visited.insert(block);
if let Some(block_data) = self.get_block(&block) {
for next_block in block_data.get_successors() {
if !visited.contains(&next_block) {
self.dfs(next_block, visited, post_order);
}
}
}
post_order.push(block);
}
}