weirflow 0.1.0

GPU-first dataflow analysis primitives for Vyre and Santh compiler pipelines.
Documentation
//! `weir::ifds::ifds_reach_step` + `weir::ifds_gpu::ifds_gpu_step`  -
//! IFDS forward propagation primitives.
//!
//! Op id: `weir::tests::df::ifds_construction`. Soundness: `Exact`
//! over IFDS  -  both primitives are one-step CSR forward traversals
//! tagged with their op id. Construction tests pin the buffer set
//! and entry-vector non-emptiness.

use vyre::ir::BufferAccess;
use vyre_primitives::graph::program_graph::ProgramGraphShape;
use weir::ifds;
use weir::ifds_gpu;

#[test]
fn ifds_reach_step_emits_frontier_buffers() {
    let shape = ProgramGraphShape::new(64, 64);
    let prog = ifds::ifds_reach_step(shape, "frontier_in", "frontier_out");

    let names: Vec<&str> = prog.buffers().iter().map(|b| b.name()).collect();
    assert!(
        names.contains(&"frontier_in"),
        "missing frontier_in in {names:?}"
    );
    assert!(
        names.contains(&"frontier_out"),
        "missing frontier_out in {names:?}"
    );

    let fin = prog
        .buffers()
        .iter()
        .find(|b| b.name() == "frontier_in")
        .expect("frontier_in declared");
    assert_eq!(fin.access, BufferAccess::ReadOnly);
    assert!(!prog.entry().is_empty());
}

#[test]
fn ifds_reach_step_renames_per_call() {
    let shape = ProgramGraphShape::new(64, 64);
    let one = ifds::ifds_reach_step(shape, "fin_one", "fout_one");
    let two = ifds::ifds_reach_step(shape, "fin_two", "fout_two");
    let names_one: Vec<&str> = one.buffers().iter().map(|b| b.name()).collect();
    let names_two: Vec<&str> = two.buffers().iter().map(|b| b.name()).collect();
    assert!(names_one.contains(&"fin_one") && !names_one.contains(&"fin_two"));
    assert!(names_two.contains(&"fin_two") && !names_two.contains(&"fin_one"));
}

#[test]
fn ifds_gpu_program_emits_frontier_buffers() {
    let prog = ifds_gpu::ifds_gpu("exploded_adj", "frontier_in", "frontier_out")
        .expect("IFDS GPU compatibility shim must build");
    let names: Vec<&str> = prog.buffers().iter().map(|b| b.name()).collect();
    assert!(names.contains(&"frontier_in"));
    assert!(names.contains(&"frontier_out"));
    assert!(!prog.entry().is_empty());
}