weirflow 0.1.0

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

#[test]
#[should_panic(expected = "IFDS CPU oracle received malformed problem")]
fn solve_cpu_rejects_out_of_domain_seed() {
    let _ = solve_cpu(1, 2, 1, &[], &[], &[], &[], &[(0, 0, 1)]);
}

#[test]
fn solve_borrowed_via_rejects_out_of_domain_seed_before_dispatch() {
    let dispatch = |_: &Program, _: &[&[u8]], _: Option<[u32; 3]>| {
        panic!("malformed IFDS seed must be rejected before GPU dispatch")
    };
    let err = solve_borrowed_via(&dispatch, 1, 2, 1, &[], &[], &[], &[], &[(0, 0, 1)], 1)
        .expect_err("out-of-domain IFDS seed must be rejected");
    assert!(
        err.contains("weir IFDS GPU solve seed tuple 0 is out of domain"),
        "unexpected diagnostic: {err}"
    );
    assert!(
        err.contains("Fix: discard or remap malformed dataflow facts"),
        "diagnostic must be actionable: {err}"
    );
}

#[test]
fn solve_borrowed_via_rejects_zero_iteration_budget_before_dispatch() {
    let dispatch = |_: &Program, _: &[&[u8]], _: Option<[u32; 3]>| {
        panic!("zero IFDS iteration budget must be rejected before GPU dispatch")
    };
    let err = solve_borrowed_via(
        &dispatch,
        1,
        1,
        1,
        &[(0, 0, 0)],
        &[],
        &[],
        &[],
        &[(0, 0, 0)],
        0,
    )
    .expect_err("zero IFDS iteration budget must be rejected");
    assert!(
        err.contains("max_iterations=0") && err.contains("positive fixpoint iteration budget"),
        "unexpected diagnostic: {err}"
    );
}

#[test]
fn solve_borrowed_via_rejects_out_of_domain_output_tail_bits() {
    use std::cell::Cell;

    let calls = Cell::new(0usize);
    let dispatch = |_: &Program, _: &[&[u8]], _: Option<[u32; 3]>| {
        let call = calls.get();
        calls.set(call + 1);
        if call == 0 {
            Ok(vec![
                [0u32, 0]
                    .iter()
                    .flat_map(|word| word.to_le_bytes())
                    .collect(),
                vec![0; 4],
                vec![0; 4],
                0u32.to_le_bytes().to_vec(),
            ])
        } else {
            Ok(vec![0b10u32.to_le_bytes().to_vec()])
        }
    };
    let err = solve_borrowed_via(
        &dispatch,
        1,
        1,
        1,
        &[(0, 0, 0)],
        &[],
        &[],
        &[],
        &[(0, 0, 0)],
        1,
    )
    .expect_err("backend frontier tail bit outside IFDS node_count must be rejected");
    assert!(
        err.contains("outside the declared domain"),
        "unexpected diagnostic: {err}"
    );
}

#[test]
fn solve_borrowed_via_rejects_malformed_gpu_built_csr() {
    let dispatch = |_: &Program, _: &[&[u8]], _: Option<[u32; 3]>| {
        Ok(vec![
            [0u32, 1]
                .iter()
                .flat_map(|word| word.to_le_bytes())
                .collect(),
            vec![0; 4],
            1u32.to_le_bytes().to_vec(),
            1u32.to_le_bytes().to_vec(),
        ])
    };
    let err = solve_borrowed_via(
        &dispatch,
        1,
        1,
        1,
        &[(0, 0, 0)],
        &[],
        &[],
        &[],
        &[(0, 0, 0)],
        1,
    )
    .expect_err("GPU-built IFDS CSR with out-of-domain target must be rejected");
    assert!(
        err.contains("targets node 1"),
        "unexpected diagnostic: {err}"
    );
}