[Mlir-commits] [mlir] [MLIR][Python] Refine trait support in MLIR Python (PR #180550)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Mon Feb 9 07:47:55 PST 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-mlir

Author: Twice (PragmaTwice)

<details>
<summary>Changes</summary>

This PR is mainly to address review suggestions in #<!-- -->179705.

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


3 Files Affected:

- (modified) mlir/include/mlir-c/ExtensibleDialect.h (+6-2) 
- (modified) mlir/lib/Bindings/Python/IRCore.cpp (+5-4) 
- (modified) mlir/lib/CAPI/IR/ExtensibleDialect.cpp (+2-2) 


``````````diff
diff --git a/mlir/include/mlir-c/ExtensibleDialect.h b/mlir/include/mlir-c/ExtensibleDialect.h
index 98457805f57c0..b0e03371da963 100644
--- a/mlir/include/mlir-c/ExtensibleDialect.h
+++ b/mlir/include/mlir-c/ExtensibleDialect.h
@@ -33,6 +33,8 @@ extern "C" {
 
 DEFINE_C_API_STRUCT(MlirDynamicOpTrait, void);
 
+#undef DEFINE_C_API_STRUCT
+
 /// Attach a dynamic op trait to the given operation name.
 /// Note that the operation name must be modeled by dynamic dialect and must be
 /// registered.
@@ -43,10 +45,12 @@ mlirDynamicOpTraitAttach(MlirDynamicOpTrait dynamicOpTrait,
                          MlirStringRef opName, MlirContext context);
 
 /// Get the dynamic op trait that indicates the operation is a terminator.
-MLIR_CAPI_EXPORTED MlirDynamicOpTrait mlirDynamicOpTraitGetIsTerminator(void);
+MLIR_CAPI_EXPORTED MlirDynamicOpTrait
+mlirDynamicOpTraitCreateIsTerminator(void);
 
 /// Get the dynamic op trait that indicates regions have no terminator.
-MLIR_CAPI_EXPORTED MlirDynamicOpTrait mlirDynamicOpTraitGetNoTerminator(void);
+MLIR_CAPI_EXPORTED MlirDynamicOpTrait
+mlirDynamicOpTraitCreateNoTerminator(void);
 
 /// Destroy the dynamic op trait.
 MLIR_CAPI_EXPORTED void
diff --git a/mlir/lib/Bindings/Python/IRCore.cpp b/mlir/lib/Bindings/Python/IRCore.cpp
index 6f03f334e34b4..3c0e46ff36007 100644
--- a/mlir/lib/Bindings/Python/IRCore.cpp
+++ b/mlir/lib/Bindings/Python/IRCore.cpp
@@ -2517,9 +2517,8 @@ void PyOpAdaptor::bind(nb::module_ &m) {
 static MlirLogicalResult verifyTraitByMethod(MlirOperation op, void *userData,
                                              const char *methodName) {
   nb::handle targetObj(static_cast<PyObject *>(userData));
-  if (!nb::hasattr(targetObj, methodName)) {
+  if (!nb::hasattr(targetObj, methodName))
     return mlirLogicalResultSuccess();
-  }
   PyMlirContextRef ctx = PyMlirContext::forContext(mlirOperationGetContext(op));
   nb::object opView = PyOperation::forOperation(ctx, op)->createOpView();
   bool success = nb::cast<bool>(targetObj.attr(methodName)(opView));
@@ -2566,6 +2565,8 @@ bool PyDynamicOpTrait::attach(const nb::object &opName,
     return verifyTraitByMethod(op, userData, "verify_region");
   };
 
+  // To ensure that the same dynamic trait gets the same TypeID despite how many
+  // times `attach` is called, we store it as an attribute on the target class.
   constexpr const char *typeIDAttr = "_TYPE_ID";
   if (!nb::hasattr(target, typeIDAttr)) {
     nb::setattr(target, typeIDAttr,
@@ -2593,7 +2594,7 @@ void PyDynamicOpTrait::bind(nb::module_ &m) {
 
 bool PyDynamicOpTraits::IsTerminator::attach(const nb::object &opName,
                                              PyMlirContext &context) {
-  MlirDynamicOpTrait trait = mlirDynamicOpTraitGetIsTerminator();
+  MlirDynamicOpTrait trait = mlirDynamicOpTraitCreateIsTerminator();
   return attachOpTrait(opName, trait, context);
 }
 
@@ -2611,7 +2612,7 @@ void PyDynamicOpTraits::IsTerminator::bind(nb::module_ &m) {
 
 bool PyDynamicOpTraits::NoTerminator::attach(const nb::object &opName,
                                              PyMlirContext &context) {
-  MlirDynamicOpTrait trait = mlirDynamicOpTraitGetNoTerminator();
+  MlirDynamicOpTrait trait = mlirDynamicOpTraitCreateNoTerminator();
   return attachOpTrait(opName, trait, context);
 }
 
diff --git a/mlir/lib/CAPI/IR/ExtensibleDialect.cpp b/mlir/lib/CAPI/IR/ExtensibleDialect.cpp
index f3239d996a0e6..983c34d68e6b9 100644
--- a/mlir/lib/CAPI/IR/ExtensibleDialect.cpp
+++ b/mlir/lib/CAPI/IR/ExtensibleDialect.cpp
@@ -36,11 +36,11 @@ bool mlirDynamicOpTraitAttach(MlirDynamicOpTrait dynamicOpTrait,
   return static_cast<DynamicOpDefinition *>(impl)->addTrait(std::move(trait));
 }
 
-MlirDynamicOpTrait mlirDynamicOpTraitGetIsTerminator() {
+MlirDynamicOpTrait mlirDynamicOpTraitCreateIsTerminator() {
   return wrap(new DynamicOpTraits::IsTerminator());
 }
 
-MlirDynamicOpTrait mlirDynamicOpTraitGetNoTerminator() {
+MlirDynamicOpTrait mlirDynamicOpTraitCreateNoTerminator() {
   return wrap(new DynamicOpTraits::NoTerminator());
 }
 

``````````

</details>


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


More information about the Mlir-commits mailing list