[Mlir-commits] [mlir] 9aef0fd - [mlir][tblgen] Add additional constructor to Adaptor class (#112144)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Mon Oct 14 23:52:57 PDT 2024
Author: Matthias Springer
Date: 2024-10-15T08:52:54+02:00
New Revision: 9aef0fd52a0b2bf31cf3bae8a0693d6df8db6e04
URL: https://github.com/llvm/llvm-project/commit/9aef0fd52a0b2bf31cf3bae8a0693d6df8db6e04
DIFF: https://github.com/llvm/llvm-project/commit/9aef0fd52a0b2bf31cf3bae8a0693d6df8db6e04.diff
LOG: [mlir][tblgen] Add additional constructor to Adaptor class (#112144)
Add an additional adaptor constructor that copies everything except for
the values. The values are provided with by a second parameter.
This commit is in preparation of merging the 1:1 and 1:N dialect
conversions. As part of that, a new `matchAndRewrite` function is added.
For details, see this RFC:
https://discourse.llvm.org/t/rfc-merging-1-1-and-1-n-dialect-conversions/82513
```c++
template <typename SourceOp>
class OpConversionPattern : public ConversionPattern {
public:
using OneToNOpAdaptor =
typename SourceOp::template GenericAdaptor<ArrayRef<ArrayRef<Value>>>;
virtual LogicalResult
matchAndRewrite(SourceOp op, OneToNOpAdaptor adaptor,
ConversionPatternRewriter &rewriter) const {
SmallVector<Value> oneToOneOperands =
getOneToOneAdaptorOperands(adaptor.getOperands());
// This OpAdaptor constructor is added by this commit.
return matchAndRewrite(op, OpAdaptor(oneToOneOperands, adaptor), rewriter);
}
};
```
Added:
Modified:
mlir/test/mlir-tblgen/op-decl-and-defs.td
mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp
Removed:
################################################################################
diff --git a/mlir/test/mlir-tblgen/op-decl-and-defs.td b/mlir/test/mlir-tblgen/op-decl-and-defs.td
index f6fe45007d9e05..31dd53725c59ac 100644
--- a/mlir/test/mlir-tblgen/op-decl-and-defs.td
+++ b/mlir/test/mlir-tblgen/op-decl-and-defs.td
@@ -72,8 +72,9 @@ def NS_AOp : NS_Op<"a_op", [IsolatedFromAbove, IsolatedFromAbove]> {
// CHECK: template <typename RangeT>
// CHECK: class AOpGenericAdaptor : public detail::AOpGenericAdaptorBase {
// CHECK: public:
-// CHECK: AOpGenericAdaptor(RangeT values,
-// CHECK-SAME: odsOperands(values)
+// CHECK: AOpGenericAdaptor(RangeT values, ::mlir::DictionaryAttr attrs = {}, const ::mlir::EmptyProperties &properties = {}, ::mlir::RegionRange regions = {}) : Base(attrs, properties, regions), odsOperands(values) {}
+// CHECK: AOpGenericAdaptor(RangeT values, ::mlir::DictionaryAttr attrs, ::mlir::OpaqueProperties properties, ::mlir::RegionRange regions = {}) : AOpGenericAdaptor(values, attrs, (properties ? *properties.as<::mlir::EmptyProperties *>() : ::mlir::EmptyProperties{}), regions) {}
+// CHECK: AOpGenericAdaptor(RangeT values, const AOpGenericAdaptorBase &base) : Base(base), odsOperands(values) {}
// CHECK: RangeT getODSOperands(unsigned index) {
// CHECK: ValueT getA() {
// CHECK: RangeT getB() {
diff --git a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp
index 67df002ce38181..ce2b6ed94c3949 100644
--- a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp
+++ b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp
@@ -4282,6 +4282,19 @@ OpOperandAdaptorEmitter::OpOperandAdaptorEmitter(
}
}
+ // Create a constructor that creates a new generic adaptor by copying
+ // everything from another adaptor, except for the values.
+ {
+ SmallVector<MethodParameter> paramList;
+ paramList.emplace_back("RangeT", "values");
+ paramList.emplace_back("const " + op.getGenericAdaptorName() + "Base &",
+ "base");
+ auto *constructor =
+ genericAdaptor.addConstructor<Method::Inline>(paramList);
+ constructor->addMemberInitializer("Base", "base");
+ constructor->addMemberInitializer("odsOperands", "values");
+ }
+
// Create constructors constructing the adaptor from an instance of the op.
// This takes the attributes, properties and regions from the op instance
// and the value range from the parameter.
More information about the Mlir-commits
mailing list