forked from OSchip/llvm-project
83e8db2193
The new implementation of blocks was designed to support blocks with arguments. More specifically, StmtBlock can be constructed with a list of Bindables that will be bound to block aguments upon construction. Leverage this functionality to implement branch instructions with arguments. This additionally requires the statement storage to have a list of successors, similarly to core IR operations. Becauase successor chains can form loops, we need a possibility to decouple block declaration, after which it becomes usable by branch instructions, from block body definition. This is achieved by creating an empty block and by resetting its body with a new list of instructions. Note that assigning a block from another block will not affect any instructions that may have designated this block as their successor (this behavior is necessary to make value-type semantics of EDSC types consistent). Combined, one can now write generators like EDSCContext context; Type indexType = ...; Bindable i(indexType), ii(indexType), zero(indexType), one(indexType); StmtBlock loopBlock({i}, {}); loopBlock.set({ii = i + one, Branch(loopBlock, {ii})}); MLIREmitter(&builder) .bindConstant<ConstantIndexOp>(zero, 0) .bindConstant<ConstantIndexOp>(one, 1) .emitStmt(Branch(loopBlock, {zero})); where the emitter will emit the statement and its successors, if present. PiperOrigin-RevId: 235541892 |
||
---|---|---|
mlir |