diff --git a/mlir/test/Dialect/EmitC/attrs.mlir b/mlir/test/Dialect/EmitC/attrs.mlir index 11251b88ff0c9..5a219c462678e 100644 --- a/mlir/test/Dialect/EmitC/attrs.mlir +++ b/mlir/test/Dialect/EmitC/attrs.mlir @@ -1,6 +1,6 @@ -// RUN: mlir-opt -verify-diagnostics %s | FileCheck %s +// RUN: mlir-opt %s | FileCheck %s // check parser -// RUN: mlir-opt -verify-diagnostics %s | mlir-opt -verify-diagnostics | FileCheck %s +// RUN: mlir-opt %s | mlir-opt | FileCheck %s // CHECK-LABEL: func @opaque_attrs() { func.func @opaque_attrs() { diff --git a/mlir/test/Dialect/EmitC/transforms.mlir b/mlir/test/Dialect/EmitC/form-expressions.mlir similarity index 98% rename from mlir/test/Dialect/EmitC/transforms.mlir rename to mlir/test/Dialect/EmitC/form-expressions.mlir index a38f396dad953..1ac053bf1215f 100644 --- a/mlir/test/Dialect/EmitC/transforms.mlir +++ b/mlir/test/Dialect/EmitC/form-expressions.mlir @@ -1,4 +1,4 @@ -// RUN: mlir-opt %s --form-expressions --verify-diagnostics --split-input-file | FileCheck %s +// RUN: mlir-opt %s -form-expressions | FileCheck %s // CHECK-LABEL: func.func @single_expression( // CHECK-SAME: %[[VAL_0:.*]]: i32, %[[VAL_1:.*]]: i32, %[[VAL_2:.*]]: i32, %[[VAL_3:.*]]: i32) -> i1 { @@ -83,7 +83,6 @@ func.func @expression_with_dereference(%arg0: i32, %arg1: i32, %arg2: !emitc.ptr return %c : i1 } - // CHECK-LABEL: func.func @expression_with_address_taken( // CHECK-SAME: %[[VAL_0:.*]]: i32, %[[VAL_1:.*]]: i32, %[[VAL_2:.*]]: !emitc.ptr) -> i1 { // CHECK: %[[VAL_3:.*]] = "emitc.variable"() <{value = #emitc.opaque<"">}> : () -> !emitc.lvalue @@ -121,9 +120,8 @@ func.func @no_nested_expression(%arg0: i32, %arg1: i32) -> i1 { return %a : i1 } - // CHECK-LABEL: func.func @single_result_requirement -// CHECK-NOT: emitc.expression +// CHECK-NOT: emitc.expression func.func @single_result_requirement() -> (i32, i32) { %0:2 = emitc.call_opaque "foo" () : () -> (i32, i32) @@ -152,7 +150,6 @@ func.func @single_result_requirement() -> (i32, i32) { // CHECK: return %[[VAL_9]] : i1 // CHECK: } - func.func @expression_with_load(%arg0: i32, %arg1: !emitc.ptr) -> i1 { %c0 = "emitc.constant"() {value = 0 : i64} : () -> i64 %0 = "emitc.variable"() <{value = #emitc.opaque<"42">}> : () -> !emitc.lvalue diff --git a/mlir/test/Dialect/EmitC/ops.mlir b/mlir/test/Dialect/EmitC/ops.mlir index ad40313f95df9..acee0a8d53fe4 100644 --- a/mlir/test/Dialect/EmitC/ops.mlir +++ b/mlir/test/Dialect/EmitC/ops.mlir @@ -310,3 +310,15 @@ func.func @switch() { return } + +emitc.class final @finalClass { + emitc.field @fieldName0 : !emitc.array<1xf32> + emitc.field @fieldName1 : !emitc.array<1xf32> + emitc.func @execute() { + %0 = "emitc.constant"() <{value = 0 : index}> : () -> !emitc.size_t + %1 = get_field @fieldName0 : !emitc.array<1xf32> + %2 = get_field @fieldName1 : !emitc.array<1xf32> + %3 = subscript %1[%0] : (!emitc.array<1xf32>, !emitc.size_t) -> !emitc.lvalue + return + } +} diff --git a/mlir/test/Dialect/EmitC/types.mlir b/mlir/test/Dialect/EmitC/types.mlir index d4dd94457f39b..ce1e03a83e5d1 100644 --- a/mlir/test/Dialect/EmitC/types.mlir +++ b/mlir/test/Dialect/EmitC/types.mlir @@ -1,6 +1,6 @@ -// RUN: mlir-opt -verify-diagnostics -allow-unregistered-dialect %s | FileCheck %s -// check parser -// RUN: mlir-opt -verify-diagnostics -allow-unregistered-dialect %s | mlir-opt -verify-diagnostics --allow-unregistered-dialect | FileCheck %s +// RUN: mlir-opt %s -allow-unregistered-dialect | FileCheck %s +// Check parser +// RUN: mlir-opt %s -allow-unregistered-dialect | mlir-opt -allow-unregistered-dialect | FileCheck %s // CHECK-LABEL: func @array_types( func.func @array_types( diff --git a/mlir/test/Dialect/EmitC/wrap-func-in-class.mlir b/mlir/test/Dialect/EmitC/wrap-func-in-class.mlir new file mode 100644 index 0000000000000..809febd0267b1 --- /dev/null +++ b/mlir/test/Dialect/EmitC/wrap-func-in-class.mlir @@ -0,0 +1,57 @@ +// RUN: mlir-opt %s -wrap-emitc-func-in-class -split-input-file | FileCheck %s + +emitc.func @foo(%arg0 : !emitc.array<1xf32>) { + emitc.call_opaque "bar" (%arg0) : (!emitc.array<1xf32>) -> () + emitc.return +} + +// CHECK: module { +// CHECK: emitc.class @fooClass { +// CHECK: emitc.field @fieldName0 : !emitc.array<1xf32> +// CHECK: emitc.func @execute() { +// CHECK: %0 = get_field @fieldName0 : !emitc.array<1xf32> +// CHECK: call_opaque "bar"(%0) : (!emitc.array<1xf32>) -> () +// CHECK: return +// CHECK: } +// CHECK: } +// CHECK: } + +// ----- + +module attributes { } { + emitc.func @model(%arg0: !emitc.array<1xf32> {emitc.name_hint = "another_feature"}, + %arg1: !emitc.array<1xf32> {emitc.name_hint = "some_feature"}, + %arg2: !emitc.array<1xf32> {emitc.name_hint = "output_0"}) attributes { } { + %0 = "emitc.constant"() <{value = 0 : index}> : () -> !emitc.size_t + %1 = subscript %arg1[%0] : (!emitc.array<1xf32>, !emitc.size_t) -> !emitc.lvalue + %2 = load %1 : + %3 = subscript %arg0[%0] : (!emitc.array<1xf32>, !emitc.size_t) -> !emitc.lvalue + %4 = load %3 : + %5 = add %2, %4 : (f32, f32) -> f32 + %6 = subscript %arg2[%0] : (!emitc.array<1xf32>, !emitc.size_t) -> !emitc.lvalue + assign %5 : f32 to %6 : + return + } +} + +// CHECK: module { +// CHECK: emitc.class @modelClass { +// CHECK: emitc.field @fieldName0 : !emitc.array<1xf32> {emitc.name_hint = "another_feature"} +// CHECK: emitc.field @fieldName1 : !emitc.array<1xf32> {emitc.name_hint = "some_feature"} +// CHECK: emitc.field @fieldName2 : !emitc.array<1xf32> {emitc.name_hint = "output_0"} +// CHECK: emitc.func @execute() { +// CHECK: get_field @fieldName0 : !emitc.array<1xf32> +// CHECK: get_field @fieldName1 : !emitc.array<1xf32> +// CHECK: get_field @fieldName2 : !emitc.array<1xf32> +// CHECK: "emitc.constant"() <{value = 0 : index}> : () -> !emitc.size_t +// CHECK: subscript {{.*}}[{{.*}}] : (!emitc.array<1xf32>, !emitc.size_t) -> !emitc.lvalue +// CHECK: load {{.*}} : +// CHECK: subscript {{.*}}[{{.*}}] : (!emitc.array<1xf32>, !emitc.size_t) -> !emitc.lvalue +// CHECK: load {{.*}} : +// CHECK: add {{.*}}, {{.*}} : (f32, f32) -> f32 +// CHECK: subscript {{.*}}[{{.*}}] : (!emitc.array<1xf32>, !emitc.size_t) -> !emitc.lvalue +// CHECK: assign {{.*}} : f32 to {{.*}} : +// CHECK: return +// CHECK: } +// CHECK: } +// CHECK: } diff --git a/mlir/test/Dialect/EmitC/wrap_emitc_func_in_class.mlir b/mlir/test/Dialect/EmitC/wrap_emitc_func_in_class.mlir deleted file mode 100644 index 029fa78a3f528..0000000000000 --- a/mlir/test/Dialect/EmitC/wrap_emitc_func_in_class.mlir +++ /dev/null @@ -1,40 +0,0 @@ -// RUN: mlir-opt --wrap-emitc-func-in-class %s | FileCheck %s - -module attributes { } { - emitc.func @model(%arg0: !emitc.array<1xf32> {emitc.name_hint = "another_feature"}, - %arg1: !emitc.array<1xf32> {emitc.name_hint = "some_feature"}, - %arg2: !emitc.array<1xf32> {emitc.name_hint = "output_0"}) attributes { } { - %0 = "emitc.constant"() <{value = 0 : index}> : () -> !emitc.size_t - %1 = subscript %arg1[%0] : (!emitc.array<1xf32>, !emitc.size_t) -> !emitc.lvalue - %2 = load %1 : - %3 = subscript %arg0[%0] : (!emitc.array<1xf32>, !emitc.size_t) -> !emitc.lvalue - %4 = load %3 : - %5 = add %2, %4 : (f32, f32) -> f32 - %6 = subscript %arg2[%0] : (!emitc.array<1xf32>, !emitc.size_t) -> !emitc.lvalue - assign %5 : f32 to %6 : - return - } -} - - -// CHECK: module { -// CHECK-NEXT: emitc.class @modelClass { -// CHECK-NEXT: emitc.field @fieldName0 : !emitc.array<1xf32> {emitc.name_hint = "another_feature"} -// CHECK-NEXT: emitc.field @fieldName1 : !emitc.array<1xf32> {emitc.name_hint = "some_feature"} -// CHECK-NEXT: emitc.field @fieldName2 : !emitc.array<1xf32> {emitc.name_hint = "output_0"} -// CHECK-NEXT: emitc.func @execute() { -// CHECK-NEXT: get_field @fieldName0 : !emitc.array<1xf32> -// CHECK-NEXT: get_field @fieldName1 : !emitc.array<1xf32> -// CHECK-NEXT: get_field @fieldName2 : !emitc.array<1xf32> -// CHECK-NEXT: "emitc.constant"() <{value = 0 : index}> : () -> !emitc.size_t -// CHECK-NEXT: subscript {{.*}}[{{.*}}] : (!emitc.array<1xf32>, !emitc.size_t) -> !emitc.lvalue -// CHECK-NEXT: load {{.*}} : -// CHECK-NEXT: subscript {{.*}}[{{.*}}] : (!emitc.array<1xf32>, !emitc.size_t) -> !emitc.lvalue -// CHECK-NEXT: load {{.*}} : -// CHECK-NEXT: add {{.*}}, {{.*}} : (f32, f32) -> f32 -// CHECK-NEXT: subscript {{.*}}[{{.*}}] : (!emitc.array<1xf32>, !emitc.size_t) -> !emitc.lvalue -// CHECK-NEXT: assign {{.*}} : f32 to {{.*}} : -// CHECK-NEXT: return -// CHECK-NEXT: } -// CHECK-NEXT: } -// CHECK-NEXT: } diff --git a/mlir/test/Dialect/EmitC/wrap_emitc_func_in_class_noAttr.mlir b/mlir/test/Dialect/EmitC/wrap_emitc_func_in_class_noAttr.mlir deleted file mode 100644 index 92ed20c4b14e3..0000000000000 --- a/mlir/test/Dialect/EmitC/wrap_emitc_func_in_class_noAttr.mlir +++ /dev/null @@ -1,17 +0,0 @@ -// RUN: mlir-opt --wrap-emitc-func-in-class %s | FileCheck %s - -emitc.func @foo(%arg0 : !emitc.array<1xf32>) { - emitc.call_opaque "bar" (%arg0) : (!emitc.array<1xf32>) -> () - emitc.return -} - -// CHECK: module { -// CHECK-NEXT: emitc.class @fooClass { -// CHECK-NEXT: emitc.field @fieldName0 : !emitc.array<1xf32> -// CHECK-NEXT: emitc.func @execute() { -// CHECK-NEXT: %0 = get_field @fieldName0 : !emitc.array<1xf32> -// CHECK-NEXT: call_opaque "bar"(%0) : (!emitc.array<1xf32>) -> () -// CHECK-NEXT: return -// CHECK-NEXT: } -// CHECK-NEXT: } -// CHECK-NEXT: } diff --git a/mlir/test/Target/Cpp/class.mlir b/mlir/test/Target/Cpp/class.mlir new file mode 100644 index 0000000000000..32c6699f3f666 --- /dev/null +++ b/mlir/test/Target/Cpp/class.mlir @@ -0,0 +1,78 @@ +// RUN: mlir-translate -mlir-to-cpp %s | FileCheck %s + +emitc.class @modelClass { + emitc.field @fieldName0 : !emitc.array<1xf32> + emitc.field @fieldName1 : !emitc.array<1xf32> + emitc.func @execute() { + %0 = "emitc.constant"() <{value = 0 : index}> : () -> !emitc.size_t + %1 = get_field @fieldName0 : !emitc.array<1xf32> + %2 = get_field @fieldName1 : !emitc.array<1xf32> + %3 = subscript %1[%0] : (!emitc.array<1xf32>, !emitc.size_t) -> !emitc.lvalue + return + } +} + +// CHECK-LABEL: class modelClass { +// CHECK-NEXT: public: +// CHECK-NEXT: float fieldName0[1]; +// CHECK-NEXT: float fieldName1[1]; +// CHECK-NEXT: void execute() { +// CHECK-NEXT: size_t v1 = 0; +// CHECK-NEXT: return; +// CHECK-NEXT: } +// CHECK-NEXT: }; + +emitc.class final @finalClass { + emitc.field @fieldName0 : !emitc.array<1xf32> + emitc.field @fieldName1 : !emitc.array<1xf32> + emitc.func @execute() { + %0 = "emitc.constant"() <{value = 0 : index}> : () -> !emitc.size_t + %1 = get_field @fieldName0 : !emitc.array<1xf32> + %2 = get_field @fieldName1 : !emitc.array<1xf32> + %3 = subscript %1[%0] : (!emitc.array<1xf32>, !emitc.size_t) -> !emitc.lvalue + return + } +} + +// CHECK-LABEL: class finalClass final { +// CHECK-NEXT: public: +// CHECK-NEXT: float fieldName0[1]; +// CHECK-NEXT: float fieldName1[1]; +// CHECK-NEXT: void execute() { +// CHECK-NEXT: size_t v1 = 0; +// CHECK-NEXT: return; +// CHECK-NEXT: } +// CHECK-NEXT: }; + +emitc.class @mainClass { + emitc.field @fieldName0 : !emitc.array<2xf32> = dense<0.0> {attrs = {emitc.name_hint = "another_feature"}} + emitc.func @get_fieldName0() { + %0 = emitc.get_field @fieldName0 : !emitc.array<2xf32> + return + } +} + +// CHECK-LABEL: class mainClass { +// CHECK-NEXT: public: +// CHECK-NEXT: float fieldName0[2] = {0.0e+00f, 0.0e+00f}; +// CHECK-NEXT: void get_fieldName0() { +// CHECK-NEXT: return; +// CHECK-NEXT: } +// CHECK-NEXT: }; + +emitc.class @reflectionClass { + emitc.field @reflectionMap : !emitc.opaque<"const std::map"> = #emitc.opaque<"{ { \22another_feature\22, \22fieldName0\22 } }"> + emitc.func @get_reflectionMap() { + %0 = emitc.get_field @reflectionMap : !emitc.opaque<"const std::map"> + return + } +} + +// CHECK-LABEL: class reflectionClass { +// CHECK-NEXT: public: +// CHECK-NEXT: const std::map reflectionMap = { { "another_feature", "fieldName0" } }; +// CHECK-NEXT: void get_reflectionMap() { +// CHECK-NEXT: return; +// CHECK-NEXT: } +// CHECK-NEXT: }; + diff --git a/mlir/test/mlir-translate/emitc_classops.mlir b/mlir/test/mlir-translate/emitc_classops.mlir deleted file mode 100644 index d880f9b16dfc6..0000000000000 --- a/mlir/test/mlir-translate/emitc_classops.mlir +++ /dev/null @@ -1,78 +0,0 @@ -// RUN: mlir-translate --mlir-to-cpp %s | FileCheck %s - -emitc.class @modelClass { - emitc.field @fieldName0 : !emitc.array<1xf32> - emitc.field @fieldName1 : !emitc.array<1xf32> - emitc.func @execute() { - %0 = "emitc.constant"() <{value = 0 : index}> : () -> !emitc.size_t - %1 = get_field @fieldName0 : !emitc.array<1xf32> - %2 = get_field @fieldName1 : !emitc.array<1xf32> - %3 = subscript %1[%0] : (!emitc.array<1xf32>, !emitc.size_t) -> !emitc.lvalue - return - } -} - -// CHECK-LABEL: class modelClass { -// CHECK-NEXT: public: -// CHECK-NEXT: float fieldName0[1]; -// CHECK-NEXT: float fieldName1[1]; -// CHECK-NEXT: void execute() { -// CHECK-NEXT: size_t v1 = 0; -// CHECK-NEXT: return; -// CHECK-NEXT: } -// CHECK-NEXT: }; - -emitc.class final @finalClass { - emitc.field @fieldName0 : !emitc.array<1xf32> - emitc.field @fieldName1 : !emitc.array<1xf32> - emitc.func @execute() { - %0 = "emitc.constant"() <{value = 0 : index}> : () -> !emitc.size_t - %1 = get_field @fieldName0 : !emitc.array<1xf32> - %2 = get_field @fieldName1 : !emitc.array<1xf32> - %3 = subscript %1[%0] : (!emitc.array<1xf32>, !emitc.size_t) -> !emitc.lvalue - return - } -} - -// CHECK-LABEL: class finalClass final { -// CHECK-NEXT: public: -// CHECK-NEXT: float fieldName0[1]; -// CHECK-NEXT: float fieldName1[1]; -// CHECK-NEXT: void execute() { -// CHECK-NEXT: size_t v1 = 0; -// CHECK-NEXT: return; -// CHECK-NEXT: } -// CHECK-NEXT: }; - -emitc.class @mainClass { - emitc.field @fieldName0 : !emitc.array<2xf32> = dense<0.0> {attrs = {emitc.name_hint = "another_feature"}} - emitc.func @get_fieldName0() { - %0 = emitc.get_field @fieldName0 : !emitc.array<2xf32> - return - } -} - -// CHECK-LABEL: class mainClass { -// CHECK-NEXT: public: -// CHECK-NEXT: float fieldName0[2] = {0.0e+00f, 0.0e+00f}; -// CHECK-NEXT: void get_fieldName0() { -// CHECK-NEXT: return; -// CHECK-NEXT: } -// CHECK-NEXT: }; - -emitc.class @reflectionClass { - emitc.field @reflectionMap : !emitc.opaque<"const std::map"> = #emitc.opaque<"{ { \22another_feature\22, \22fieldName0\22 } }"> - emitc.func @get_reflectionMap() { - %0 = emitc.get_field @reflectionMap : !emitc.opaque<"const std::map"> - return - } -} - -// CHECK-LABEL: class reflectionClass { -// CHECK-NEXT: public: -// CHECK-NEXT: const std::map reflectionMap = { { "another_feature", "fieldName0" } }; -// CHECK-NEXT: void get_reflectionMap() { -// CHECK-NEXT: return; -// CHECK-NEXT: } -// CHECK-NEXT: }; -