[Mlir-commits] [mlir] 0f52f4d - [mlir][ods] Emit "trivial" ODS getter/setters inline (#87741)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Fri Apr 5 19:01:41 PDT 2024
Author: Jeff Niu
Date: 2024-04-06T04:01:37+02:00
New Revision: 0f52f4ddd909eb38f2a691ffed8469263fe5f635
URL: https://github.com/llvm/llvm-project/commit/0f52f4ddd909eb38f2a691ffed8469263fe5f635
DIFF: https://github.com/llvm/llvm-project/commit/0f52f4ddd909eb38f2a691ffed8469263fe5f635.diff
LOG: [mlir][ods] Emit "trivial" ODS getter/setters inline (#87741)
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).
Added:
Modified:
mlir/include/mlir/TableGen/Class.h
mlir/test/mlir-tblgen/op-attribute.td
mlir/test/mlir-tblgen/op-decl-and-defs.td
mlir/test/mlir-tblgen/op-operand.td
mlir/test/mlir-tblgen/op-properties.td
mlir/test/mlir-tblgen/op-result.td
mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp
Removed:
################################################################################
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";
}
+ // The method is trivial if the operation does not have any variadic operands.
+ // In that case, make sure to generate it in-line.
auto *method = opClass.addMethod("std::pair<unsigned, unsigned>", methodName,
+ numVariadic == 0 ? Method::Properties::Inline
+ : Method::Properties::None,
parameters);
if (!method)
return;
@@ -2054,17 +2061,19 @@ generateNamedOperandGetters(const Operator &op, Class &opClass,
// Generate trampoline for calling 'getODSOperandIndexAndLength' with just
// the index. This just calls the implementation in the base class but
// passes the operand size as parameter.
- Method *method = opClass.addMethod("std::pair<unsigned, unsigned>",
- "getODSOperandIndexAndLength",
- MethodParameter("unsigned", "index"));
+ Method *method = opClass.addInlineMethod(
+ "std::pair<unsigned, unsigned>", "getODSOperandIndexAndLength",
+ MethodParameter("unsigned", "index"));
ERROR_IF_PRUNED(method, "getODSOperandIndexAndLength", op);
MethodBody &body = method->body();
body.indent() << formatv(
"return Base::getODSOperandIndexAndLength(index, {0});", rangeSizeCall);
}
- auto *m = opClass.addMethod(rangeType, "getODSOperands",
- MethodParameter("unsigned", "index"));
+ // The implementation of this method is trivial and it is very load-bearing.
+ // Generate it inline.
+ auto *m = opClass.addInlineMethod(rangeType, "getODSOperands",
+ MethodParameter("unsigned", "index"));
ERROR_IF_PRUNED(m, "getODSOperands", op);
auto &body = m->body();
body << formatv(valueRangeReturnCode, rangeBeginCall,
@@ -2078,10 +2087,10 @@ generateNamedOperandGetters(const Operator &op, Class &opClass,
continue;
std::string name = op.getGetterName(operand.name);
if (operand.isOptional()) {
- m = opClass.addMethod(isGenericAdaptorBase
- ? rangeElementType
- : generateTypeForGetter(operand),
- name);
+ m = opClass.addInlineMethod(isGenericAdaptorBase
+ ? rangeElementType
+ : generateTypeForGetter(operand),
+ name);
ERROR_IF_PRUNED(m, name, op);
m->body().indent() << formatv("auto operands = getODSOperands({0});\n"
"return operands.empty() ? {1}{{} : ",
@@ -2100,19 +2109,19 @@ generateNamedOperandGetters(const Operator &op, Class &opClass,
continue;
}
- m = opClass.addMethod("::mlir::OperandRangeRange", name);
+ m = opClass.addInlineMethod("::mlir::OperandRangeRange", name);
ERROR_IF_PRUNED(m, name, op);
m->body() << " return getODSOperands(" << i << ").split(" << segmentAttr
<< "Attr());";
} else if (operand.isVariadic()) {
- m = opClass.addMethod(rangeType, name);
+ m = opClass.addInlineMethod(rangeType, name);
ERROR_IF_PRUNED(m, name, op);
m->body() << " return getODSOperands(" << i << ");";
} else {
- m = opClass.addMethod(isGenericAdaptorBase
- ? rangeElementType
- : generateTypeForGetter(operand),
- name);
+ m = opClass.addInlineMethod(isGenericAdaptorBase
+ ? rangeElementType
+ : generateTypeForGetter(operand),
+ name);
ERROR_IF_PRUNED(m, name, op);
m->body().indent() << "return ";
if (!isGenericAdaptorBase)
@@ -2164,12 +2173,16 @@ void OpEmitter::genNamedOperandSetters() {
} else {
returnType = "::mlir::OpOperand &";
}
- auto *m = opClass.addMethod(returnType, name + "Mutable");
+ bool isVariadicOperand =
+ operand.isVariadicOfVariadic() || operand.isVariableLength();
+ auto *m = opClass.addMethod(returnType, name + "Mutable",
+ isVariadicOperand ? Method::Properties::None
+ : Method::Properties::Inline);
ERROR_IF_PRUNED(m, name, op);
auto &body = m->body();
body << " auto range = getODSOperandIndexAndLength(" << i << ");\n";
- if (!operand.isVariadicOfVariadic() && !operand.isVariableLength()) {
+ if (!isVariadicOperand) {
// In case of a single operand, return a single OpOperand.
body << " return getOperation()->getOpOperand(range.first);\n";
continue;
@@ -2254,9 +2267,11 @@ void OpEmitter::genNamedResultGetters() {
numVariadicResults, numNormalResults, "getOperation()->getNumResults()",
attrSizedResults, attrSizeInitCode, op.getResults());
- auto *m =
- opClass.addMethod("::mlir::Operation::result_range", "getODSResults",
- MethodParameter("unsigned", "index"));
+ // The implementation of this method is trivial and it is very load-bearing.
+ // Generate it inline.
+ auto *m = opClass.addInlineMethod("::mlir::Operation::result_range",
+ "getODSResults",
+ MethodParameter("unsigned", "index"));
ERROR_IF_PRUNED(m, "getODSResults", op);
m->body() << formatv(valueRangeReturnCode, "getOperation()->result_begin()",
"getODSResultIndexAndLength(index)");
@@ -2267,7 +2282,7 @@ void OpEmitter::genNamedResultGetters() {
continue;
std::string name = op.getGetterName(result.name);
if (result.isOptional()) {
- m = opClass.addMethod(generateTypeForGetter(result), name);
+ m = opClass.addInlineMethod(generateTypeForGetter(result), name);
ERROR_IF_PRUNED(m, name, op);
m->body() << " auto results = getODSResults(" << i << ");\n"
<< llvm::formatv(" return results.empty()"
@@ -2275,11 +2290,11 @@ void OpEmitter::genNamedResultGetters() {
" : ::llvm::cast<{0}>(*results.begin());",
m->getReturnType());
} else if (result.isVariadic()) {
- m = opClass.addMethod("::mlir::Operation::result_range", name);
+ m = opClass.addInlineMethod("::mlir::Operation::result_range", name);
ERROR_IF_PRUNED(m, name, op);
m->body() << " return getODSResults(" << i << ");";
} else {
- m = opClass.addMethod(generateTypeForGetter(result), name);
+ m = opClass.addInlineMethod(generateTypeForGetter(result), name);
ERROR_IF_PRUNED(m, name, op);
m->body() << llvm::formatv(
" return ::llvm::cast<{0}>(*getODSResults({1}).begin());",
@@ -2298,15 +2313,15 @@ void OpEmitter::genNamedRegionGetters() {
// Generate the accessors for a variadic region.
if (region.isVariadic()) {
- auto *m =
- opClass.addMethod("::mlir::MutableArrayRef<::mlir::Region>", name);
+ auto *m = opClass.addInlineMethod(
+ "::mlir::MutableArrayRef<::mlir::Region>", name);
ERROR_IF_PRUNED(m, name, op);
m->body() << formatv(" return (*this)->getRegions().drop_front({0});",
i);
continue;
}
- auto *m = opClass.addMethod("::mlir::Region &", name);
+ auto *m = opClass.addInlineMethod("::mlir::Region &", name);
ERROR_IF_PRUNED(m, name, op);
m->body() << formatv(" return (*this)->getRegion({0});", i);
}
@@ -2321,7 +2336,7 @@ void OpEmitter::genNamedSuccessorGetters() {
std::string name = op.getGetterName(successor.name);
// Generate the accessors for a variadic successor list.
if (successor.isVariadic()) {
- auto *m = opClass.addMethod("::mlir::SuccessorRange", name);
+ auto *m = opClass.addInlineMethod("::mlir::SuccessorRange", name);
ERROR_IF_PRUNED(m, name, op);
m->body() << formatv(
" return {std::next((*this)->successor_begin(), {0}), "
@@ -2330,7 +2345,7 @@ void OpEmitter::genNamedSuccessorGetters() {
continue;
}
- auto *m = opClass.addMethod("::mlir::Block *", name);
+ auto *m = opClass.addInlineMethod("::mlir::Block *", name);
ERROR_IF_PRUNED(m, name, op);
m->body() << formatv(" return (*this)->getSuccessor({0});", i);
}
@@ -4148,8 +4163,12 @@ OpOperandAdaptorEmitter::OpOperandAdaptorEmitter(
// Generate named accessor with Attribute return type.
auto emitAttrWithStorageType = [&](StringRef name, StringRef emitName,
Attribute attr) {
- auto *method =
- genericAdaptorBase.addMethod(attr.getStorageType(), emitName + "Attr");
+ // The method body is trivial if the attribute does not have a default
+ // value, in which case the default value may be arbitrary code.
+ auto *method = genericAdaptorBase.addMethod(
+ attr.getStorageType(), emitName + "Attr",
+ attr.hasDefaultValue() ? Method::Properties::None
+ : Method::Properties::Inline);
ERROR_IF_PRUNED(method, "Adaptor::" + emitName + "Attr", op);
auto &body = method->body().indent();
if (!useProperties)
@@ -4179,8 +4198,8 @@ OpOperandAdaptorEmitter::OpOperandAdaptorEmitter(
m->body() << " return properties;";
}
{
- auto *m =
- genericAdaptorBase.addMethod("::mlir::DictionaryAttr", "getAttributes");
+ auto *m = genericAdaptorBase.addInlineMethod("::mlir::DictionaryAttr",
+ "getAttributes");
ERROR_IF_PRUNED(m, "Adaptor::getAttributes", op);
m->body() << " return odsAttrs;";
}
@@ -4203,21 +4222,21 @@ OpOperandAdaptorEmitter::OpOperandAdaptorEmitter(
// Generate the accessors for a variadic region.
std::string name = op.getGetterName(region.name);
if (region.isVariadic()) {
- auto *m = genericAdaptorBase.addMethod("::mlir::RegionRange", name);
+ auto *m = genericAdaptorBase.addInlineMethod("::mlir::RegionRange", name);
ERROR_IF_PRUNED(m, "Adaptor::" + name, op);
m->body() << formatv(" return odsRegions.drop_front({0});", i);
continue;
}
- auto *m = genericAdaptorBase.addMethod("::mlir::Region &", name);
+ auto *m = genericAdaptorBase.addInlineMethod("::mlir::Region &", name);
ERROR_IF_PRUNED(m, "Adaptor::" + name, op);
m->body() << formatv(" return *odsRegions[{0}];", i);
}
if (numRegions > 0) {
// Any invalid overlap for `getRegions` will have been diagnosed before
// here already.
- if (auto *m =
- genericAdaptorBase.addMethod("::mlir::RegionRange", "getRegions"))
+ if (auto *m = genericAdaptorBase.addInlineMethod("::mlir::RegionRange",
+ "getRegions"))
m->body() << " return odsRegions;";
}
More information about the Mlir-commits
mailing list