weirflow 0.1.0

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

#[test]
fn cuda_reaching_chain_propagates_forward() {
    let backend = live_dispatcher();
    let dispatch = run_dispatch(&backend);
    let edge_offsets = vec![0u32, 1, 2, 3, 3];
    let edge_targets = vec![1u32, 2, 3];
    let edge_kind_mask = vec![edge_kind::CONTROL; 3];
    let seed_bits = vec![0b0001u32];
    let cpu = reaching_closure_cpu(4, &edge_offsets, &edge_targets, &edge_kind_mask, &seed_bits);
    let gpu = reaching_closure_borrowed_via(
        &dispatch,
        4,
        &edge_offsets,
        &edge_targets,
        &edge_kind_mask,
        &seed_bits,
        16,
    )
    .expect("dispatch");
    assert_eq!(gpu, cpu);
    assert_eq!(gpu, vec![0b1111u32]);
}

#[test]
fn cuda_reaching_diamond() {
    let backend = live_dispatcher();
    let dispatch = run_dispatch(&backend);
    let edge_offsets = vec![0u32, 2, 3, 4, 4];
    let edge_targets = vec![1u32, 2, 3, 3];
    let edge_kind_mask = vec![edge_kind::CONTROL; 4];
    let seed_bits = vec![0b0001u32];
    let cpu = reaching_closure_cpu(4, &edge_offsets, &edge_targets, &edge_kind_mask, &seed_bits);
    let gpu = reaching_closure_borrowed_via(
        &dispatch,
        4,
        &edge_offsets,
        &edge_targets,
        &edge_kind_mask,
        &seed_bits,
        16,
    )
    .expect("dispatch");
    assert_eq!(gpu, cpu);
    assert_eq!(gpu, vec![0b1111u32]);
}

#[test]
fn cuda_reaching_non_control_blocked() {
    let backend = live_dispatcher();
    let dispatch = run_dispatch(&backend);
    let edge_offsets = vec![0u32, 1, 1];
    let edge_targets = vec![1u32];
    let edge_kind_mask = vec![edge_kind::ASSIGNMENT];
    let seed_bits = vec![0b01u32];
    let cpu = reaching_closure_cpu(2, &edge_offsets, &edge_targets, &edge_kind_mask, &seed_bits);
    let gpu = reaching_closure_borrowed_via(
        &dispatch,
        2,
        &edge_offsets,
        &edge_targets,
        &edge_kind_mask,
        &seed_bits,
        16,
    )
    .expect("dispatch");
    assert_eq!(gpu, cpu);
    assert_eq!(gpu, vec![0b01u32]);
}

#[test]
fn cuda_reaching_self_loop_terminates() {
    let backend = live_dispatcher();
    let dispatch = run_dispatch(&backend);
    let edge_offsets = vec![0u32, 1, 1];
    let edge_targets = vec![0u32];
    let edge_kind_mask = vec![edge_kind::CONTROL];
    let seed_bits = vec![0b01u32];
    let cpu = reaching_closure_cpu(2, &edge_offsets, &edge_targets, &edge_kind_mask, &seed_bits);
    let gpu = reaching_closure_borrowed_via(
        &dispatch,
        2,
        &edge_offsets,
        &edge_targets,
        &edge_kind_mask,
        &seed_bits,
        50,
    )
    .expect("dispatch");
    assert_eq!(gpu, cpu);
}

#[test]
fn cuda_reaching_disconnected() {
    let backend = live_dispatcher();
    let dispatch = run_dispatch(&backend);
    let edge_offsets = vec![0u32, 1, 1, 2, 2];
    let edge_targets = vec![1u32, 3];
    let edge_kind_mask = vec![edge_kind::CONTROL; 2];
    let seed_bits = vec![0b0001u32]; // only node 0
    let cpu = reaching_closure_cpu(4, &edge_offsets, &edge_targets, &edge_kind_mask, &seed_bits);
    let gpu = reaching_closure_borrowed_via(
        &dispatch,
        4,
        &edge_offsets,
        &edge_targets,
        &edge_kind_mask,
        &seed_bits,
        16,
    )
    .expect("dispatch");
    assert_eq!(gpu, cpu);
    assert_eq!(gpu, vec![0b0011u32]);
}