mirsa-core 0.2.1

Core MIR utilities for mirsa
Documentation
use rustc_middle::mir::{BasicBlock, Body};

#[derive(Clone, Debug)]
pub struct Cfg {
    pub succ: Vec<Vec<BasicBlock>>,
    pub pred: Vec<Vec<BasicBlock>>,
}
pub fn build_cfg(body: &Body<'_>) -> Cfg {
    let n = body.basic_blocks.len();
    let mut succ = vec![Vec::<BasicBlock>::new(); n];
    let mut pred = vec![Vec::<BasicBlock>::new(); n];

    for (bb, bbdata) in body.basic_blocks.iter_enumerated() {
        let mut edges = Vec::new();
        if let Some(term) = &bbdata.terminator {
            term.successors()
                .filter(|s| !body.basic_blocks[*s].is_cleanup)
                .for_each(|s| edges.push(s));
        }
        succ[bb.index()] = edges.clone();
        for s in edges {
            pred[s.index()].push(bb);
        }
    }

    Cfg { succ, pred }
}