diff options
author | Gil Rapaport <gil.rapaport@mobileye.com> | 2023-10-26 16:40:18 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-26 16:40:18 +0300 |
commit | 2633d94f289b3d5aa86a1b00591a3c755ce693fa (patch) | |
tree | cd774fe6794f7c7b2629e617bbb09784b65c0bf6 /mlir/test/Conversion/SCFToEmitC | |
parent | 585da2651ff5d3a2645aa54813fb2b7928d88f55 (diff) | |
download | llvm-2633d94f289b3d5aa86a1b00591a3c755ce693fa.zip llvm-2633d94f289b3d5aa86a1b00591a3c755ce693fa.tar.gz llvm-2633d94f289b3d5aa86a1b00591a3c755ce693fa.tar.bz2 |
[mlir][emitc] Add a structured for operation (#68206)
Add an emitc.for op to the EmitC dialect as a lowering target for
scf.for, replacing its current direct translation to C; The translator
now handles emitc.for instead.
Diffstat (limited to 'mlir/test/Conversion/SCFToEmitC')
-rw-r--r-- | mlir/test/Conversion/SCFToEmitC/for.mlir | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/mlir/test/Conversion/SCFToEmitC/for.mlir b/mlir/test/Conversion/SCFToEmitC/for.mlir new file mode 100644 index 0000000..7f90310a --- /dev/null +++ b/mlir/test/Conversion/SCFToEmitC/for.mlir @@ -0,0 +1,96 @@ +// RUN: mlir-opt -allow-unregistered-dialect -convert-scf-to-emitc %s | FileCheck %s + +func.func @simple_std_for_loop(%arg0 : index, %arg1 : index, %arg2 : index) { + scf.for %i0 = %arg0 to %arg1 step %arg2 { + %c1 = arith.constant 1 : index + } + return +} +// CHECK-LABEL: func.func @simple_std_for_loop( +// CHECK-SAME: %[[VAL_0:.*]]: index, %[[VAL_1:.*]]: index, %[[VAL_2:.*]]: index) { +// CHECK-NEXT: emitc.for %[[VAL_3:.*]] = %[[VAL_0]] to %[[VAL_1]] step %[[VAL_2]] { +// CHECK-NEXT: %[[VAL_4:.*]] = arith.constant 1 : index +// CHECK-NEXT: } +// CHECK-NEXT: return +// CHECK-NEXT: } + +func.func @simple_std_2_for_loops(%arg0 : index, %arg1 : index, %arg2 : index) { + scf.for %i0 = %arg0 to %arg1 step %arg2 { + %c1 = arith.constant 1 : index + scf.for %i1 = %arg0 to %arg1 step %arg2 { + %c1_0 = arith.constant 1 : index + } + } + return +} +// CHECK-LABEL: func.func @simple_std_2_for_loops( +// CHECK-SAME: %[[VAL_0:.*]]: index, %[[VAL_1:.*]]: index, %[[VAL_2:.*]]: index) { +// CHECK-NEXT: emitc.for %[[VAL_3:.*]] = %[[VAL_0]] to %[[VAL_1]] step %[[VAL_2]] { +// CHECK-NEXT: %[[VAL_4:.*]] = arith.constant 1 : index +// CHECK-NEXT: emitc.for %[[VAL_5:.*]] = %[[VAL_0]] to %[[VAL_1]] step %[[VAL_2]] { +// CHECK-NEXT: %[[VAL_6:.*]] = arith.constant 1 : index +// CHECK-NEXT: } +// CHECK-NEXT: } +// CHECK-NEXT: return +// CHECK-NEXT: } + +func.func @for_yield(%arg0 : index, %arg1 : index, %arg2 : index) -> (f32, f32) { + %s0 = arith.constant 0.0 : f32 + %s1 = arith.constant 1.0 : f32 + %result:2 = scf.for %i0 = %arg0 to %arg1 step %arg2 iter_args(%si = %s0, %sj = %s1) -> (f32, f32) { + %sn = arith.addf %si, %sj : f32 + scf.yield %sn, %sn : f32, f32 + } + return %result#0, %result#1 : f32, f32 +} +// CHECK-LABEL: func.func @for_yield( +// CHECK-SAME: %[[VAL_0:.*]]: index, %[[VAL_1:.*]]: index, %[[VAL_2:.*]]: index) -> (f32, f32) { +// CHECK-NEXT: %[[VAL_3:.*]] = arith.constant 0.000000e+00 : f32 +// CHECK-NEXT: %[[VAL_4:.*]] = arith.constant 1.000000e+00 : f32 +// CHECK-NEXT: %[[VAL_5:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> f32 +// CHECK-NEXT: %[[VAL_6:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> f32 +// CHECK-NEXT: %[[VAL_7:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> f32 +// CHECK-NEXT: %[[VAL_8:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> f32 +// CHECK-NEXT: emitc.assign %[[VAL_3]] : f32 to %[[VAL_7]] : f32 +// CHECK-NEXT: emitc.assign %[[VAL_4]] : f32 to %[[VAL_8]] : f32 +// CHECK-NEXT: emitc.for %[[VAL_9:.*]] = %[[VAL_0]] to %[[VAL_1]] step %[[VAL_2]] { +// CHECK-NEXT: %[[VAL_10:.*]] = arith.addf %[[VAL_7]], %[[VAL_8]] : f32 +// CHECK-NEXT: emitc.assign %[[VAL_10]] : f32 to %[[VAL_7]] : f32 +// CHECK-NEXT: emitc.assign %[[VAL_10]] : f32 to %[[VAL_8]] : f32 +// CHECK-NEXT: } +// CHECK-NEXT: emitc.assign %[[VAL_7]] : f32 to %[[VAL_5]] : f32 +// CHECK-NEXT: emitc.assign %[[VAL_8]] : f32 to %[[VAL_6]] : f32 +// CHECK-NEXT: return %[[VAL_5]], %[[VAL_6]] : f32, f32 +// CHECK-NEXT: } + +func.func @nested_for_yield(%arg0 : index, %arg1 : index, %arg2 : index) -> f32 { + %s0 = arith.constant 1.0 : f32 + %r = scf.for %i0 = %arg0 to %arg1 step %arg2 iter_args(%iter = %s0) -> (f32) { + %result = scf.for %i1 = %arg0 to %arg1 step %arg2 iter_args(%si = %iter) -> (f32) { + %sn = arith.addf %si, %si : f32 + scf.yield %sn : f32 + } + scf.yield %result : f32 + } + return %r : f32 +} +// CHECK-LABEL: func.func @nested_for_yield( +// CHECK-SAME: %[[VAL_0:.*]]: index, %[[VAL_1:.*]]: index, %[[VAL_2:.*]]: index) -> f32 { +// CHECK-NEXT: %[[VAL_3:.*]] = arith.constant 1.000000e+00 : f32 +// CHECK-NEXT: %[[VAL_4:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> f32 +// CHECK-NEXT: %[[VAL_5:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> f32 +// CHECK-NEXT: emitc.assign %[[VAL_3]] : f32 to %[[VAL_5]] : f32 +// CHECK-NEXT: emitc.for %[[VAL_6:.*]] = %[[VAL_0]] to %[[VAL_1]] step %[[VAL_2]] { +// CHECK-NEXT: %[[VAL_7:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> f32 +// CHECK-NEXT: %[[VAL_8:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> f32 +// CHECK-NEXT: emitc.assign %[[VAL_5]] : f32 to %[[VAL_8]] : f32 +// CHECK-NEXT: emitc.for %[[VAL_9:.*]] = %[[VAL_0]] to %[[VAL_1]] step %[[VAL_2]] { +// CHECK-NEXT: %[[VAL_10:.*]] = arith.addf %[[VAL_8]], %[[VAL_8]] : f32 +// CHECK-NEXT: emitc.assign %[[VAL_10]] : f32 to %[[VAL_8]] : f32 +// CHECK-NEXT: } +// CHECK-NEXT: emitc.assign %[[VAL_8]] : f32 to %[[VAL_7]] : f32 +// CHECK-NEXT: emitc.assign %[[VAL_7]] : f32 to %[[VAL_5]] : f32 +// CHECK-NEXT: } +// CHECK-NEXT: emitc.assign %[[VAL_5]] : f32 to %[[VAL_4]] : f32 +// CHECK-NEXT: return %[[VAL_4]] : f32 +// CHECK-NEXT: } |