weirflow 0.1.0

GPU-first dataflow analysis primitives for Vyre and Santh compiler pipelines.
Documentation
//! Parity test: GPU summarize_function matches reference oracle.

#![cfg(test)]

use vyre::DispatchConfig;
use vyre_driver_cuda::CudaBackend;
use weir::oracle::summary::summarize_function as summarize_function_cpu;
use weir::summary::summarize_function_borrowed_via;

fn run_dispatch(
    backend: &CudaBackend,
) -> impl Fn(&vyre::ir::Program, &[&[u8]], Option<[u32; 3]>) -> Result<Vec<Vec<u8>>, String> + '_ {
    move |program, inputs, grid_override| {
        let mut config = DispatchConfig::default();
        config.grid_override = grid_override;
        backend
            .dispatch_borrowed(program, inputs, &config)
            .map_err(|err| err.to_string())
    }
}

fn live_dispatcher() -> CudaBackend {
    CudaBackend::acquire()
        .expect("CudaBackend::acquire failed on a host that must have an NVIDIA GPU.")
}

#[test]
fn cuda_summary_three_way_or() {
    let backend = live_dispatcher();
    let dispatch = run_dispatch(&backend);
    let ast = vec![0b0001u32, 0];
    let cg = vec![0b0010u32, 0b0100];
    let cached = vec![0b1000u32, 0b1_0000];
    let cpu = summarize_function_cpu(&ast, &cg, &cached, 64);
    let gpu = summarize_function_borrowed_via(&dispatch, &ast, &cg, &cached, 64).expect("dispatch");
    assert_eq!(gpu, cpu);
    assert_eq!(gpu, vec![0b1011u32, 0b1_0100]);
}

#[test]
fn cuda_summary_all_zero_yields_zero() {
    let backend = live_dispatcher();
    let dispatch = run_dispatch(&backend);
    let ast = vec![0u32];
    let cg = vec![0u32];
    let cached = vec![0u32];
    let cpu = summarize_function_cpu(&ast, &cg, &cached, 32);
    let gpu = summarize_function_borrowed_via(&dispatch, &ast, &cg, &cached, 32).expect("dispatch");
    assert_eq!(gpu, cpu);
    assert_eq!(gpu, vec![0u32]);
}

#[test]
fn cuda_summary_only_cached_propagates() {
    let backend = live_dispatcher();
    let dispatch = run_dispatch(&backend);
    let ast = vec![0u32];
    let cg = vec![0u32];
    let cached = vec![0xDEADu32];
    let cpu = summarize_function_cpu(&ast, &cg, &cached, 32);
    let gpu = summarize_function_borrowed_via(&dispatch, &ast, &cg, &cached, 32).expect("dispatch");
    assert_eq!(gpu, cpu);
    assert_eq!(gpu, vec![0xDEADu32]);
}

#[test]
fn cuda_summary_full_overlap_idempotent() {
    let backend = live_dispatcher();
    let dispatch = run_dispatch(&backend);
    let v = vec![0xFFFF_FFFFu32, 0xFFFF_FFFF];
    let cpu = summarize_function_cpu(&v, &v, &v, 64);
    let gpu = summarize_function_borrowed_via(&dispatch, &v, &v, &v, 64).expect("dispatch");
    assert_eq!(gpu, cpu);
    assert_eq!(gpu, vec![0xFFFF_FFFFu32, 0xFFFF_FFFF]);
}