aboutsummaryrefslogtreecommitdiff
path: root/mlir/test/Conversion/SCFToEmitC
diff options
context:
space:
mode:
authorGil Rapaport <gil.rapaport@mobileye.com>2023-09-27 22:40:15 +0300
committerGitHub <noreply@github.com>2023-09-27 22:40:15 +0300
commit126f0374cbc2110aa97e2141ac898014a8b9531a (patch)
treecb4309e70361ffe1e3279cd8b6633436a8f4c400 /mlir/test/Conversion/SCFToEmitC
parentbd675f5899922764b167491d8caea8e2f547ab85 (diff)
downloadllvm-126f0374cbc2110aa97e2141ac898014a8b9531a.zip
llvm-126f0374cbc2110aa97e2141ac898014a8b9531a.tar.gz
llvm-126f0374cbc2110aa97e2141ac898014a8b9531a.tar.bz2
Add a structured if operation (#67234)
Add an emitc.if op to the EmitC dialect. A new convert-scf-to-emitc pass replaces the existing direct translation of scf.if to C; The translator now handles emitc.if instead. The emitc.if op doesn't return any value and its then/else regions are terminated with a new scf.yield op. Values returned by scf.if are lowered using emitc.variable ops, assigned to in the then/else regions using a new emitc.assign op.
Diffstat (limited to 'mlir/test/Conversion/SCFToEmitC')
-rw-r--r--mlir/test/Conversion/SCFToEmitC/if.mlir70
1 files changed, 70 insertions, 0 deletions
diff --git a/mlir/test/Conversion/SCFToEmitC/if.mlir b/mlir/test/Conversion/SCFToEmitC/if.mlir
new file mode 100644
index 0000000..e34fd6a
--- /dev/null
+++ b/mlir/test/Conversion/SCFToEmitC/if.mlir
@@ -0,0 +1,70 @@
+// RUN: mlir-opt -allow-unregistered-dialect -convert-scf-to-emitc %s | FileCheck %s
+
+func.func @test_if(%arg0: i1, %arg1: f32) {
+ scf.if %arg0 {
+ %0 = emitc.call "func_const"(%arg1) : (f32) -> i32
+ }
+ return
+}
+// CHECK-LABEL: func.func @test_if(
+// CHECK-SAME: %[[VAL_0:.*]]: i1,
+// CHECK-SAME: %[[VAL_1:.*]]: f32) {
+// CHECK-NEXT: emitc.if %[[VAL_0]] {
+// CHECK-NEXT: %[[VAL_2:.*]] = emitc.call "func_const"(%[[VAL_1]]) : (f32) -> i32
+// CHECK-NEXT: }
+// CHECK-NEXT: return
+// CHECK-NEXT: }
+
+
+func.func @test_if_else(%arg0: i1, %arg1: f32) {
+ scf.if %arg0 {
+ %0 = emitc.call "func_true"(%arg1) : (f32) -> i32
+ } else {
+ %0 = emitc.call "func_false"(%arg1) : (f32) -> i32
+ }
+ return
+}
+// CHECK-LABEL: func.func @test_if_else(
+// CHECK-SAME: %[[VAL_0:.*]]: i1,
+// CHECK-SAME: %[[VAL_1:.*]]: f32) {
+// CHECK-NEXT: emitc.if %[[VAL_0]] {
+// CHECK-NEXT: %[[VAL_2:.*]] = emitc.call "func_true"(%[[VAL_1]]) : (f32) -> i32
+// CHECK-NEXT: } else {
+// CHECK-NEXT: %[[VAL_3:.*]] = emitc.call "func_false"(%[[VAL_1]]) : (f32) -> i32
+// CHECK-NEXT: }
+// CHECK-NEXT: return
+// CHECK-NEXT: }
+
+
+func.func @test_if_yield(%arg0: i1, %arg1: f32) {
+ %0 = arith.constant 0 : i8
+ %x, %y = scf.if %arg0 -> (i32, f64) {
+ %1 = emitc.call "func_true_1"(%arg1) : (f32) -> i32
+ %2 = emitc.call "func_true_2"(%arg1) : (f32) -> f64
+ scf.yield %1, %2 : i32, f64
+ } else {
+ %1 = emitc.call "func_false_1"(%arg1) : (f32) -> i32
+ %2 = emitc.call "func_false_2"(%arg1) : (f32) -> f64
+ scf.yield %1, %2 : i32, f64
+ }
+ return
+}
+// CHECK-LABEL: func.func @test_if_yield(
+// CHECK-SAME: %[[VAL_0:.*]]: i1,
+// CHECK-SAME: %[[VAL_1:.*]]: f32) {
+// CHECK-NEXT: %[[VAL_2:.*]] = arith.constant 0 : i8
+// CHECK-NEXT: %[[VAL_3:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> i32
+// CHECK-NEXT: %[[VAL_4:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> f64
+// CHECK-NEXT: emitc.if %[[VAL_0]] {
+// CHECK-NEXT: %[[VAL_5:.*]] = emitc.call "func_true_1"(%[[VAL_1]]) : (f32) -> i32
+// CHECK-NEXT: %[[VAL_6:.*]] = emitc.call "func_true_2"(%[[VAL_1]]) : (f32) -> f64
+// CHECK-NEXT: emitc.assign %[[VAL_5]] : i32 to %[[VAL_3]] : i32
+// CHECK-NEXT: emitc.assign %[[VAL_6]] : f64 to %[[VAL_4]] : f64
+// CHECK-NEXT: } else {
+// CHECK-NEXT: %[[VAL_7:.*]] = emitc.call "func_false_1"(%[[VAL_1]]) : (f32) -> i32
+// CHECK-NEXT: %[[VAL_8:.*]] = emitc.call "func_false_2"(%[[VAL_1]]) : (f32) -> f64
+// CHECK-NEXT: emitc.assign %[[VAL_7]] : i32 to %[[VAL_3]] : i32
+// CHECK-NEXT: emitc.assign %[[VAL_8]] : f64 to %[[VAL_4]] : f64
+// CHECK-NEXT: }
+// CHECK-NEXT: return
+// CHECK-NEXT: }