weirflow 0.1.0

GPU-first dataflow analysis primitives for Vyre and Santh compiler pipelines.
Documentation
use super::*;

// ------------------------------------------------------------------
// 5. Dominators
// ------------------------------------------------------------------

#[test]
fn analysis_matrix_dominators() {
    let mut cases = 0u64;
    for size in [0, 1, 10, 100] {
        let seeds = if size == 0 { 20 } else { 40 };
        for seed in 0..seeds {
            for cfg_type in ["dag", "irreducible"] {
                if size == 0 {
                    let prog = weir::dominators::dominates(0, "dom", "target", "out");
                    assert!(!prog.entry().is_empty());
                    assert_eq!(prog.buffers().len(), 3);
                    record_case();
                    cases += 1;
                    let prog2 = weir::dominators::dominates(0, "a", "b", "c");
                    assert!(!prog2.entry().is_empty());
                    record_case();
                    cases += 1;
                    let prog3 = weir::dominators::dominates(0, "x", "y", "z");
                    assert!(!prog3.entry().is_empty());
                    record_case();
                    cases += 1;
                    #[cfg(feature = "cpu-parity")]
                    {
                        assert!(weir::oracle::graph::dominator_sets(0, &[], 0).is_empty());
                        record_case();
                        cases += 1;
                    }
                    continue;
                }
                let _fixture = match cfg_type {
                    "dag" => DominatorFixture::random_dag(size, 0.3, seed),
                    _ => DominatorFixture::random_irreducible(size, 0.3, seed),
                };
                let prog = weir::dominators::dominates(size, "dom", "target", "out");
                assert!(!prog.entry().is_empty());
                assert_eq!(prog.buffers().len(), 3);
                record_case();
                cases += 1;
                let prog2 = weir::dominators::dominates(size, "a", "b", "c");
                assert!(!prog2.entry().is_empty());
                record_case();
                cases += 1;
                let prog3 = weir::dominators::dominates(size, "x", "y", "z");
                assert!(!prog3.entry().is_empty());
                record_case();
                cases += 1;
                #[cfg(feature = "cpu-parity")]
                {
                    let cpu =
                        weir::oracle::graph::dominator_sets(size, &_fixture.succs, _fixture.entry);
                    let words = (size as usize + 31) / 32;
                    if !cpu.is_empty() {
                        let entry_word = (_fixture.entry as usize) / 32;
                        let entry_bit = (_fixture.entry as usize) % 32;
                        assert_eq!(
                            cpu[entry_word] >> entry_bit & 1,
                            1,
                            "entry must dominate itself"
                        );
                    }
                    record_case();
                    cases += 1;
                    let fake = FakeResidentBackend::new();
                    let dom_bytes = weir::oracle::graph::dominator_bitmap_bytes(
                        size,
                        &_fixture.succs,
                        _fixture.entry,
                    );
                    let w = dom_bytes.len() / 4;
                    let target = vec![0u32; w];
                    let inputs: Vec<Vec<u8>> = vec![
                        dom_bytes,
                        bytemuck::cast_slice(&target).to_vec(),
                        vec![0u8; w * 4],
                    ];
                    let _ =
                        fake.dispatch(&prog, &inputs, &vyre::backend::DispatchConfig::default());
                    record_case();
                    cases += 1;
                }
                #[cfg(feature = "gpu-telemetry")]
                {
                    let scratch = weir::fixed_point_scratch::FixedPointScratch::default();
                    let _ = scratch.frontier_density();
                    record_case();
                    cases += 1;
                }
            }
        }
    }
    eprintln!("analysis_matrix_dominators: {cases} cases");
    assert!(cases >= 500, "expected ≥500 cases, got {cases}");
}