[Mlir-commits] [mlir] [mlir][EmitC] Add attribute indicating source for created `FieldOp`s (PR #207069)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Wed Jul 1 12:50:14 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-mlir-emitc

Author: Bhavesh M (beamandala)

<details>
<summary>Changes</summary>

Adds an informative `source` attr to created `FieldOp`s based on whether the `FieldOp` was a function arg or a `GlobalOp`.

This is motivated by the reflection map pass (#<!-- -->205464) which will be run after the `wrap-emitc-func-in-class` pass and needs attributes to include and exclude `FieldOp`s from the reflection map.

---
Full diff: https://github.com/llvm/llvm-project/pull/207069.diff


2 Files Affected:

- (modified) mlir/lib/Dialect/EmitC/Transforms/WrapFuncInClass.cpp (+11-3) 
- (modified) mlir/test/Dialect/EmitC/wrap-func-in-class.mlir (+10-10) 


``````````diff
diff --git a/mlir/lib/Dialect/EmitC/Transforms/WrapFuncInClass.cpp b/mlir/lib/Dialect/EmitC/Transforms/WrapFuncInClass.cpp
index aaceddb1e1b61..c9ece98029825 100644
--- a/mlir/lib/Dialect/EmitC/Transforms/WrapFuncInClass.cpp
+++ b/mlir/lib/Dialect/EmitC/Transforms/WrapFuncInClass.cpp
@@ -93,16 +93,24 @@ class WrapFuncInClass : public OpRewritePattern<FuncOp> {
       FieldOp fieldop = FieldOp::create(rewriter, funcOp->getLoc(), fieldName,
                                         typeAttr, nullptr);
 
+      NamedAttrList attrs(funcOp.getArgAttrDict(idx));
+      attrs.set("was_arg", rewriter.getUnitAttr());
       if (argAttrs && idx < argAttrs->size()) {
-        fieldop->setDiscardableAttrs(funcOp.getArgAttrDict(idx));
+        fieldop->setDiscardableAttrs(attrs);
       }
     }
 
     auto globalsIt = globalsToMove.find(funcOp);
     if (globalsIt != globalsToMove.end()) {
       for (auto global : globalsIt->second) {
-        FieldOp::create(rewriter, funcOp->getLoc(), global.getSymNameAttr(),
-                        global.getTypeAttr(), global.getInitialValueAttr());
+        FieldOp fieldop =
+            FieldOp::create(rewriter, funcOp->getLoc(), global.getSymNameAttr(),
+                            global.getTypeAttr(), global.getInitialValueAttr());
+
+        NamedAttrList attrs;
+        attrs.append(global->getDiscardableAttrs());
+        attrs.set("was_global", rewriter.getUnitAttr());
+        fieldop->setDiscardableAttrs(attrs);
       }
     }
 
diff --git a/mlir/test/Dialect/EmitC/wrap-func-in-class.mlir b/mlir/test/Dialect/EmitC/wrap-func-in-class.mlir
index 7d5b3d30a64ba..ed62ca7928e2c 100644
--- a/mlir/test/Dialect/EmitC/wrap-func-in-class.mlir
+++ b/mlir/test/Dialect/EmitC/wrap-func-in-class.mlir
@@ -37,9 +37,9 @@ module attributes { } {
 }
 
 // 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.field @fieldName0 : !emitc.array<1xf32> {emitc.name_hint = "another_feature", was_arg}
+// CHECK:     emitc.field @fieldName1 : !emitc.array<1xf32> {emitc.name_hint = "some_feature", was_arg}
+// CHECK:     emitc.field @fieldName2 : !emitc.array<1xf32> {emitc.name_hint = "output_0", was_arg}
 // CHECK:     emitc.func @"operator()"() {
 // CHECK:       get_field @fieldName0 : !emitc.array<1xf32>
 // CHECK:       get_field @fieldName1 : !emitc.array<1xf32>
@@ -71,7 +71,7 @@ module attributes { } {
 }
 
 // CHECK:   emitc.class @fooClass {
-// CHECK:     emitc.field @global_arr : !emitc.array<1xi8> = dense<0>
+// CHECK:     emitc.field @global_arr : !emitc.array<1xi8> = dense<0> {was_global}
 // CHECK:     emitc.func @"operator()"() {
 // CHECK:       %0 = get_field @global_arr : !emitc.array<1xi8>
 // CHECK:       return
@@ -97,7 +97,7 @@ module attributes { } {
 // CHECK:   module {
 // CHECK-NEXT:     emitc.global static const @global_arr2 : !emitc.array<1xi8> = dense<0>
 // CHECK-NEXT:     emitc.class @fooClass {
-// CHECK-NEXT:       emitc.field @global_arr : !emitc.array<1xi8> = dense<0>
+// CHECK-NEXT:       emitc.field @global_arr : !emitc.array<1xi8> = dense<0> {was_global}
 // CHECK-NEXT:       emitc.func @"operator()"() {
 // CHECK-NEXT:         %0 = get_field @global_arr : !emitc.array<1xi8>
 // CHECK-NEXT:         return
@@ -129,14 +129,14 @@ module attributes { } {
 // CHECK:   module {
 // CHECK-NEXT:     emitc.global static const @global_arr3 : !emitc.array<1xi8> = dense<0>
 // CHECK-NEXT:     emitc.class @fooClass {
-// CHECK-NEXT:       emitc.field @global_arr1 : !emitc.array<1xi8> = dense<0>
+// CHECK-NEXT:       emitc.field @global_arr1 : !emitc.array<1xi8> = dense<0> {was_global}
 // CHECK-NEXT:       emitc.func @"operator()"() {
 // CHECK-NEXT:         %0 = get_field @global_arr1 : !emitc.array<1xi8>
 // CHECK-NEXT:         return
 // CHECK-NEXT:       }
 // CHECK-NEXT:     }
 // CHECK-NEXT:     emitc.class @barClass {
-// CHECK-NEXT:       emitc.field @global_arr2 : !emitc.array<1xi8> = dense<0>
+// CHECK-NEXT:       emitc.field @global_arr2 : !emitc.array<1xi8> = dense<0> {was_global}
 // CHECK-NEXT:       emitc.func @"operator()"() {
 // CHECK-NEXT:         %0 = get_field @global_arr2 : !emitc.array<1xi8>
 // CHECK-NEXT:         return
@@ -165,14 +165,14 @@ module attributes { } {
 
 // CHECK:   module {
 // CHECK-NEXT:     emitc.class @fooClass {
-// CHECK-NEXT:       emitc.field @global_arr : !emitc.array<1xi8> = dense<0>
+// CHECK-NEXT:       emitc.field @global_arr : !emitc.array<1xi8> = dense<0> {was_global}
 // CHECK-NEXT:       emitc.func @"operator()"() {
 // CHECK-NEXT:         %0 = get_field @global_arr : !emitc.array<1xi8>
 // CHECK-NEXT:         return
 // CHECK-NEXT:       }
 // CHECK-NEXT:     }
 // CHECK-NEXT:     emitc.class @barClass {
-// CHECK-NEXT:       emitc.field @global_arr : !emitc.array<1xi8> = dense<0>
+// CHECK-NEXT:       emitc.field @global_arr : !emitc.array<1xi8> = dense<0> {was_global}
 // CHECK-NEXT:       emitc.func @"operator()"() {
 // CHECK-NEXT:         %0 = get_field @global_arr : !emitc.array<1xi8>
 // CHECK-NEXT:         return
@@ -197,7 +197,7 @@ module attributes { } {
 
 // CHECK:   module {
 // CHECK-NEXT:     emitc.class @fooClass {
-// CHECK-NEXT:       emitc.field @global_arr : !emitc.array<1xi8> = dense<0>
+// CHECK-NEXT:       emitc.field @global_arr : !emitc.array<1xi8> = dense<0> {was_global}
 // CHECK-NEXT:       emitc.func @"operator()"() {
 // CHECK-NEXT:         %0 = get_field @global_arr : !emitc.array<1xi8>
 // CHECK-NEXT:         %1 = get_field @global_arr : !emitc.array<1xi8>

``````````

</details>


https://github.com/llvm/llvm-project/pull/207069


More information about the Mlir-commits mailing list