
=== 1. run a program by rewriting it ===
relu(2.0, 3.0) -> CONST 7.0
relu(-2.0, 3.0) -> CONST 0.0
relu(nan, 3.0) -> CONST 0.0
relu(inf, 0.0) -> CONST 0.0

=== 2. partial evaluation: some arguments known, some not ===
relu(z, 3.0) inlines to: max(((z * 3.0) + 1.0), 0.0)    nodes: 7
; uop v1
%0 = param : dtype=f32 slot=0
%1 = const : dtype=f32 value=3.0
%2 = mul %0, %1
%3 = const : dtype=f32 value=1.0
%4 = add %2, %3
%5 = const : dtype=f32 value=0.0
%6 = max %4, %5

relu(z, 0.0): the strict rules keep z*0.0 (it is nan for z = inf), so 6 nodes remain, including a MUL
g(2, 1) with g = i*4+j: CONST 9
