diff options
author | Gil Rapaport <gil.rapaport@mobileye.com> | 2023-09-27 22:40:15 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-09-27 22:40:15 +0300 |
commit | 126f0374cbc2110aa97e2141ac898014a8b9531a (patch) | |
tree | cb4309e70361ffe1e3279cd8b6633436a8f4c400 /mlir/test/Conversion/SCFToEmitC | |
parent | bd675f5899922764b167491d8caea8e2f547ab85 (diff) | |
download | llvm-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.mlir | 70 |
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: } |