12633d94fSGil Rapaport// RUN: mlir-opt -allow-unregistered-dialect -convert-scf-to-emitc %s | FileCheck %s 22633d94fSGil Rapaport 32633d94fSGil Rapaportfunc.func @simple_std_for_loop(%arg0 : index, %arg1 : index, %arg2 : index) { 42633d94fSGil Rapaport scf.for %i0 = %arg0 to %arg1 step %arg2 { 52633d94fSGil Rapaport %c1 = arith.constant 1 : index 62633d94fSGil Rapaport } 72633d94fSGil Rapaport return 82633d94fSGil Rapaport} 92633d94fSGil Rapaport// CHECK-LABEL: func.func @simple_std_for_loop( 10d622b66aSjosel-amd// CHECK-SAME: %[[ARG_0:.*]]: index, %[[ARG_1:.*]]: index, %[[ARG_2:.*]]: index) { 11d622b66aSjosel-amd// CHECK-NEXT: %[[VAL_2:.*]] = builtin.unrealized_conversion_cast %[[ARG_2]] : index to !emitc.size_t 12d622b66aSjosel-amd// CHECK-NEXT: %[[VAL_1:.*]] = builtin.unrealized_conversion_cast %[[ARG_1]] : index to !emitc.size_t 13d622b66aSjosel-amd// CHECK-NEXT: %[[VAL_0:.*]] = builtin.unrealized_conversion_cast %[[ARG_0]] : index to !emitc.size_t 14d622b66aSjosel-amd// CHECK-NEXT: emitc.for %[[VAL_3:.*]] = %[[VAL_0]] to %[[VAL_1]] step %[[VAL_2]] : !emitc.size_t { 152633d94fSGil Rapaport// CHECK-NEXT: %[[VAL_4:.*]] = arith.constant 1 : index 162633d94fSGil Rapaport// CHECK-NEXT: } 172633d94fSGil Rapaport// CHECK-NEXT: return 182633d94fSGil Rapaport// CHECK-NEXT: } 192633d94fSGil Rapaport 202633d94fSGil Rapaportfunc.func @simple_std_2_for_loops(%arg0 : index, %arg1 : index, %arg2 : index) { 212633d94fSGil Rapaport scf.for %i0 = %arg0 to %arg1 step %arg2 { 222633d94fSGil Rapaport %c1 = arith.constant 1 : index 232633d94fSGil Rapaport scf.for %i1 = %arg0 to %arg1 step %arg2 { 242633d94fSGil Rapaport %c1_0 = arith.constant 1 : index 252633d94fSGil Rapaport } 262633d94fSGil Rapaport } 272633d94fSGil Rapaport return 282633d94fSGil Rapaport} 292633d94fSGil Rapaport// CHECK-LABEL: func.func @simple_std_2_for_loops( 30d622b66aSjosel-amd// CHECK-SAME: %[[ARG_0:.*]]: index, %[[ARG_1:.*]]: index, %[[ARG_2:.*]]: index) { 31d622b66aSjosel-amd// CHECK-NEXT: %[[VAL_2:.*]] = builtin.unrealized_conversion_cast %[[ARG_2]] : index to !emitc.size_t 32d622b66aSjosel-amd// CHECK-NEXT: %[[VAL_1:.*]] = builtin.unrealized_conversion_cast %[[ARG_1]] : index to !emitc.size_t 33d622b66aSjosel-amd// CHECK-NEXT: %[[VAL_0:.*]] = builtin.unrealized_conversion_cast %[[ARG_0]] : index to !emitc.size_t 34d622b66aSjosel-amd// CHECK-NEXT: emitc.for %[[VAL_3:.*]] = %[[VAL_0]] to %[[VAL_1]] step %[[VAL_2]] : !emitc.size_t { 352633d94fSGil Rapaport// CHECK-NEXT: %[[VAL_4:.*]] = arith.constant 1 : index 36*977d744bSKirill Chibisov// CHECK-NEXT: for %[[VAL_5:.*]] = %[[VAL_0]] to %[[VAL_1]] step %[[VAL_2]] : !emitc.size_t { 372633d94fSGil Rapaport// CHECK-NEXT: %[[VAL_6:.*]] = arith.constant 1 : index 382633d94fSGil Rapaport// CHECK-NEXT: } 392633d94fSGil Rapaport// CHECK-NEXT: } 402633d94fSGil Rapaport// CHECK-NEXT: return 412633d94fSGil Rapaport// CHECK-NEXT: } 422633d94fSGil Rapaport 432633d94fSGil Rapaportfunc.func @for_yield(%arg0 : index, %arg1 : index, %arg2 : index) -> (f32, f32) { 442633d94fSGil Rapaport %s0 = arith.constant 0.0 : f32 452633d94fSGil Rapaport %s1 = arith.constant 1.0 : f32 462633d94fSGil Rapaport %result:2 = scf.for %i0 = %arg0 to %arg1 step %arg2 iter_args(%si = %s0, %sj = %s1) -> (f32, f32) { 472633d94fSGil Rapaport %sn = arith.addf %si, %sj : f32 482633d94fSGil Rapaport scf.yield %sn, %sn : f32, f32 492633d94fSGil Rapaport } 502633d94fSGil Rapaport return %result#0, %result#1 : f32, f32 512633d94fSGil Rapaport} 522633d94fSGil Rapaport// CHECK-LABEL: func.func @for_yield( 53d622b66aSjosel-amd// CHECK-SAME: %[[ARG_0:.*]]: index, %[[ARG_1:.*]]: index, %[[ARG_2:.*]]: index) -> (f32, f32) { 54d622b66aSjosel-amd// CHECK-NEXT: %[[VAL_2:.*]] = builtin.unrealized_conversion_cast %[[ARG_2]] : index to !emitc.size_t 55d622b66aSjosel-amd// CHECK-NEXT: %[[VAL_1:.*]] = builtin.unrealized_conversion_cast %[[ARG_1]] : index to !emitc.size_t 56d622b66aSjosel-amd// CHECK-NEXT: %[[VAL_0:.*]] = builtin.unrealized_conversion_cast %[[ARG_0]] : index to !emitc.size_t 572633d94fSGil Rapaport// CHECK-NEXT: %[[VAL_3:.*]] = arith.constant 0.000000e+00 : f32 582633d94fSGil Rapaport// CHECK-NEXT: %[[VAL_4:.*]] = arith.constant 1.000000e+00 : f32 59e47b5075SSimon Camphausen// CHECK-NEXT: %[[VAL_5:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> !emitc.lvalue<f32> 60e47b5075SSimon Camphausen// CHECK-NEXT: %[[VAL_6:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> !emitc.lvalue<f32> 61e47b5075SSimon Camphausen// CHECK-NEXT: emitc.assign %[[VAL_3]] : f32 to %[[VAL_5]] : <f32> 62e47b5075SSimon Camphausen// CHECK-NEXT: emitc.assign %[[VAL_4]] : f32 to %[[VAL_6]] : <f32> 63d622b66aSjosel-amd// CHECK-NEXT: emitc.for %[[VAL_7:.*]] = %[[VAL_0]] to %[[VAL_1]] step %[[VAL_2]] : !emitc.size_t { 64*977d744bSKirill Chibisov// CHECK-NEXT: %[[VAL_8:.*]] = load %[[VAL_5]] : <f32> 65*977d744bSKirill Chibisov// CHECK-NEXT: %[[VAL_9:.*]] = load %[[VAL_6]] : <f32> 66e47b5075SSimon Camphausen// CHECK-NEXT: %[[VAL_10:.*]] = arith.addf %[[VAL_8]], %[[VAL_9]] : f32 67*977d744bSKirill Chibisov// CHECK-NEXT: assign %[[VAL_10]] : f32 to %[[VAL_5]] : <f32> 68*977d744bSKirill Chibisov// CHECK-NEXT: assign %[[VAL_10]] : f32 to %[[VAL_6]] : <f32> 692633d94fSGil Rapaport// CHECK-NEXT: } 70e47b5075SSimon Camphausen// CHECK-NEXT: %[[VAL_11:.*]] = emitc.load %[[VAL_5]] : <f32> 71e47b5075SSimon Camphausen// CHECK-NEXT: %[[VAL_12:.*]] = emitc.load %[[VAL_6]] : <f32> 72e47b5075SSimon Camphausen// CHECK-NEXT: return %[[VAL_11]], %[[VAL_12]] : f32, f32 732633d94fSGil Rapaport// CHECK-NEXT: } 742633d94fSGil Rapaport 752633d94fSGil Rapaportfunc.func @nested_for_yield(%arg0 : index, %arg1 : index, %arg2 : index) -> f32 { 762633d94fSGil Rapaport %s0 = arith.constant 1.0 : f32 772633d94fSGil Rapaport %r = scf.for %i0 = %arg0 to %arg1 step %arg2 iter_args(%iter = %s0) -> (f32) { 782633d94fSGil Rapaport %result = scf.for %i1 = %arg0 to %arg1 step %arg2 iter_args(%si = %iter) -> (f32) { 792633d94fSGil Rapaport %sn = arith.addf %si, %si : f32 802633d94fSGil Rapaport scf.yield %sn : f32 812633d94fSGil Rapaport } 822633d94fSGil Rapaport scf.yield %result : f32 832633d94fSGil Rapaport } 842633d94fSGil Rapaport return %r : f32 852633d94fSGil Rapaport} 862633d94fSGil Rapaport// CHECK-LABEL: func.func @nested_for_yield( 87d622b66aSjosel-amd// CHECK-SAME: %[[ARG_0:.*]]: index, %[[ARG_1:.*]]: index, %[[ARG_2:.*]]: index) -> f32 { 88d622b66aSjosel-amd// CHECK-NEXT: %[[VAL_2:.*]] = builtin.unrealized_conversion_cast %[[ARG_2]] : index to !emitc.size_t 89d622b66aSjosel-amd// CHECK-NEXT: %[[VAL_1:.*]] = builtin.unrealized_conversion_cast %[[ARG_1]] : index to !emitc.size_t 90d622b66aSjosel-amd// CHECK-NEXT: %[[VAL_0:.*]] = builtin.unrealized_conversion_cast %[[ARG_0]] : index to !emitc.size_t 912633d94fSGil Rapaport// CHECK-NEXT: %[[VAL_3:.*]] = arith.constant 1.000000e+00 : f32 92e47b5075SSimon Camphausen// CHECK-NEXT: %[[VAL_4:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> !emitc.lvalue<f32> 93e47b5075SSimon Camphausen// CHECK-NEXT: emitc.assign %[[VAL_3]] : f32 to %[[VAL_4]] : <f32> 94d622b66aSjosel-amd// CHECK-NEXT: emitc.for %[[VAL_5:.*]] = %[[VAL_0]] to %[[VAL_1]] step %[[VAL_2]] : !emitc.size_t { 95*977d744bSKirill Chibisov// CHECK-NEXT: %[[VAL_6:.*]] = load %[[VAL_4]] : <f32> 96e47b5075SSimon Camphausen// CHECK-NEXT: %[[VAL_7:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> !emitc.lvalue<f32> 97*977d744bSKirill Chibisov// CHECK-NEXT: assign %[[VAL_6]] : f32 to %[[VAL_7]] : <f32> 98*977d744bSKirill Chibisov// CHECK-NEXT: for %[[VAL_8:.*]] = %[[VAL_0]] to %[[VAL_1]] step %[[VAL_2]] : !emitc.size_t { 99*977d744bSKirill Chibisov// CHECK-NEXT: %[[VAL_9:.*]] = load %[[VAL_7]] : <f32> 100e47b5075SSimon Camphausen// CHECK-NEXT: %[[VAL_10:.*]] = arith.addf %[[VAL_9]], %[[VAL_9]] : f32 101*977d744bSKirill Chibisov// CHECK-NEXT: assign %[[VAL_10]] : f32 to %[[VAL_7]] : <f32> 1022633d94fSGil Rapaport// CHECK-NEXT: } 103*977d744bSKirill Chibisov// CHECK-NEXT: %[[VAL_11:.*]] = load %[[VAL_7]] : <f32> 104*977d744bSKirill Chibisov// CHECK-NEXT: assign %[[VAL_11]] : f32 to %[[VAL_4]] : <f32> 1052633d94fSGil Rapaport// CHECK-NEXT: } 106e47b5075SSimon Camphausen// CHECK-NEXT: %[[VAL_12:.*]] = emitc.load %[[VAL_4]] : <f32> 107e47b5075SSimon Camphausen// CHECK-NEXT: return %[[VAL_12]] : f32 1082633d94fSGil Rapaport// CHECK-NEXT: } 109d622b66aSjosel-amd 110d622b66aSjosel-amdfunc.func @for_yield_index(%arg0 : index, %arg1 : index, %arg2 : index) -> index { 111d622b66aSjosel-amd %zero = arith.constant 0 : index 112d622b66aSjosel-amd %r = scf.for %i0 = %arg0 to %arg1 step %arg2 iter_args(%acc = %zero) -> index { 113d622b66aSjosel-amd scf.yield %acc : index 114d622b66aSjosel-amd } 115d622b66aSjosel-amd return %r : index 116d622b66aSjosel-amd} 117d622b66aSjosel-amd 118d622b66aSjosel-amd// CHECK-LABEL: func.func @for_yield_index( 119d622b66aSjosel-amd// CHECK-SAME: %[[ARG_0:.*]]: index, %[[ARG_1:.*]]: index, %[[ARG_2:.*]]: index) -> index { 120d622b66aSjosel-amd// CHECK: %[[VAL_0:.*]] = builtin.unrealized_conversion_cast %[[ARG_2]] : index to !emitc.size_t 121d622b66aSjosel-amd// CHECK: %[[VAL_1:.*]] = builtin.unrealized_conversion_cast %[[ARG_1]] : index to !emitc.size_t 122d622b66aSjosel-amd// CHECK: %[[VAL_2:.*]] = builtin.unrealized_conversion_cast %[[ARG_0]] : index to !emitc.size_t 123d622b66aSjosel-amd// CHECK: %[[C0:.*]] = arith.constant 0 : index 124d622b66aSjosel-amd// CHECK: %[[VAL_3:.*]] = builtin.unrealized_conversion_cast %[[C0]] : index to !emitc.size_t 125d622b66aSjosel-amd// CHECK: %[[VAL_4:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> !emitc.lvalue<!emitc.size_t> 126d622b66aSjosel-amd// CHECK: emitc.assign %[[VAL_3]] : !emitc.size_t to %[[VAL_4]] : <!emitc.size_t> 127d622b66aSjosel-amd// CHECK: emitc.for %[[VAL_5:.*]] = %[[VAL_2]] to %[[VAL_1]] step %[[VAL_0]] : !emitc.size_t { 128*977d744bSKirill Chibisov// CHECK: %[[V:.*]] = load %[[VAL_4]] : <!emitc.size_t> 129*977d744bSKirill Chibisov// CHECK: assign %[[V]] : !emitc.size_t to %[[VAL_4]] : <!emitc.size_t> 130d622b66aSjosel-amd// CHECK: } 131d622b66aSjosel-amd// CHECK: %[[V2:.*]] = emitc.load %[[VAL_4]] : <!emitc.size_t> 132d622b66aSjosel-amd// CHECK: %[[VAL_8:.*]] = builtin.unrealized_conversion_cast %[[V2]] : !emitc.size_t to index 133d622b66aSjosel-amd// CHECK: return %[[VAL_8]] : index 134d622b66aSjosel-amd// CHECK: } 135d622b66aSjosel-amd 136d622b66aSjosel-amd 137d622b66aSjosel-amdfunc.func @for_yield_update_loop_carried_var(%arg0 : index, %arg1 : index, %arg2 : index) -> index { 138d622b66aSjosel-amd %zero = arith.constant 0 : index 139d622b66aSjosel-amd %r = scf.for %i0 = %arg0 to %arg1 step %arg2 iter_args(%acc = %zero) -> index { 140d622b66aSjosel-amd %sn = arith.addi %acc, %acc : index 141d622b66aSjosel-amd scf.yield %sn: index 142d622b66aSjosel-amd } 143d622b66aSjosel-amd return %r : index 144d622b66aSjosel-amd } 145d622b66aSjosel-amd 146d622b66aSjosel-amd// CHECK-LABEL: func.func @for_yield_update_loop_carried_var( 147d622b66aSjosel-amd// CHECK-SAME: %[[ARG_0:.*]]: index, %[[ARG_1:.*]]: index, %[[ARG_2:.*]]: index) -> index { 148d622b66aSjosel-amd// CHECK: %[[VAL_0:.*]] = builtin.unrealized_conversion_cast %[[ARG_2]] : index to !emitc.size_t 149d622b66aSjosel-amd// CHECK: %[[VAL_1:.*]] = builtin.unrealized_conversion_cast %[[ARG_1]] : index to !emitc.size_t 150d622b66aSjosel-amd// CHECK: %[[VAL_2:.*]] = builtin.unrealized_conversion_cast %[[ARG_0]] : index to !emitc.size_t 151d622b66aSjosel-amd// CHECK: %[[C0:.*]] = arith.constant 0 : index 152d622b66aSjosel-amd// CHECK: %[[VAL_3:.*]] = builtin.unrealized_conversion_cast %[[C0]] : index to !emitc.size_t 153d622b66aSjosel-amd// CHECK: %[[VAL_4:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> !emitc.lvalue<!emitc.size_t> 154d622b66aSjosel-amd// CHECK: emitc.assign %[[VAL_3]] : !emitc.size_t to %[[VAL_4]] : <!emitc.size_t> 155d622b66aSjosel-amd// CHECK: emitc.for %[[ARG_3:.*]] = %[[VAL_2]] to %[[VAL_1]] step %[[VAL_0]] : !emitc.size_t { 156*977d744bSKirill Chibisov// CHECK: %[[V:.*]] = load %[[VAL_4]] : <!emitc.size_t> 157d622b66aSjosel-amd// CHECK: %[[VAL_5:.*]] = builtin.unrealized_conversion_cast %[[V]] : !emitc.size_t to index 158d622b66aSjosel-amd// CHECK: %[[VAL_6:.*]] = arith.addi %[[VAL_5]], %[[VAL_5]] : index 159d622b66aSjosel-amd// CHECK: %[[VAL_8:.*]] = builtin.unrealized_conversion_cast %[[VAL_6]] : index to !emitc.size_t 160*977d744bSKirill Chibisov// CHECK: assign %[[VAL_8]] : !emitc.size_t to %[[VAL_4]] : <!emitc.size_t> 161d622b66aSjosel-amd// CHECK: } 162d622b66aSjosel-amd// CHECK: %[[V2:.*]] = emitc.load %[[VAL_4]] : <!emitc.size_t> 163d622b66aSjosel-amd// CHECK: %[[VAL_9:.*]] = builtin.unrealized_conversion_cast %[[V2]] : !emitc.size_t to index 164d622b66aSjosel-amd// CHECK: return %[[VAL_9]] : index 165d622b66aSjosel-amd// CHECK: } 166