[Mlir-commits] [mlir] a4f31cc - [mlir-tblgen] Emit named operand indices (#146839)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Fri Jul 4 08:15:14 PDT 2025


Author: Michael Kruse
Date: 2025-07-04T17:15:11+02:00
New Revision: a4f31ccfa0efd610589d5e474daaeca1e0159807

URL: https://github.com/llvm/llvm-project/commit/a4f31ccfa0efd610589d5e474daaeca1e0159807
DIFF: https://github.com/llvm/llvm-project/commit/a4f31ccfa0efd610589d5e474daaeca1e0159807.diff

LOG: [mlir-tblgen] Emit named operand indices (#146839)

An operation's operands are defined by the `arguments` field in the
tablegen definition. mlir-tblgen generates accessors for them:
`getXYZ()` and `setXYZ(...)` to set an operation's operands without
knowing the operand's index, but it does not expose the operand index
itself. Yet some use cases requires knowing the operand index that is
now covered by just getters and setters. For instance:
* Given an `mlir::OpOperand`, find out whether it is a specific argument
(from the `arguments` field in the `.td` file)
* For operation with variable number of operands (variadic,
`AttrSizedOperandSegments`), get the value to pass to `getODSOperands`
or `getODSOperandIndexAndLength`.

Added: 
    

Modified: 
    mlir/test/mlir-tblgen/op-operand.td
    mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp

Removed: 
    


################################################################################
diff  --git a/mlir/test/mlir-tblgen/op-operand.td b/mlir/test/mlir-tblgen/op-operand.td
index a2fa1f7046a97..ab8d721ed5427 100644
--- a/mlir/test/mlir-tblgen/op-operand.td
+++ b/mlir/test/mlir-tblgen/op-operand.td
@@ -13,6 +13,9 @@ def OpA : NS_Op<"one_normal_operand_op", []> {
   let arguments = (ins I32:$input);
 }
 
+// DECL-LABEL: class OpA : {{.*}} {
+// DECL: static constexpr int odsIndex_input = 0;
+
 // CHECK-LABEL: OpA definitions
 
 // CHECK:      void OpA::build
@@ -28,6 +31,9 @@ def OpB : NS_Op<"one_variadic_operand_op", []> {
   let arguments = (ins Variadic<I32>:$input);
 }
 
+// DECL-LABEL: class OpB : {{.*}} {
+// DECL: static constexpr int odsIndex_input = 0;
+
 // CHECK-LABEL: OpB::build
 // CHECK:         ::mlir::ValueRange input
 // CHECK-NOT:     assert
@@ -37,6 +43,11 @@ def OpD : NS_Op<"mix_variadic_and_normal_inputs_op", [SameVariadicOperandSize]>
   let arguments = (ins Variadic<AnyTensor>:$input1, AnyTensor:$input2, Variadic<AnyTensor>:$input3);
 }
 
+// DECL-LABEL: class OpD : {{.*}} {
+// DECL: static constexpr int odsIndex_input1 = 0;
+// DECL: static constexpr int odsIndex_input2 = 1;
+// DECL: static constexpr int odsIndex_input3 = 2;
+
 // DECL-LABEL: ::mlir::Operation::operand_range getInput1
 // DECL-NEXT: return getODSOperands(0);
 

diff  --git a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp
index 6008ed4673d1b..cbb4030f3adb4 100644
--- a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp
+++ b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp
@@ -2223,6 +2223,17 @@ generateNamedOperandGetters(const Operator &op, Class &opClass,
                     "'SameVariadicOperandSize' traits");
   }
 
+  // Print the ods names so they don't need to be hardcoded in the source.
+  for (int i = 0; i != numOperands; ++i) {
+    const auto &operand = op.getOperand(i);
+    if (operand.name.empty())
+      continue;
+
+    opClass.declare<Field>("static constexpr int", Twine("odsIndex_") +
+                                                       operand.name + " = " +
+                                                       Twine(i));
+  }
+
   // First emit a few "sink" getter methods upon which we layer all nicer named
   // getter methods.
   // If generating for an adaptor, the method is put into the non-templated


        


More information about the Mlir-commits mailing list