149 lines · plain
1// RUN: mlir-opt %s -pass-pipeline='builtin.module(func.func(scf-for-to-while))' -split-input-file | FileCheck %s2// NOTE: Assertions have been autogenerated by utils/generate-test-checks.py3 4// CHECK-LABEL: func @single_loop(5// CHECK-SAME: %[[VAL_0:.*]]: memref<?xi32>,6// CHECK-SAME: %[[VAL_1:.*]]: index,7// CHECK-SAME: %[[VAL_2:.*]]: i32) {8// CHECK: %[[VAL_3:.*]] = arith.constant 0 : index9// CHECK: %[[VAL_4:.*]] = arith.constant 1 : index10// CHECK: %[[VAL_5:.*]] = scf.while (%[[VAL_6:.*]] = %[[VAL_3]]) : (index) -> index {11// CHECK: %[[VAL_7:.*]] = arith.cmpi slt, %[[VAL_6]], %[[VAL_1]] : index12// CHECK: scf.condition(%[[VAL_7]]) %[[VAL_6]] : index13// CHECK: } do {14// CHECK: ^bb0(%[[VAL_8:.*]]: index):15// CHECK: %[[VAL_9:.*]] = arith.addi %[[VAL_8]], %[[VAL_4]] : index16// CHECK: %[[VAL_10:.*]] = arith.addi %[[VAL_2]], %[[VAL_2]] : i3217// CHECK: memref.store %[[VAL_10]], %[[VAL_0]]{{\[}}%[[VAL_8]]] : memref<?xi32>18// CHECK: scf.yield %[[VAL_9]] : index19// CHECK: }20// CHECK: return21// CHECK: }22func.func @single_loop(%arg0: memref<?xi32>, %arg1: index, %arg2: i32) {23 %c0 = arith.constant 0 : index24 %c1 = arith.constant 1 : index25 scf.for %i = %c0 to %arg1 step %c1 {26 %0 = arith.addi %arg2, %arg2 : i3227 memref.store %0, %arg0[%i] : memref<?xi32>28 }29 return30}31 32// -----33 34// CHECK-LABEL: func @nested_loop(35// CHECK-SAME: %[[VAL_0:.*]]: memref<?xi32>,36// CHECK-SAME: %[[VAL_1:.*]]: index,37// CHECK-SAME: %[[VAL_2:.*]]: i32) {38// CHECK: %[[VAL_3:.*]] = arith.constant 0 : index39// CHECK: %[[VAL_4:.*]] = arith.constant 1 : index40// CHECK: %[[VAL_5:.*]] = scf.while (%[[VAL_6:.*]] = %[[VAL_3]]) : (index) -> index {41// CHECK: %[[VAL_7:.*]] = arith.cmpi slt, %[[VAL_6]], %[[VAL_1]] : index42// CHECK: scf.condition(%[[VAL_7]]) %[[VAL_6]] : index43// CHECK: } do {44// CHECK: ^bb0(%[[VAL_8:.*]]: index):45// CHECK: %[[VAL_9:.*]] = arith.addi %[[VAL_8]], %[[VAL_4]] : index46// CHECK: %[[VAL_10:.*]] = scf.while (%[[VAL_11:.*]] = %[[VAL_3]]) : (index) -> index {47// CHECK: %[[VAL_12:.*]] = arith.cmpi slt, %[[VAL_11]], %[[VAL_1]] : index48// CHECK: scf.condition(%[[VAL_12]]) %[[VAL_11]] : index49// CHECK: } do {50// CHECK: ^bb0(%[[VAL_13:.*]]: index):51// CHECK: %[[VAL_14:.*]] = arith.addi %[[VAL_13]], %[[VAL_4]] : index52// CHECK: %[[VAL_15:.*]] = arith.addi %[[VAL_2]], %[[VAL_2]] : i3253// CHECK: memref.store %[[VAL_15]], %[[VAL_0]]{{\[}}%[[VAL_8]]] : memref<?xi32>54// CHECK: memref.store %[[VAL_15]], %[[VAL_0]]{{\[}}%[[VAL_13]]] : memref<?xi32>55// CHECK: scf.yield %[[VAL_14]] : index56// CHECK: }57// CHECK: scf.yield %[[VAL_9]] : index58// CHECK: }59// CHECK: return60// CHECK: }61func.func @nested_loop(%arg0: memref<?xi32>, %arg1: index, %arg2: i32) {62 %c0 = arith.constant 0 : index63 %c1 = arith.constant 1 : index64 scf.for %i = %c0 to %arg1 step %c1 {65 scf.for %j = %c0 to %arg1 step %c1 {66 %0 = arith.addi %arg2, %arg2 : i3267 memref.store %0, %arg0[%i] : memref<?xi32>68 memref.store %0, %arg0[%j] : memref<?xi32>69 }70 }71 return72}73 74// -----75 76// CHECK-LABEL: func @for_iter_args(77// CHECK-SAME: %[[VAL_0:.*]]: index, %[[VAL_1:.*]]: index,78// CHECK-SAME: %[[VAL_2:.*]]: index) -> f32 {79// CHECK: %[[VAL_3:.*]] = arith.constant 0.000000e+00 : f3280// CHECK: %[[VAL_4:.*]]:3 = scf.while (%[[VAL_5:.*]] = %[[VAL_0]], %[[VAL_6:.*]] = %[[VAL_3]], %[[VAL_7:.*]] = %[[VAL_3]]) : (index, f32, f32) -> (index, f32, f32) {81// CHECK: %[[VAL_8:.*]] = arith.cmpi slt, %[[VAL_5]], %[[VAL_1]] : index82// CHECK: scf.condition(%[[VAL_8]]) %[[VAL_5]], %[[VAL_6]], %[[VAL_7]] : index, f32, f3283// CHECK: } do {84// CHECK: ^bb0(%[[VAL_9:.*]]: index, %[[VAL_10:.*]]: f32, %[[VAL_11:.*]]: f32):85// CHECK: %[[VAL_12:.*]] = arith.addi %[[VAL_9]], %[[VAL_2]] : index86// CHECK: %[[VAL_13:.*]] = arith.addf %[[VAL_10]], %[[VAL_11]] : f3287// CHECK: scf.yield %[[VAL_12]], %[[VAL_13]], %[[VAL_13]] : index, f32, f3288// CHECK: }89// CHECK: return %[[VAL_14:.*]]#2 : f3290// CHECK: }91func.func @for_iter_args(%arg0 : index, %arg1: index, %arg2: index) -> f32 {92 %s0 = arith.constant 0.0 : f3293 %result:2 = scf.for %i0 = %arg0 to %arg1 step %arg2 iter_args(%iarg0 = %s0, %iarg1 = %s0) -> (f32, f32) {94 %sn = arith.addf %iarg0, %iarg1 : f3295 scf.yield %sn, %sn : f32, f3296 }97 return %result#1 : f3298}99 100// -----101 102// CHECK-LABEL: func @exec_region_multiple_yields(103// CHECK-SAME: %[[VAL_0:.*]]: i32,104// CHECK-SAME: %[[VAL_1:.*]]: index,105// CHECK-SAME: %[[VAL_2:.*]]: i32) -> i32 {106// CHECK: %[[VAL_3:.*]] = arith.constant 0 : index107// CHECK: %[[VAL_4:.*]] = arith.constant 1 : index108// CHECK: %[[VAL_5:.*]]:2 = scf.while (%[[VAL_6:.*]] = %[[VAL_3]], %[[VAL_7:.*]] = %[[VAL_0]]) : (index, i32) -> (index, i32) {109// CHECK: %[[VAL_8:.*]] = arith.cmpi slt, %[[VAL_6]], %[[VAL_1]] : index110// CHECK: scf.condition(%[[VAL_8]]) %[[VAL_6]], %[[VAL_7]] : index, i32111// CHECK: } do {112// CHECK: ^bb0(%[[VAL_9:.*]]: index, %[[VAL_10:.*]]: i32):113// CHECK: %[[VAL_11:.*]] = arith.addi %[[VAL_9]], %[[VAL_4]] : index114// CHECK: %[[VAL_12:.*]] = scf.execute_region -> i32 {115// CHECK: %[[VAL_13:.*]] = arith.cmpi slt, %[[VAL_9]], %[[VAL_4]] : index116// CHECK: cf.cond_br %[[VAL_13]], ^bb1, ^bb2117// CHECK: ^bb1:118// CHECK: %[[VAL_14:.*]] = arith.subi %[[VAL_10]], %[[VAL_0]] : i32119// CHECK: scf.yield %[[VAL_14]] : i32120// CHECK: ^bb2:121// CHECK: %[[VAL_15:.*]] = arith.muli %[[VAL_10]], %[[VAL_2]] : i32122// CHECK: scf.yield %[[VAL_15]] : i32123// CHECK: }124// CHECK: scf.yield %[[VAL_11]], %[[VAL_16:.*]] : index, i32125// CHECK: }126// CHECK: return %[[VAL_17:.*]]#1 : i32127// CHECK: }128func.func @exec_region_multiple_yields(%arg0: i32, %arg1: index, %arg2: i32) -> i32 {129 %c1_i32 = arith.constant 1 : i32130 %c2_i32 = arith.constant 2 : i32131 %c0 = arith.constant 0 : index132 %c1 = arith.constant 1 : index133 %c5 = arith.constant 5 : index134 %0 = scf.for %i = %c0 to %arg1 step %c1 iter_args(%iarg0 = %arg0) -> i32 {135 %2 = scf.execute_region -> i32 {136 %1 = arith.cmpi slt, %i, %c1 : index137 cf.cond_br %1, ^bb1, ^bb2138 ^bb1:139 %2 = arith.subi %iarg0, %arg0 : i32140 scf.yield %2 : i32141 ^bb2:142 %3 = arith.muli %iarg0, %arg2 : i32143 scf.yield %3 : i32144 }145 scf.yield %2 : i32146 }147 return %0 : i32148}149