use crate::ifds_gpu;
use vyre::ir::Program;
use vyre_primitives::graph::csr_forward_traverse::csr_forward_traverse;
use vyre_primitives::graph::program_graph::ProgramGraphShape;
use vyre_primitives::predicate::edge_kind;
pub(crate) const IFDS_REACH_MASK: u32 = edge_kind::ASSIGNMENT
| edge_kind::CALL_ARG
| edge_kind::RETURN
| edge_kind::PHI
| edge_kind::ALIAS
| edge_kind::MEM_STORE
| edge_kind::MEM_LOAD
| edge_kind::MUT_REF;
#[must_use]
pub fn ifds_reach_step(shape: ProgramGraphShape, frontier_in: &str, frontier_out: &str) -> Program {
csr_forward_traverse(shape, frontier_in, frontier_out, IFDS_REACH_MASK)
}
pub fn ifds_reach_step_exploded(
shape: ifds_gpu::IfdsShape,
frontier_in: &str,
frontier_out: &str,
) -> Result<Program, String> {
ifds_gpu::ifds_gpu_step(shape, frontier_in, frontier_out)
}