xref: /llvm-project/mlir/test/Conversion/SCFToEmitC/for.mlir (revision 977d744b21d06415ac872258bf86e026d8eb487f)
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