1# IR Specification (Updated 10/14/21) 2Stmt 3= Block(stmts_ = [Stmt]) 4| Store(buf_ = Buf, indices = [Expr], value_ = Expr, mask_ = Expr) 5| Allocate(buf_ = Buf) 6| Free(buf_ = Buf) 7| PlacementAllocate(buf_ = Buf, buf_to_reuse_ = Buf) 8| Let(var_ = Var, val_ = Expr) 9| Cond(condition_ = Expr, true_stmt_ = Block, false_stmt_ = Block) 10| For(var_ = Var, start_ = Expr, stop_ = Expr, body_ = Block, loopOptions = LoopOptions) 11| AtomicAdd(buf_ = Buf, indices = [Expr], value_ = Expr) 12| SyncThreads() 13| ExternalCall(buf_ = Buf, buf_args_ = [Buf], args_ = [Expr]) 14 15Expr 16= Var() 17| Buf(base_handle_ = Var, dims = [Expr], qscale_ = Expr, qzero_ = Expr) 18| Term(variables_ = [Expr], scalar_ = Expr) 19| Polynomial(variables_ = [Term], scalar_ = Expr) 20| MaxTerm(variables_ = [Term], scalar_ = Expr) 21| MinTerm(variables_ = [Term], scalar_ = Expr) 22| Cast(src_value_ = Expr) 23| BitCast(src_value_ = Expr) 24| BinaryOpNode(lhs_ = Expr, rhs_ = Expr) 25| ImmInt/ImmFloat/etc.() 26| Ramp(base_ = Expr, stride_ = Expr) 27| Load(buf_ = Buf, indices = [Expr], mask_ = Expr) 28| Broadcast(value_ = Expr, lanes_ = int) 29| IfThenElse(condition_ = Expr, true_ = Expr, false_ = Expr) 30| Intrinsics(op_type_ = {kSin, kPow, kExp, ...}, params_ = [Expr]) 31| CompareSelect(lhs_ = Expr, rhs_ = Expr, ret_val1_ = Expr, ret_val2_ = Expr, compare_op_ = {kEQ, kGT, kGE, ...}, bias_ = {kUnbiased, kLikely, kUnlikely}) 32| ReduceOp(body_ = Expr, reduce_args_ = [Var], reducer = Reducer) 33