Control Flow Operations【免费下载链接】pto-isaParallel Tile Operation (PTO) is a virtual instruction set architecture designed by Ascend CANN, focusing on tile-level operations. This repository offers high-performance, cross-platform tile operations across Ascend platforms.项目地址: https://gitcode.com/cann/pto-isaThis document describes structured control flow operations from the MLIRscf(Structured Control Flow) dialect.Total Operations:9Loop Operationsscf.for - For LoopDescription:For loop with lower bound, upper bound, and step. Supports loop-carried variables and signed/unsigned comparison.Syntax:scf.for %iv %lb to %ub step %step { // loop body } scf.for %iv %lb to %ub step %step iter_args(%arg %init) - (type) { // loop body with loop-carried variable scf.yield %new_value : type } scf.for unsigned %iv %lb to %ub step %step : i32 { // unsigned comparison }Operands:lb: Lower bound (index or integer)ub: Upper bound (exclusive)step: Step value (must be positive)iter_args: Initial values for loop-carried variables (optional)Results:Final values of loop-carried variables (if any)Example:// Simple loop scf.for %i %c0 to %c100 step %c1 { // loop body } // Loop with accumulator %sum scf.for %i %c0 to %c100 step %c1 iter_args(%acc %c0_i32) - (i32) { %val memref.load %array[%i] : memref?xi32 %new_acc arith.addi %acc, %val : i32 scf.yield %new_acc : i32 } // Unsigned comparison scf.for unsigned %i %lb to %ub step %step : i32 { // loop body }scf.while - While LoopDescription:While loop with condition check in before region and loop body in after region.Syntax:%result scf.while (%arg %init) : (type) - type { // before region: condition check %condition ... scf.condition(%condition) %arg : type } do { ^bb0(%arg: type): // after region: loop body %next ... scf.yield %next : type }Regions:before: Condition check region (terminates withscf.condition)after: Loop body region (terminates withscf.yield)Example:%result scf.while (%arg %init) : (i32) - i32 { %condition arith.cmpi slt, %arg, %limit : i32 scf.condition(%condition) %arg : i32 } do { ^bb0(%arg: i32): %next arith.addi %arg, %c1 : i32 scf.yield %next : i32 }Conditional Operationsscf.if - If-Then-ElseDescription:Conditional branch with optional else block and optional results.Syntax:scf.if %condition { // then block } scf.if %condition { // then block } else { // else block } %result scf.if %condition - type { // then block scf.yield %value : type } else { // else block scf.yield %other : type }Operands:condition: Boolean condition (i1)Results:Values yielded from branches (if any)Example:// Simple if scf.if %condition { // then block } // If-else scf.if %condition { // then block } else { // else block } // If with results %result scf.if %condition - i32 { %value arith.constant 1 : i32 scf.yield %value : i32 } else { %value arith.constant 0 : i32 scf.yield %value : i32 }scf.index_switch - Index SwitchDescription:Switch statement based on an index value with multiple cases and a default case.Syntax:%result scf.index_switch %arg - type case 0 { // case 0 block scf.yield %value0 : type } case 1 { // case 1 block scf.yield %value1 : type } default { // default block scf.yield %default_value : type }Operands:arg: Index value to switch onAttributes:cases: Array of case valuesExample:%result scf.index_switch %idx - i32 case 0 { %c0 arith.constant 10 : i32 scf.yield %c0 : i32 } case 1 { %c1 arith.constant 20 : i32 scf.yield %c1 : i32 } case 2 { %c2 arith.constant 30 : i32 scf.yield %c2 : i32 } default { %cd arith.constant 0 : i32 scf.yield %cd : i32 }Region Operationsscf.execute_region - Execute RegionDescription:Execute a region exactly once. Allows multiple blocks within single-block contexts.Syntax:%result scf.execute_region - type { // region body (can have multiple blocks) scf.yield %value : type } %result scf.execute_region - type no_inline { // region body with no_inline attribute scf.yield %value : type }Attributes:no_inline: Optional flag to prevent inliningSemantics:Executes the region exactly once. Useful for creating multi-block regions within operations that normally allow only single blocks.Example:// Simple execute region %result scf.execute_region - i32 { %x arith.constant 42 : i32 scf.yield %x : i32 } // With multiple blocks %result scf.execute_region - i32 { cf.cond_br %cond, ^bb1, ^bb2 ^bb1: %c1 arith.constant 1 : i32 cf.br ^bb3(%c1 : i32) ^bb2: %c2 arith.constant 2 : i32 cf.br ^bb3(%c2 : i32) ^bb3(%arg: i32): scf.yield %arg : i32 } // With no_inline attribute %result scf.execute_region - i32 no_inline { %x arith.constant 42 : i32 scf.yield %x : i32 }Terminator Operationsscf.yield - Yield ValuesDescription:Terminates regions within SCF operations and yields values to parent operation.Syntax:scf.yield scf.yield %value : type scf.yield %value1, %value2 : type1, type2Semantics:Used to terminate:Loop bodies (scf.for,scf.whileafter region)Conditional branches (scf.if)Execute regions (scf.execute_region)Switch cases (scf.index_switch)Example:// Yield single value scf.yield %value : i32 // Yield multiple values scf.yield %a, %b : i32, f32 // Yield no values scf.yieldscf.condition - Loop Continuation ConditionDescription:Terminates the before region ofscf.while. If condition is true, continues to after region; otherwise exits loop.Syntax:scf.condition(%condition) %args... : types...Operands:condition: Boolean condition (i1)args: Values to pass to after region or return from loopSemantics:Ifconditionis true: execute after region withargsIfconditionis false: exit loop and returnargsExample:// In scf.while before region %keep_going arith.cmpi slt, %i, %limit : i32 scf.condition(%keep_going) %i : i32 // With multiple values %cond arith.cmpi slt, %i, %limit : i32 scf.condition(%cond) %i, %sum : i32, i32Common PatternsPattern 1: Simple Loopscf.for %i %c0 to %c100 step %c1 { // loop body }Pattern 2: Loop with Accumulator%sum scf.for %i %c0 to %c100 step %c1 iter_args(%acc %c0) - (i32) { %val memref.load %array[%i] : memref?xi32 %new_acc arith.addi %acc, %val : i32 scf.yield %new_acc : i32 }Pattern 3: Conditional with Results%result scf.if %cond - i32 { scf.yield %true_val : i32 } else { scf.yield %false_val : i32 }Pattern 4: While Loop%final scf.while (%arg %init) : (i32) - i32 { %keep_going arith.cmpi slt, %arg, %limit : i32 scf.condition(%keep_going) %arg : i32 } do { ^bb0(%arg: i32): %next arith.addi %arg, %c1 : i32 scf.yield %next : i32 }Pattern 5: Nested Loopsscf.for %i %c0 to %M step %c1 { scf.for %j %c0 to %N step %c1 { // nested loop body } }Pattern 6: Loop with Multiple Accumulators%sum, %prod scf.for %i %c0 to %c100 step %c1 iter_args(%acc_sum %c0, %acc_prod %c1) - (i32, i32) { %val memref.load %array[%i] : memref?xi32 %new_sum arith.addi %acc_sum, %val : i32 %new_prod arith.muli %acc_prod, %val : i32 scf.yield %new_sum, %new_prod : i32, i32 }【免费下载链接】pto-isaParallel Tile Operation (PTO) is a virtual instruction set architecture designed by Ascend CANN, focusing on tile-level operations. This repository offers high-performance, cross-platform tile operations across Ascend platforms.项目地址: https://gitcode.com/cann/pto-isa创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考