use crate::ir::model::expr::Expr;
use std::collections::HashSet;
#[inline]
pub fn collect_expr_atomics(expr: &Expr, buffers: &mut HashSet<String>) {
match expr {
Expr::Atomic {
buffer,
index,
expected,
value,
..
} => {
buffers.insert(buffer.to_string());
collect_expr_atomics(index, buffers);
if let Some(expected) = expected {
collect_expr_atomics(expected, buffers);
}
collect_expr_atomics(value, buffers);
}
Expr::Load { index, .. } => collect_expr_atomics(index, buffers),
Expr::BinOp { left, right, .. } => {
collect_expr_atomics(left, buffers);
collect_expr_atomics(right, buffers);
}
Expr::UnOp { operand, .. } | Expr::Cast { value: operand, .. } => {
collect_expr_atomics(operand, buffers);
}
Expr::Call { args, .. } => {
for arg in args {
collect_expr_atomics(arg, buffers);
}
}
Expr::Select {
cond,
true_val,
false_val,
} => {
collect_expr_atomics(cond, buffers);
collect_expr_atomics(true_val, buffers);
collect_expr_atomics(false_val, buffers);
}
Expr::Fma { a, b, c } => {
collect_expr_atomics(a, buffers);
collect_expr_atomics(b, buffers);
collect_expr_atomics(c, buffers);
}
Expr::LitU32(_)
| Expr::LitI32(_)
| Expr::LitF32(_)
| Expr::LitBool(_)
| Expr::Var(_)
| Expr::BufLen { .. }
| Expr::InvocationId { .. }
| Expr::WorkgroupId { .. }
| Expr::LocalId { .. } => {}
}
}