[Mlir-commits] [mlir] [mlir][ods] Emit "trivial" ODS getter/setters inline (PR #87741)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Thu Apr 4 21:22:36 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-mlir-core
Author: Jeff Niu (Mogball)
<details>
<summary>Changes</summary>
Emitting trivial getters that amount to `(*this)->getOperand(1)` out-of-line or `getProperties().foo` is a pretty significant performance hit on these basic MLIR APIs for manipulating ops (3-4x). Emit them inline (without adding additional dependencies to header files).
---
Patch is 30.78 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/87741.diff
7 Files Affected:
- (modified) mlir/include/mlir/TableGen/Class.h (+1-1)
- (modified) mlir/test/mlir-tblgen/op-attribute.td (+41-39)
- (modified) mlir/test/mlir-tblgen/op-decl-and-defs.td (+20-20)
- (modified) mlir/test/mlir-tblgen/op-operand.td (+5-4)
- (modified) mlir/test/mlir-tblgen/op-properties.td (+3-3)
- (modified) mlir/test/mlir-tblgen/op-result.td (+5-4)
- (modified) mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp (+60-41)
``````````diff
diff --git a/mlir/include/mlir/TableGen/Class.h b/mlir/include/mlir/TableGen/Class.h
index 81cdf7dbef5f70..92fec6a3b11d94 100644
--- a/mlir/include/mlir/TableGen/Class.h
+++ b/mlir/include/mlir/TableGen/Class.h
@@ -681,7 +681,7 @@ class Class {
Method *addMethod(RetTypeT &&retType, NameT &&name,
Method::Properties properties,
ArrayRef<MethodParameter> parameters) {
- // If the class has template parameters, the has to defined inline.
+ // If the class has template parameters, then it has to be defined inline.
if (!templateParams.empty())
properties |= Method::Inline;
return addMethodAndPrune(Method(std::forward<RetTypeT>(retType),
diff --git a/mlir/test/mlir-tblgen/op-attribute.td b/mlir/test/mlir-tblgen/op-attribute.td
index b5b8619e7c9bea..6f2d430fb6db67 100644
--- a/mlir/test/mlir-tblgen/op-attribute.td
+++ b/mlir/test/mlir-tblgen/op-attribute.td
@@ -98,26 +98,26 @@ def AOp : NS_Op<"a_op", []> {
// Test getter methods
// ---
-// DEF: some-attr-kind AOp::getAAttrAttr()
-// DEF-NEXT: ::llvm::cast<some-attr-kind>(::mlir::impl::getAttrFromSortedRange((*this)->getAttrs().begin() + 0, (*this)->getAttrs().end() - 0, getAAttrAttrName()))
+// DECL: some-attr-kind getAAttrAttr()
+// DECL-NEXT: ::llvm::cast<some-attr-kind>(::mlir::impl::getAttrFromSortedRange((*this)->getAttrs().begin() + 0, (*this)->getAttrs().end() - 0, getAAttrAttrName()))
// DEF: some-return-type AOp::getAAttr() {
// DEF-NEXT: auto attr = getAAttrAttr()
// DEF-NEXT: return attr.some-convert-from-storage();
-// DEF: some-attr-kind AOp::getBAttrAttr()
-// DEF-NEXT: ::llvm::dyn_cast_or_null<some-attr-kind>(::mlir::impl::getAttrFromSortedRange((*this)->getAttrs().begin() + 1, (*this)->getAttrs().end() - 0, getBAttrAttrName()))
+// DECL: some-attr-kind getBAttrAttr()
+// DECL-NEXT: ::llvm::dyn_cast_or_null<some-attr-kind>(::mlir::impl::getAttrFromSortedRange((*this)->getAttrs().begin() + 1, (*this)->getAttrs().end() - 0, getBAttrAttrName()))
// DEF: some-return-type AOp::getBAttr() {
// DEF-NEXT: auto attr = getBAttrAttr();
// DEF-NEXT: return attr.some-convert-from-storage();
-// DEF: some-attr-kind AOp::getCAttrAttr()
-// DEF-NEXT: ::llvm::dyn_cast_or_null<some-attr-kind>(::mlir::impl::getAttrFromSortedRange((*this)->getAttrs().begin() + 1, (*this)->getAttrs().end() - 0, getCAttrAttrName()))
+// DECL: some-attr-kind getCAttrAttr()
+// DECL-NEXT: ::llvm::dyn_cast_or_null<some-attr-kind>(::mlir::impl::getAttrFromSortedRange((*this)->getAttrs().begin() + 1, (*this)->getAttrs().end() - 0, getCAttrAttrName()))
// DEF: ::std::optional<some-return-type> AOp::getCAttr() {
// DEF-NEXT: auto attr = getCAttrAttr()
// DEF-NEXT: return attr ? ::std::optional<some-return-type>(attr.some-convert-from-storage()) : (::std::nullopt);
-// DEF: some-attr-kind AOp::getDAttrAttr()
-// DEF-NEXT: ::llvm::dyn_cast_or_null<some-attr-kind>(::mlir::impl::getAttrFromSortedRange((*this)->getAttrs().begin() + 1, (*this)->getAttrs().end() - 0, getDAttrAttrName()))
+// DECL: some-attr-kind getDAttrAttr()
+// DECL-NEXT: ::llvm::dyn_cast_or_null<some-attr-kind>(::mlir::impl::getAttrFromSortedRange((*this)->getAttrs().begin() + 1, (*this)->getAttrs().end() - 0, getDAttrAttrName()))
// DEF: some-return-type AOp::getDAttr() {
// DEF-NEXT: auto attr = getDAttrAttr();
// DEF-NEXT: if (!attr)
@@ -127,16 +127,16 @@ def AOp : NS_Op<"a_op", []> {
// Test setter methods
// ---
-// DEF: void AOp::setAAttrAttr(some-attr-kind attr) {
-// DEF-NEXT: (*this)->setAttr(getAAttrAttrName(), attr);
+// DECL: void setAAttrAttr(some-attr-kind attr) {
+// DECL-NEXT: (*this)->setAttr(getAAttrAttrName(), attr);
// DEF: void AOp::setAAttr(some-return-type attrValue) {
// DEF-NEXT: (*this)->setAttr(getAAttrAttrName(), some-const-builder-call(::mlir::Builder((*this)->getContext()), attrValue));
-// DEF: void AOp::setBAttrAttr(some-attr-kind attr) {
-// DEF-NEXT: (*this)->setAttr(getBAttrAttrName(), attr);
+// DECL: void setBAttrAttr(some-attr-kind attr) {
+// DECL-NEXT: (*this)->setAttr(getBAttrAttrName(), attr);
// DEF: void AOp::setBAttr(some-return-type attrValue) {
// DEF-NEXT: (*this)->setAttr(getBAttrAttrName(), some-const-builder-call(::mlir::Builder((*this)->getContext()), attrValue));
-// DEF: void AOp::setCAttrAttr(some-attr-kind attr) {
-// DEF-NEXT: (*this)->setAttr(getCAttrAttrName(), attr);
+// DECL: void setCAttrAttr(some-attr-kind attr) {
+// DECL-NEXT: (*this)->setAttr(getCAttrAttrName(), attr);
// DEF: void AOp::setCAttr(::std::optional<some-return-type> attrValue) {
// DEF-NEXT: if (attrValue)
// DEF-NEXT: return (*this)->setAttr(getCAttrAttrName(), some-const-builder-call(::mlir::Builder((*this)->getContext()), *attrValue));
@@ -145,8 +145,8 @@ def AOp : NS_Op<"a_op", []> {
// Test remove methods
// ---
-// DEF: ::mlir::Attribute AOp::removeCAttrAttr() {
-// DEF-NEXT: return (*this)->removeAttr(getCAttrAttrName());
+// DECL: ::mlir::Attribute removeCAttrAttr() {
+// DECL-NEXT: return (*this)->removeAttr(getCAttrAttrName());
// Test build methods
// ---
@@ -236,22 +236,22 @@ def AgetOp : Op<Test2_Dialect, "a_get_op", []> {
// Test getter methods
// ---
-// DEF: some-attr-kind AgetOp::getAAttrAttr()
-// DEF-NEXT: ::llvm::cast<some-attr-kind>(::mlir::impl::getAttrFromSortedRange({{.*}}))
+// DECL: some-attr-kind getAAttrAttr()
+// DECL-NEXT: ::llvm::cast<some-attr-kind>(::mlir::impl::getAttrFromSortedRange({{.*}}))
// DEF: some-return-type AgetOp::getAAttr() {
// DEF-NEXT: auto attr = getAAttrAttr()
// DEF-NEXT: return attr.some-convert-from-storage();
-// DEF: some-attr-kind AgetOp::getBAttrAttr()
-// DEF-NEXT: return ::llvm::dyn_cast_or_null<some-attr-kind>(::mlir::impl::getAttrFromSortedRange({{.*}}))
+// DECL: some-attr-kind getBAttrAttr()
+// DECL-NEXT: return ::llvm::dyn_cast_or_null<some-attr-kind>(::mlir::impl::getAttrFromSortedRange({{.*}}))
// DEF: some-return-type AgetOp::getBAttr() {
// DEF-NEXT: auto attr = getBAttrAttr();
// DEF-NEXT: if (!attr)
// DEF-NEXT: return some-const-builder-call(::mlir::Builder((*this)->getContext()), 4.2).some-convert-from-storage();
// DEF-NEXT: return attr.some-convert-from-storage();
-// DEF: some-attr-kind AgetOp::getCAttrAttr()
-// DEF-NEXT: return ::llvm::dyn_cast_or_null<some-attr-kind>(::mlir::impl::getAttrFromSortedRange({{.*}}))
+// DECL: some-attr-kind getCAttrAttr()
+// DECL-NEXT: return ::llvm::dyn_cast_or_null<some-attr-kind>(::mlir::impl::getAttrFromSortedRange({{.*}}))
// DEF: ::std::optional<some-return-type> AgetOp::getCAttr() {
// DEF-NEXT: auto attr = getCAttrAttr()
// DEF-NEXT: return attr ? ::std::optional<some-return-type>(attr.some-convert-from-storage()) : (::std::nullopt);
@@ -259,18 +259,18 @@ def AgetOp : Op<Test2_Dialect, "a_get_op", []> {
// Test setter methods
// ---
-// DEF: void AgetOp::setAAttrAttr(some-attr-kind attr) {
-// DEF-NEXT: (*this)->setAttr(getAAttrAttrName(), attr);
-// DEF: void AgetOp::setBAttrAttr(some-attr-kind attr) {
-// DEF-NEXT: (*this)->setAttr(getBAttrAttrName(), attr);
-// DEF: void AgetOp::setCAttrAttr(some-attr-kind attr) {
-// DEF-NEXT: (*this)->setAttr(getCAttrAttrName(), attr);
+// DECL: void setAAttrAttr(some-attr-kind attr) {
+// DECL-NEXT: (*this)->setAttr(getAAttrAttrName(), attr);
+// DECL: void setBAttrAttr(some-attr-kind attr) {
+// DECL-NEXT: (*this)->setAttr(getBAttrAttrName(), attr);
+// DECL: void setCAttrAttr(some-attr-kind attr) {
+// DECL-NEXT: (*this)->setAttr(getCAttrAttrName(), attr);
// Test remove methods
// ---
-// DEF: ::mlir::Attribute AgetOp::removeCAttrAttr() {
-// DEF-NEXT: return (*this)->removeAttr(getCAttrAttrName());
+// DECL: ::mlir::Attribute removeCAttrAttr() {
+// DECL-NEXT: return (*this)->removeAttr(getCAttrAttrName());
// Test build methods
// ---
@@ -476,9 +476,6 @@ def NamespaceOp : NS_Op<"namespace_op", []> {
SomeAttrDef:$AttrDef
);
}
-// DECL: NamespaceOp
-// DECL: foobar::SomeAttrAttr getAttrDef()
-
// Test mixing operands and attributes in arbitrary order
// ---
@@ -487,6 +484,14 @@ def MixOperandsAndAttrs : NS_Op<"mix_operands_and_attrs", []> {
let arguments = (ins F32Attr:$attr, F32:$operand, F32Attr:$otherAttr, F32:$otherArg);
}
+// DECL-LABEL: MixOperandsAndAttrs declarations
+// DECL-DAG: ::mlir::TypedValue<::mlir::FloatType> getOperand()
+// DECL-DAG: ::mlir::TypedValue<::mlir::FloatType> getOtherArg()
+
+// DECL-LABEL: NamespaceOp declarations
+// DECL: foobar::SomeAttrAttr getAttrDef()
+
+
def OpWithDefaultAndRegion : NS_Op<"default_with_region", []> {
let arguments = (ins
DefaultValuedAttr<BoolAttr, "true">:$dv_bool_attr
@@ -509,11 +514,9 @@ def OpWithDefaultAndSuccessor : NS_Op<"default_with_succ", []> {
// We should not have a default attribute in this case.
// DECL-LABEL: OpWithDefaultAndSuccessor declarations
-// DECL: static void build({{.*}}, bool dv_bool_attr, ::mlir::BlockRange succ)
+// DECL-DAG: static void build({{.*}}, bool dv_bool_attr, ::mlir::BlockRange succ)
// DEF-LABEL: MixOperandsAndAttrs definitions
-// DEF-DAG: ::mlir::TypedValue<::mlir::FloatType> MixOperandsAndAttrs::getOperand()
-// DEF-DAG: ::mlir::TypedValue<::mlir::FloatType> MixOperandsAndAttrs::getOtherArg()
// DEF-DAG: void MixOperandsAndAttrs::build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, ::mlir::FloatAttr attr, ::mlir::Value operand, ::mlir::FloatAttr otherAttr, ::mlir::Value otherArg)
// DEF-DAG: ::llvm::APFloat MixOperandsAndAttrs::getAttr()
// DEF-DAG: ::llvm::APFloat MixOperandsAndAttrs::getOtherAttr()
@@ -529,14 +532,13 @@ def UnitAttrOp : NS_Op<"unit_attr_op", []> {
// DEF: bool UnitAttrOp::getAttr() {
// DEF: return {{.*}} != nullptr
-// DEF: ::mlir::Attribute UnitAttrOp::removeAttrAttr() {
-// DEF-NEXT: (*this)->removeAttr(getAttrAttrName());
// DEF: build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, /*optional*/::mlir::UnitAttr attr)
// DEF: build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, /*optional*/bool attr)
// DECL-LABEL: UnitAttrOp declarations
-// DECL-NOT: declarations
+// DECL: ::mlir::Attribute removeAttrAttr() {
+// DECL-NEXT: (*this)->removeAttr(getAttrAttrName());
// DECL: build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, /*optional*/bool attr = false)
diff --git a/mlir/test/mlir-tblgen/op-decl-and-defs.td b/mlir/test/mlir-tblgen/op-decl-and-defs.td
index ca133fafdcb576..4fa2f308978a46 100644
--- a/mlir/test/mlir-tblgen/op-decl-and-defs.td
+++ b/mlir/test/mlir-tblgen/op-decl-and-defs.td
@@ -59,12 +59,12 @@ def NS_AOp : NS_Op<"a_op", [IsolatedFromAbove, IsolatedFromAbove]> {
// CHECK: class AOpGenericAdaptorBase {
// CHECK: public:
// CHECK: AOpGenericAdaptorBase(AOp{{[[:space:]]}}
-// CHECK: ::mlir::IntegerAttr getAttr1Attr();
+// CHECK: ::mlir::IntegerAttr getAttr1Attr() {
// CHECK: uint32_t getAttr1();
-// CHECK: ::mlir::FloatAttr getSomeAttr2Attr();
+// CHECK: ::mlir::FloatAttr getSomeAttr2Attr() {
// CHECK: ::std::optional< ::llvm::APFloat > getSomeAttr2();
-// CHECK: ::mlir::Region &getSomeRegion();
-// CHECK: ::mlir::RegionRange getSomeRegions();
+// CHECK: ::mlir::Region &getSomeRegion() {
+// CHECK: ::mlir::RegionRange getSomeRegions() {
// CHECK: };
// CHECK: }
@@ -94,20 +94,20 @@ def NS_AOp : NS_Op<"a_op", [IsolatedFromAbove, IsolatedFromAbove]> {
// CHECK: static constexpr ::llvm::StringLiteral getOperationName() {
// CHECK: return ::llvm::StringLiteral("test.a_op");
// CHECK: }
-// CHECK: ::mlir::Operation::operand_range getODSOperands(unsigned index);
-// CHECK: ::mlir::TypedValue<::mlir::IntegerType> getA();
-// CHECK: ::mlir::Operation::operand_range getB();
-// CHECK: ::mlir::OpOperand &getAMutable();
+// CHECK: ::mlir::Operation::operand_range getODSOperands(unsigned index) {
+// CHECK: ::mlir::TypedValue<::mlir::IntegerType> getA() {
+// CHECK: ::mlir::Operation::operand_range getB() {
+// CHECK: ::mlir::OpOperand &getAMutable() {
// CHECK: ::mlir::MutableOperandRange getBMutable();
-// CHECK: ::mlir::Operation::result_range getODSResults(unsigned index);
-// CHECK: ::mlir::TypedValue<::mlir::IntegerType> getR();
-// CHECK: ::mlir::Region &getSomeRegion();
-// CHECK: ::mlir::MutableArrayRef<::mlir::Region> getSomeRegions();
-// CHECK: ::mlir::IntegerAttr getAttr1Attr()
+// CHECK: ::mlir::Operation::result_range getODSResults(unsigned index) {
+// CHECK: ::mlir::TypedValue<::mlir::IntegerType> getR() {
+// CHECK: ::mlir::Region &getSomeRegion() {
+// CHECK: ::mlir::MutableArrayRef<::mlir::Region> getSomeRegions() {
+// CHECK: ::mlir::IntegerAttr getAttr1Attr() {
// CHECK: uint32_t getAttr1();
-// CHECK: ::mlir::FloatAttr getSomeAttr2Attr()
+// CHECK: ::mlir::FloatAttr getSomeAttr2Attr() {
// CHECK: ::std::optional< ::llvm::APFloat > getSomeAttr2();
-// CHECK: ::mlir::Attribute removeSomeAttr2Attr();
+// CHECK: ::mlir::Attribute removeSomeAttr2Attr() {
// CHECK: static void build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, Value val);
// CHECK: static void build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, int integer = 0);
// CHECK{LITERAL}: [[deprecated("the deprecation message")]]
@@ -137,9 +137,9 @@ def NS_AOp : NS_Op<"a_op", [IsolatedFromAbove, IsolatedFromAbove]> {
// DEFS-SAME: p.getProperties()
// DEFS-SAME: op->getRegions()
-// DEFS: ::mlir::RegionRange AOpGenericAdaptorBase::getSomeRegions()
-// DEFS-NEXT: return odsRegions.drop_front(1);
-// DEFS: ::mlir::RegionRange AOpGenericAdaptorBase::getRegions()
+// DECLS: ::mlir::RegionRange AOpGenericAdaptorBase::getSomeRegions()
+// DECLS-NEXT: return odsRegions.drop_front(1);
+// DECLS: ::mlir::RegionRange AOpGenericAdaptorBase::getRegions()
// Check AttrSizedOperandSegments
// ---
@@ -196,9 +196,9 @@ def NS_EOp : NS_Op<"op_with_optionals", []> {
}
// CHECK-LABEL: NS::EOp declarations
-// CHECK: ::mlir::TypedValue<::mlir::IntegerType> getA();
+// CHECK: ::mlir::TypedValue<::mlir::IntegerType> getA() {
// CHECK: ::mlir::MutableOperandRange getAMutable();
-// CHECK: ::mlir::TypedValue<::mlir::FloatType> getB();
+// CHECK: ::mlir::TypedValue<::mlir::FloatType> getB() {
// CHECK: static void build(::mlir::OpBuilder &odsBuilder, ::mlir::OperationState &odsState, /*optional*/::mlir::Type b, /*optional*/::mlir::Value a)
// Check that all types match constraint results in generating builder.
diff --git a/mlir/test/mlir-tblgen/op-operand.td b/mlir/test/mlir-tblgen/op-operand.td
index 68a9def83c2e03..a749708244798c 100644
--- a/mlir/test/mlir-tblgen/op-operand.td
+++ b/mlir/test/mlir-tblgen/op-operand.td
@@ -1,4 +1,5 @@
// RUN: mlir-tblgen -gen-op-defs -I %S/../../include %s | FileCheck %s
+// RUN: mlir-tblgen -gen-op-decls -I %S/../../include %s | FileCheck %s --check-prefix=DECL
include "mlir/IR/OpBase.td"
@@ -39,11 +40,11 @@ def OpD : NS_Op<"mix_variadic_and_normal_inputs_op", [SameVariadicOperandSize]>
let arguments = (ins Variadic<AnyTensor>:$input1, AnyTensor:$input2, Variadic<AnyTensor>:$input3);
}
-// CHECK-LABEL: ::mlir::Operation::operand_range OpD::getInput1
-// CHECK-NEXT: return getODSOperands(0);
+// DECL-LABEL: ::mlir::Operation::operand_range getInput1
+// DECL-NEXT: return getODSOperands(0);
-// CHECK-LABEL: ::mlir::TypedValue<::mlir::TensorType> OpD::getInput2
-// CHECK-NEXT: return ::llvm::cast<::mlir::TypedValue<::mlir::TensorType>>(*getODSOperands(1).begin());
+// DECL-LABEL: ::mlir::TypedValue<::mlir::TensorType> getInput2
+// DECL-NEXT: return ::llvm::cast<::mlir::TypedValue<::mlir::TensorType>>(*getODSOperands(1).begin());
// CHECK-LABEL: OpD::build
// CHECK-NEXT: odsState.addOperands(input1);
diff --git a/mlir/test/mlir-tblgen/op-properties.td b/mlir/test/mlir-tblgen/op-properties.td
index a484f68fc4a11e..7b0ee6b2a1bd8f 100644
--- a/mlir/test/mlir-tblgen/op-properties.td
+++ b/mlir/test/mlir-tblgen/op-properties.td
@@ -1,4 +1,4 @@
-// RUN: mlir-tblgen -gen-op-defs -I %S/../../include %s | FileCheck %s
+// RUN: mlir-tblgen -gen-op-decls -I %S/../../include %s | FileCheck %s
include "mlir/IR/AttrTypeBase.td"
include "mlir/IR/EnumAttr.td"
@@ -15,7 +15,7 @@ def OpWithAttr : NS_Op<"op_with_attr">{
let arguments = (ins AnyAttr:$attr, OptionalAttr<AnyAttr>:$optional);
}
-// CHECK: void OpWithAttr::setAttrAttr(::mlir::Attribute attr)
+// CHECK: void setAttrAttr(::mlir::Attribute attr)
// CHECK-NEXT: getProperties().attr = attr
-// CHECK: void OpWithAttr::setOptionalAttr(::mlir::Attribute attr)
+// CHECK: void setOptionalAttr(::mlir::Attribute attr)
// CHECK-NEXT: getProperties().optional = attr
diff --git a/mlir/test/mlir-tblgen/op-result.td b/mlir/test/mlir-tblgen/op-result.td
index a4a3764aae2b24..0ca570cf8cafba 100644
--- a/mlir/test/mlir-tblgen/op-result.td
+++ b/mlir/test/mlir-tblgen/op-result.td
@@ -1,4 +1,5 @@
// RUN: mlir-tblgen -gen-op-defs -I %S/../../include %s | FileCheck %s
+// RUN: mlir-tblgen -gen-op-decls -I %S/../../include %s | FileCheck %s --check-prefix=DECL
include "mlir/IR/OpBase.td"
include "mlir/Interfaces/InferTypeOpInterface.td"
@@ -97,11 +98,11 @@ def OpI : NS_Op<"mix_variadic_and_normal_results_op", [SameVariadicResultSize]>
let results = (outs Variadic<AnyTensor>:$output1, AnyTensor:$output2, Variadic<AnyTensor>:$output3);
}
-// CHECK-LABEL: ::mlir::Operation::result_range OpI::getOutput1
-// CHECK-NEXT: return getODSResults(0);
+// DECL-LABEL: ::mlir::Operation::result_range getOutput1
+// DECL-NEXT: return getODSResults(0);
-// CHECK-LABEL: ::mlir::TypedValue<::mlir::TensorType> OpI::getOutput2
-// CHECK-NEXT: return ::llvm::cast<::mlir::TypedValue<::mlir::TensorType>>(*getODSResults(1).begin());
+// DECL-LABEL: ::mlir::TypedValue<::mlir::TensorType> getOutput2
+// DECL-NEXT: return ::llvm::cast<::mlir::TypedValue<::mlir::TensorType>>(*getODSResults(1).begin());
// CHECK-LABEL: OpI::build
// CHECK-NEXT: odsState.addTypes(output1);
diff --git a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp
index 843760d57c99d3..5739c7e1124f39 100644
--- a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp
+++ b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp
@@ -1712,7 +1712,9 @@ void OpEmitter::genAttrGetters() {
// having to use the string interface for better compile time verification.
auto emitAttrWithStorageType = [&](StringRef name, StringRef attrName,
Attribute attr) {
- auto *method = opClass.addMethod(attr.getStorageType(), name + "Attr");
+ // The method body for this getter is trivial. Emit it inline.
+ auto *method =
+ opClass.addInlineMethod(attr.getStorageType(), name + "Attr");
if (!method)
return;
method->body() << formatv(
@@ -1823,9 +1825,10 @@ void OpEmitter::genAttrSetters() {
// for better compile time verification.
auto emitAttrWithStorageType = [&](StringRef setterName, StringRef getterName,
StringRef attrName, Attribute attr) {
+ // This method body is trivial, so emit it inline.
auto *method =
- opClass.addMethod("void", setterName + "Attr",
- MethodParameter(attr.getStorageType(), "attr"));
+ opClass.addInlineMethod("void", setterName + "Attr",
+ MethodParameter(attr.getStorageType(), "attr"));
if (method)
emitSetAttr(method, getterName, attrName, "attr");
};
@@ -1912,8 +1915,8 @@ void OpEmitter::genOptionalAttrRemovers() {
// use the string interface. Enables better compile time verification.
auto emitRemoveAttr = [&](StringRef name, bool useProperties) {
auto upperInitial = name.take_front().upper();
- auto *method = opClass.addMethod("::mlir::Attribute",
- op.getRemoverName(name) + "Attr");
+ auto *method = opClass.addInlineMethod("::mlir::Attribute",
+ op.getRemoverName(name) + "Attr");
if (!method)
return;
if (useProperties) {
@@ -1952,7 +1955,11 @@ static void generateValueRangeStartAndEnd(
rangeSizeCall = "odsOperandsSize";
}
+ // Th...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/87741
More information about the Mlir-commits
mailing list