From fe28323b19ef727e20eacd6115f77889426c65ca Mon Sep 17 00:00:00 2001 From: Jaddyen Date: Thu, 31 Jul 2025 02:29:35 +0000 Subject: [PATCH 1/6] Correct way to emit fields --- mlir/include/mlir/Dialect/EmitC/IR/EmitC.td | 12 ++++- mlir/lib/Dialect/EmitC/IR/EmitC.cpp | 39 ++++++++++++++++ .../EmitC/Transforms/WrapFuncInClass.cpp | 2 +- mlir/lib/Target/Cpp/TranslateToCpp.cpp | 44 +++++++++---------- .../EmitC/wrap_emitc_func_in_class.mlir | 6 +-- mlir/test/mlir-translate/emitc_classops.mlir | 29 ++++++++---- 6 files changed, 95 insertions(+), 37 deletions(-) diff --git a/mlir/include/mlir/Dialect/EmitC/IR/EmitC.td b/mlir/include/mlir/Dialect/EmitC/IR/EmitC.td index 7fe2da8f7e044..f06a24c61454a 100644 --- a/mlir/include/mlir/Dialect/EmitC/IR/EmitC.td +++ b/mlir/include/mlir/Dialect/EmitC/IR/EmitC.td @@ -1659,13 +1659,23 @@ def EmitC_FieldOp : EmitC_Op<"field", [Symbol]> { emitc.field @fieldName0 : !emitc.array<1xf32> {emitc.opaque = "another_feature"} // Example with no attribute: emitc.field @fieldName0 : !emitc.array<1xf32> + // Example with an initial value: + emitc.field @fieldName0 : !emitc.array<1xf32> = dense<0.0> + // Example with an initial value and attributes: + emitc.field @fieldName0 : !emitc.array<1xf32> = dense<0.0> { + emitc.opaque = "input_tensor"} ``` }]; let arguments = (ins SymbolNameAttr:$sym_name, TypeAttr:$type, + OptionalAttr:$initial_value, OptionalAttr:$attrs); - let assemblyFormat = [{ $sym_name `:` $type ($attrs^)? attr-dict}]; + let assemblyFormat = [{ + $sym_name + `:` custom($type, $initial_value) + attr-dict + }]; let hasVerifier = 1; } diff --git a/mlir/lib/Dialect/EmitC/IR/EmitC.cpp b/mlir/lib/Dialect/EmitC/IR/EmitC.cpp index 4c0902293cbf9..0f5f054ed3a66 100644 --- a/mlir/lib/Dialect/EmitC/IR/EmitC.cpp +++ b/mlir/lib/Dialect/EmitC/IR/EmitC.cpp @@ -1398,6 +1398,45 @@ void FileOp::build(OpBuilder &builder, OperationState &state, StringRef id) { //===----------------------------------------------------------------------===// // FieldOp //===----------------------------------------------------------------------===// +static void printEmitCFieldOpTypeAndInitialValue(OpAsmPrinter &p, FieldOp op, + TypeAttr type, + Attribute initialValue) { + p << type; + if (initialValue) { + p << " = "; + p.printAttributeWithoutType(initialValue); + } +} + +static Type getInitializerTypeForField(Type type) { + if (auto array = llvm::dyn_cast(type)) + return RankedTensorType::get(array.getShape(), array.getElementType()); + return type; +} + +static ParseResult +parseEmitCFieldOpTypeAndInitialValue(OpAsmParser &parser, TypeAttr &typeAttr, + Attribute &initialValue) { + Type type; + if (parser.parseType(type)) + return failure(); + + typeAttr = TypeAttr::get(type); + + if (parser.parseOptionalEqual()) + return success(); + + if (parser.parseAttribute(initialValue, getInitializerTypeForField(type))) + return failure(); + + if (!llvm::isa( + initialValue)) + return parser.emitError(parser.getNameLoc()) + << "initial value should be a integer, float, elements or opaque " + "attribute"; + return success(); +} + LogicalResult FieldOp::verify() { if (!isSupportedEmitCType(getType())) return emitOpError("expected valid emitc type"); diff --git a/mlir/lib/Dialect/EmitC/Transforms/WrapFuncInClass.cpp b/mlir/lib/Dialect/EmitC/Transforms/WrapFuncInClass.cpp index fa05ad8063b99..79d9d7428e914 100644 --- a/mlir/lib/Dialect/EmitC/Transforms/WrapFuncInClass.cpp +++ b/mlir/lib/Dialect/EmitC/Transforms/WrapFuncInClass.cpp @@ -68,7 +68,7 @@ class WrapFuncInClass : public OpRewritePattern { TypeAttr typeAttr = TypeAttr::get(val.getType()); fields.push_back({fieldName, typeAttr}); emitc::FieldOp::create(rewriter, funcOp.getLoc(), fieldName, typeAttr, - argAttr); + /*initial_value=*/nullptr, argAttr); } rewriter.setInsertionPointToEnd(&newClassOp.getBody().front()); diff --git a/mlir/lib/Target/Cpp/TranslateToCpp.cpp b/mlir/lib/Target/Cpp/TranslateToCpp.cpp index dcd2e11e83c6a..c4c9a597189a5 100644 --- a/mlir/lib/Target/Cpp/TranslateToCpp.cpp +++ b/mlir/lib/Target/Cpp/TranslateToCpp.cpp @@ -333,7 +333,8 @@ struct CppEmitter { /// Determine whether expression \p op should be emitted in a deferred way. static bool hasDeferredEmission(Operation *op) { return isa_and_nonnull(op); + emitc::MemberOfPtrOp, emitc::SubscriptOp, + emitc::GetFieldOp>(op); } /// Determine whether expression \p expressionOp should be emitted inline, i.e. @@ -1049,25 +1050,17 @@ static LogicalResult printOperation(CppEmitter &emitter, ClassOp classOp) { static LogicalResult printOperation(CppEmitter &emitter, FieldOp fieldOp) { raw_ostream &os = emitter.ostream(); - if (failed(emitter.emitType(fieldOp->getLoc(), fieldOp.getType()))) + if (failed(emitter.emitVariableDeclaration( + fieldOp->getLoc(), fieldOp.getType(), fieldOp.getSymName()))) return failure(); - os << " " << fieldOp.getSymName() << ";"; - return success(); -} - -static LogicalResult printOperation(CppEmitter &emitter, - GetFieldOp getFieldOp) { - raw_indented_ostream &os = emitter.ostream(); - - Value result = getFieldOp.getResult(); - if (failed(emitter.emitType(getFieldOp->getLoc(), result.getType()))) - return failure(); - os << " "; - if (failed(emitter.emitOperand(result))) - return failure(); - os << " = "; + std::optional initialValue = fieldOp.getInitialValue(); + if (initialValue) { + os << " = "; + if (failed(emitter.emitAttribute(fieldOp->getLoc(), *initialValue))) + return failure(); + } - os << getFieldOp.getFieldName().str(); + os << ";"; return success(); } @@ -1700,12 +1693,11 @@ LogicalResult CppEmitter::emitOperation(Operation &op, bool trailingSemicolon) { emitc::CmpOp, emitc::ConditionalOp, emitc::ConstantOp, emitc::DeclareFuncOp, emitc::DivOp, emitc::ExpressionOp, emitc::FieldOp, emitc::FileOp, emitc::ForOp, emitc::FuncOp, - emitc::GetFieldOp, emitc::GlobalOp, emitc::IfOp, - emitc::IncludeOp, emitc::LoadOp, emitc::LogicalAndOp, - emitc::LogicalNotOp, emitc::LogicalOrOp, emitc::MulOp, - emitc::RemOp, emitc::ReturnOp, emitc::SubOp, emitc::SwitchOp, - emitc::UnaryMinusOp, emitc::UnaryPlusOp, emitc::VariableOp, - emitc::VerbatimOp>( + emitc::GlobalOp, emitc::IfOp, emitc::IncludeOp, emitc::LoadOp, + emitc::LogicalAndOp, emitc::LogicalNotOp, emitc::LogicalOrOp, + emitc::MulOp, emitc::RemOp, emitc::ReturnOp, emitc::SubOp, + emitc::SwitchOp, emitc::UnaryMinusOp, emitc::UnaryPlusOp, + emitc::VariableOp, emitc::VerbatimOp>( [&](auto op) { return printOperation(*this, op); }) // Func ops. @@ -1715,6 +1707,10 @@ LogicalResult CppEmitter::emitOperation(Operation &op, bool trailingSemicolon) { cacheDeferredOpResult(op.getResult(), op.getName()); return success(); }) + .Case([&](auto op) { + cacheDeferredOpResult(op.getResult(), op.getFieldName()); + return success(); + }) .Case([&](auto op) { cacheDeferredOpResult(op.getResult(), op.getValue()); return success(); diff --git a/mlir/test/Dialect/EmitC/wrap_emitc_func_in_class.mlir b/mlir/test/Dialect/EmitC/wrap_emitc_func_in_class.mlir index 029fa78a3f528..2f6627f234fe7 100644 --- a/mlir/test/Dialect/EmitC/wrap_emitc_func_in_class.mlir +++ b/mlir/test/Dialect/EmitC/wrap_emitc_func_in_class.mlir @@ -19,9 +19,9 @@ module attributes { } { // 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.field @fieldName0 : !emitc.array<1xf32> {attrs = {emitc.name_hint = "another_feature"}} +// CHECK-NEXT: emitc.field @fieldName1 : !emitc.array<1xf32> {attrs = {emitc.name_hint = "some_feature"}} +// CHECK-NEXT: emitc.field @fieldName2 : !emitc.array<1xf32> {attrs = {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> diff --git a/mlir/test/mlir-translate/emitc_classops.mlir b/mlir/test/mlir-translate/emitc_classops.mlir index 4b7ddf4630d55..d5f18ac63dd36 100644 --- a/mlir/test/mlir-translate/emitc_classops.mlir +++ b/mlir/test/mlir-translate/emitc_classops.mlir @@ -14,12 +14,10 @@ emitc.class @modelClass { // CHECK-LABEL: class modelClass { // CHECK-NEXT: public: -// CHECK-NEXT: float[1] fieldName0; -// CHECK-NEXT: float[1] fieldName1; +// CHECK-NEXT: float fieldName0[1]; +// CHECK-NEXT: float fieldName1[1]; // CHECK-NEXT: void execute() { // CHECK-NEXT: size_t v1 = 0; -// CHECK-NEXT: float[1] v2 = fieldName0; -// CHECK-NEXT: float[1] v3 = fieldName1; // CHECK-NEXT: return; // CHECK-NEXT: } // CHECK-EMPTY: @@ -39,12 +37,27 @@ emitc.class final @finalClass { // CHECK-LABEL: class finalClass final { // CHECK-NEXT: public: -// CHECK-NEXT: float[1] fieldName0; -// CHECK-NEXT: float[1] fieldName1; +// CHECK-NEXT: float fieldName0[1]; +// CHECK-NEXT: float fieldName1[1]; // CHECK-NEXT: void execute() { // CHECK-NEXT: size_t v1 = 0; -// CHECK-NEXT: float[1] v2 = fieldName0; -// CHECK-NEXT: float[1] v3 = fieldName1; +// CHECK-NEXT: return; +// CHECK-NEXT: } +// CHECK-EMPTY: +// 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-EMPTY: From 7c3a30b5980579cd0d5d36f8d8d4cb594b54885e Mon Sep 17 00:00:00 2001 From: Jaddyen Date: Thu, 31 Jul 2025 04:43:43 +0000 Subject: [PATCH 2/6] Ensure we can emit all field types --- mlir/include/mlir/Dialect/EmitC/IR/EmitC.td | 2 +- mlir/test/mlir-translate/emitc_classops.mlir | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/mlir/include/mlir/Dialect/EmitC/IR/EmitC.td b/mlir/include/mlir/Dialect/EmitC/IR/EmitC.td index f06a24c61454a..90b2f87ffd305 100644 --- a/mlir/include/mlir/Dialect/EmitC/IR/EmitC.td +++ b/mlir/include/mlir/Dialect/EmitC/IR/EmitC.td @@ -1696,7 +1696,7 @@ def EmitC_GetFieldOp }]; let arguments = (ins FlatSymbolRefAttr:$field_name); - let results = (outs AnyTypeOf<[EmitC_ArrayType, EmitC_LValueType]>:$result); + let results = (outs EmitCType:$result); let assemblyFormat = "$field_name `:` type($result) attr-dict"; } diff --git a/mlir/test/mlir-translate/emitc_classops.mlir b/mlir/test/mlir-translate/emitc_classops.mlir index d5f18ac63dd36..ad22ad1cd376f 100644 --- a/mlir/test/mlir-translate/emitc_classops.mlir +++ b/mlir/test/mlir-translate/emitc_classops.mlir @@ -62,3 +62,21 @@ emitc.class @mainClass { // CHECK-NEXT: } // CHECK-EMPTY: // 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-EMPTY: +// CHECK-NEXT: }; + From bd85cce462a5fab0c84afc504f8200c498490532 Mon Sep 17 00:00:00 2001 From: Jaddyen Date: Fri, 1 Aug 2025 00:47:04 +0000 Subject: [PATCH 3/6] use attr dictionary --- mlir/include/mlir/Dialect/EmitC/IR/EmitC.td | 3 +-- mlir/lib/Dialect/EmitC/IR/EmitC.cpp | 3 --- .../EmitC/Transforms/WrapFuncInClass.cpp | 19 +++++++++++-------- mlir/lib/Target/Cpp/TranslateToCpp.cpp | 4 ++-- .../EmitC/wrap_emitc_func_in_class.mlir | 6 +++--- mlir/test/mlir-translate/emitc_classops.mlir | 4 ---- 6 files changed, 17 insertions(+), 22 deletions(-) diff --git a/mlir/include/mlir/Dialect/EmitC/IR/EmitC.td b/mlir/include/mlir/Dialect/EmitC/IR/EmitC.td index 90b2f87ffd305..937b34a625628 100644 --- a/mlir/include/mlir/Dialect/EmitC/IR/EmitC.td +++ b/mlir/include/mlir/Dialect/EmitC/IR/EmitC.td @@ -1668,8 +1668,7 @@ def EmitC_FieldOp : EmitC_Op<"field", [Symbol]> { }]; let arguments = (ins SymbolNameAttr:$sym_name, TypeAttr:$type, - OptionalAttr:$initial_value, - OptionalAttr:$attrs); + OptionalAttr:$initial_value); let assemblyFormat = [{ $sym_name diff --git a/mlir/lib/Dialect/EmitC/IR/EmitC.cpp b/mlir/lib/Dialect/EmitC/IR/EmitC.cpp index 0f5f054ed3a66..e6a3154721faa 100644 --- a/mlir/lib/Dialect/EmitC/IR/EmitC.cpp +++ b/mlir/lib/Dialect/EmitC/IR/EmitC.cpp @@ -1449,9 +1449,6 @@ LogicalResult FieldOp::verify() { if (!symName || symName.getValue().empty()) return emitOpError("field must have a non-empty symbol name"); - if (!getAttrs()) - return success(); - return success(); } diff --git a/mlir/lib/Dialect/EmitC/Transforms/WrapFuncInClass.cpp b/mlir/lib/Dialect/EmitC/Transforms/WrapFuncInClass.cpp index 79d9d7428e914..648b31c1a021f 100644 --- a/mlir/lib/Dialect/EmitC/Transforms/WrapFuncInClass.cpp +++ b/mlir/lib/Dialect/EmitC/Transforms/WrapFuncInClass.cpp @@ -58,17 +58,20 @@ class WrapFuncInClass : public OpRewritePattern { auto argAttrs = funcOp.getArgAttrs(); for (auto [idx, val] : llvm::enumerate(funcOp.getArguments())) { - StringAttr fieldName; - Attribute argAttr = nullptr; - - fieldName = rewriter.getStringAttr("fieldName" + std::to_string(idx)); - if (argAttrs && idx < argAttrs->size()) - argAttr = (*argAttrs)[idx]; + StringAttr fieldName = + rewriter.getStringAttr("fieldName" + std::to_string(idx)); TypeAttr typeAttr = TypeAttr::get(val.getType()); fields.push_back({fieldName, typeAttr}); - emitc::FieldOp::create(rewriter, funcOp.getLoc(), fieldName, typeAttr, - /*initial_value=*/nullptr, argAttr); + + auto fieldop = rewriter.create( + funcOp->getLoc(), fieldName, typeAttr, nullptr); + + if (argAttrs && idx < argAttrs->size()) { + // NamedAttribute argAttrNamed = rewriter.getNamedAttr("attrs", + // (*argAttrs)[idx]); + fieldop->setDiscardableAttrs(funcOp.getArgAttrDict(idx)); + } } rewriter.setInsertionPointToEnd(&newClassOp.getBody().front()); diff --git a/mlir/lib/Target/Cpp/TranslateToCpp.cpp b/mlir/lib/Target/Cpp/TranslateToCpp.cpp index c4c9a597189a5..8e83e455d1a7f 100644 --- a/mlir/lib/Target/Cpp/TranslateToCpp.cpp +++ b/mlir/lib/Target/Cpp/TranslateToCpp.cpp @@ -1197,7 +1197,7 @@ static LogicalResult printOperation(CppEmitter &emitter, os << ") {\n"; if (failed(printFunctionBody(emitter, operation, functionOp.getBlocks()))) return failure(); - os << "}\n"; + os << "}"; return success(); } @@ -1238,7 +1238,7 @@ static LogicalResult printOperation(CppEmitter &emitter, os << ") {\n"; if (failed(printFunctionBody(emitter, operation, functionOp.getBlocks()))) return failure(); - os << "}\n"; + os << "}"; return success(); } diff --git a/mlir/test/Dialect/EmitC/wrap_emitc_func_in_class.mlir b/mlir/test/Dialect/EmitC/wrap_emitc_func_in_class.mlir index 2f6627f234fe7..4d3d5c29dcea1 100644 --- a/mlir/test/Dialect/EmitC/wrap_emitc_func_in_class.mlir +++ b/mlir/test/Dialect/EmitC/wrap_emitc_func_in_class.mlir @@ -19,9 +19,9 @@ module attributes { } { // CHECK: module { // CHECK-NEXT: emitc.class @modelClass { -// CHECK-NEXT: emitc.field @fieldName0 : !emitc.array<1xf32> {attrs = {emitc.name_hint = "another_feature"}} -// CHECK-NEXT: emitc.field @fieldName1 : !emitc.array<1xf32> {attrs = {emitc.name_hint = "some_feature"}} -// CHECK-NEXT: emitc.field @fieldName2 : !emitc.array<1xf32> {attrs = {emitc.name_hint = "output_0"}} +// 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> diff --git a/mlir/test/mlir-translate/emitc_classops.mlir b/mlir/test/mlir-translate/emitc_classops.mlir index ad22ad1cd376f..d880f9b16dfc6 100644 --- a/mlir/test/mlir-translate/emitc_classops.mlir +++ b/mlir/test/mlir-translate/emitc_classops.mlir @@ -20,7 +20,6 @@ emitc.class @modelClass { // CHECK-NEXT: size_t v1 = 0; // CHECK-NEXT: return; // CHECK-NEXT: } -// CHECK-EMPTY: // CHECK-NEXT: }; emitc.class final @finalClass { @@ -43,7 +42,6 @@ emitc.class final @finalClass { // CHECK-NEXT: size_t v1 = 0; // CHECK-NEXT: return; // CHECK-NEXT: } -// CHECK-EMPTY: // CHECK-NEXT: }; emitc.class @mainClass { @@ -60,7 +58,6 @@ emitc.class @mainClass { // CHECK-NEXT: void get_fieldName0() { // CHECK-NEXT: return; // CHECK-NEXT: } -// CHECK-EMPTY: // CHECK-NEXT: }; emitc.class @reflectionClass { @@ -77,6 +74,5 @@ emitc.class @reflectionClass { // CHECK-NEXT: void get_reflectionMap() { // CHECK-NEXT: return; // CHECK-NEXT: } -// CHECK-EMPTY: // CHECK-NEXT: }; From 76d729ebff8b9f7d656ceeda954c3e2b3a04b78c Mon Sep 17 00:00:00 2001 From: Jaddyen Date: Fri, 1 Aug 2025 00:51:38 +0000 Subject: [PATCH 4/6] remove wrong comment --- mlir/lib/Dialect/EmitC/Transforms/WrapFuncInClass.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/mlir/lib/Dialect/EmitC/Transforms/WrapFuncInClass.cpp b/mlir/lib/Dialect/EmitC/Transforms/WrapFuncInClass.cpp index 648b31c1a021f..9ea2b2701e524 100644 --- a/mlir/lib/Dialect/EmitC/Transforms/WrapFuncInClass.cpp +++ b/mlir/lib/Dialect/EmitC/Transforms/WrapFuncInClass.cpp @@ -68,8 +68,6 @@ class WrapFuncInClass : public OpRewritePattern { funcOp->getLoc(), fieldName, typeAttr, nullptr); if (argAttrs && idx < argAttrs->size()) { - // NamedAttribute argAttrNamed = rewriter.getNamedAttr("attrs", - // (*argAttrs)[idx]); fieldop->setDiscardableAttrs(funcOp.getArgAttrDict(idx)); } } From 5cce6fa11aa687ea13e9d99363dda9e9dc59ba52 Mon Sep 17 00:00:00 2001 From: Jaddyen Date: Fri, 1 Aug 2025 00:56:29 +0000 Subject: [PATCH 5/6] Format the tests correctly --- mlir/lib/Dialect/EmitC/Transforms/WrapFuncInClass.cpp | 2 +- mlir/test/Dialect/EmitC/wrap_emitc_func_in_class.mlir | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mlir/lib/Dialect/EmitC/Transforms/WrapFuncInClass.cpp b/mlir/lib/Dialect/EmitC/Transforms/WrapFuncInClass.cpp index 9ea2b2701e524..c55e26e722f33 100644 --- a/mlir/lib/Dialect/EmitC/Transforms/WrapFuncInClass.cpp +++ b/mlir/lib/Dialect/EmitC/Transforms/WrapFuncInClass.cpp @@ -64,7 +64,7 @@ class WrapFuncInClass : public OpRewritePattern { TypeAttr typeAttr = TypeAttr::get(val.getType()); fields.push_back({fieldName, typeAttr}); - auto fieldop = rewriter.create( + FieldOp fieldop = rewriter.create( funcOp->getLoc(), fieldName, typeAttr, nullptr); if (argAttrs && idx < argAttrs->size()) { diff --git a/mlir/test/Dialect/EmitC/wrap_emitc_func_in_class.mlir b/mlir/test/Dialect/EmitC/wrap_emitc_func_in_class.mlir index 4d3d5c29dcea1..7a318fb443298 100644 --- a/mlir/test/Dialect/EmitC/wrap_emitc_func_in_class.mlir +++ b/mlir/test/Dialect/EmitC/wrap_emitc_func_in_class.mlir @@ -19,9 +19,9 @@ module attributes { } { // 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.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> From aff4e3726dd7410ffd5fbd0ceb2b1cf3fa4b13dc Mon Sep 17 00:00:00 2001 From: Jaddyen Date: Fri, 1 Aug 2025 00:58:53 +0000 Subject: [PATCH 6/6] Format the tests correctly - whitespace --- mlir/test/Dialect/EmitC/wrap_emitc_func_in_class.mlir | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mlir/test/Dialect/EmitC/wrap_emitc_func_in_class.mlir b/mlir/test/Dialect/EmitC/wrap_emitc_func_in_class.mlir index 7a318fb443298..029fa78a3f528 100644 --- a/mlir/test/Dialect/EmitC/wrap_emitc_func_in_class.mlir +++ b/mlir/test/Dialect/EmitC/wrap_emitc_func_in_class.mlir @@ -19,7 +19,7 @@ module attributes { } { // CHECK: module { // CHECK-NEXT: emitc.class @modelClass { -// CHECK-NEXT: emitc.field @fieldName0 : !emitc.array<1xf32> {emitc.name_hint = "another_feature"} +// 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() {