[Mlir-commits] [mlir] [mlir] [irdl] Optional attributes in irdl (PR #110981)
Alex Rice
llvmlistbot at llvm.org
Thu Feb 20 10:22:36 PST 2025
https://github.com/alexarice updated https://github.com/llvm/llvm-project/pull/110981
>From 936e69fffdc404433fd95e3a6f9899b6e399579a Mon Sep 17 00:00:00 2001
From: Alex Rice <alexrice999 at hotmail.co.uk>
Date: Thu, 22 Aug 2024 16:29:27 +0100
Subject: [PATCH 1/2] Optional attributes
---
mlir/include/mlir/Dialect/IRDL/IR/IRDLOps.td | 5 +-
mlir/lib/Dialect/IRDL/IR/IRDL.cpp | 42 ++++++++++++---
.../test/Dialect/IRDL/attributes-op.irdl.mlir | 11 ++--
.../Dialect/IRDL/variadics-error.irdl.mlir | 52 +++++++++++++++++-
mlir/test/Dialect/IRDL/variadics.irdl.mlir | 53 ++++++++++++-------
.../tools/tblgen-to-irdl/OpDefinitionsGen.cpp | 14 +++--
6 files changed, 141 insertions(+), 36 deletions(-)
diff --git a/mlir/include/mlir/Dialect/IRDL/IR/IRDLOps.td b/mlir/include/mlir/Dialect/IRDL/IR/IRDLOps.td
index f3bc3497500e7..32365e90607bc 100644
--- a/mlir/include/mlir/Dialect/IRDL/IR/IRDLOps.td
+++ b/mlir/include/mlir/Dialect/IRDL/IR/IRDLOps.td
@@ -328,9 +328,10 @@ def IRDL_AttributesOp : IRDL_Op<"attributes", [HasParent<"OperationOp">]> {
}];
let arguments = (ins Variadic<IRDL_AttributeType>:$attributeValues,
- StrArrayAttr:$attributeValueNames);
+ StrArrayAttr:$attributeValueNames,
+ VariadicityArrayAttr:$variadicity);
let assemblyFormat = [{
- custom<AttributesOp>($attributeValues, $attributeValueNames) attr-dict
+ custom<AttributesOp>($attributeValues, $attributeValueNames, $variadicity) attr-dict
}];
let hasVerifier = true;
diff --git a/mlir/lib/Dialect/IRDL/IR/IRDL.cpp b/mlir/lib/Dialect/IRDL/IR/IRDL.cpp
index c0778d478619a..641f8b7eef285 100644
--- a/mlir/lib/Dialect/IRDL/IR/IRDL.cpp
+++ b/mlir/lib/Dialect/IRDL/IR/IRDL.cpp
@@ -186,11 +186,29 @@ LogicalResult ResultsOp::verify() {
LogicalResult AttributesOp::verify() {
size_t namesSize = getAttributeValueNames().size();
size_t valuesSize = getAttributeValues().size();
+ auto variadicities = getVariadicity();
+ size_t numVariadicities = variadicities.size();
+
+ if (numVariadicities != valuesSize)
+ return emitOpError()
+ << "the number of attributes and their variadicities must be "
+ "the same, but got "
+ << valuesSize << " and " << numVariadicities << " respectively";
+
+ for (size_t i = 0; i < numVariadicities; ++i) {
+ if (variadicities[i].getValue() == Variadicity::variadic) {
+ // auto test =
+ return emitOpError() << "requires attributes to have single or optional variadicity, but " << getAttributeValueNames()[i]
+ << " was specified as variadic.";
+
+
+ }
+ }
if (namesSize != valuesSize)
return emitOpError()
<< "the number of attribute names and their constraints must be "
- "the same but got "
+ "the same, but got "
<< namesSize << " and " << valuesSize << " respectively";
return success();
@@ -383,13 +401,18 @@ static void printNamedValueListWithVariadicity(
static ParseResult
parseAttributesOp(OpAsmParser &p,
SmallVectorImpl<OpAsmParser::UnresolvedOperand> &attrOperands,
- ArrayAttr &attrNamesAttr) {
+ ArrayAttr &attrNamesAttr,
+ VariadicityArrayAttr &variadicityAttr) {
Builder &builder = p.getBuilder();
+ MLIRContext *ctx = builder.getContext();
SmallVector<Attribute> attrNames;
+ SmallVector<VariadicityAttr> variadicities;
+
if (succeeded(p.parseOptionalLBrace())) {
auto parseOperands = [&]() {
if (p.parseAttribute(attrNames.emplace_back()) || p.parseEqual() ||
- p.parseOperand(attrOperands.emplace_back()))
+ parseValueWithVariadicity(p, attrOperands.emplace_back(),
+ variadicities.emplace_back()))
return failure();
return success();
};
@@ -397,16 +420,23 @@ parseAttributesOp(OpAsmParser &p,
return failure();
}
attrNamesAttr = builder.getArrayAttr(attrNames);
+ variadicityAttr = VariadicityArrayAttr::get(ctx, variadicities);
return success();
}
static void printAttributesOp(OpAsmPrinter &p, AttributesOp op,
- OperandRange attrArgs, ArrayAttr attrNames) {
+ OperandRange attrArgs, ArrayAttr attrNames,
+ VariadicityArrayAttr variadicityAttr) {
if (attrNames.empty())
return;
p << "{";
- interleaveComma(llvm::seq<int>(0, attrNames.size()), p,
- [&](int i) { p << attrNames[i] << " = " << attrArgs[i]; });
+ interleaveComma(llvm::seq<int>(0, attrNames.size()), p, [&](int i) {
+ Variadicity variadicity = variadicityAttr[i].getValue();
+ p << attrNames[i] << " = ";
+ if (variadicity != Variadicity::single)
+ p << stringifyVariadicity(variadicity) << " ";
+ p << attrArgs[i];
+ });
p << '}';
}
diff --git a/mlir/test/Dialect/IRDL/attributes-op.irdl.mlir b/mlir/test/Dialect/IRDL/attributes-op.irdl.mlir
index 89a059803a86f..4f38aa80e6e8d 100644
--- a/mlir/test/Dialect/IRDL/attributes-op.irdl.mlir
+++ b/mlir/test/Dialect/IRDL/attributes-op.irdl.mlir
@@ -1,11 +1,12 @@
// RUN: mlir-opt %s -verify-diagnostics -split-input-file
+
irdl.dialect @errors {
irdl.operation @attrs1 {
%0 = irdl.is i32
%1 = irdl.is i64
- // expected-error at +1 {{'irdl.attributes' op the number of attribute names and their constraints must be the same but got 1 and 2 respectively}}
- "irdl.attributes"(%0, %1) <{attributeValueNames = ["attr1"]}> : (!irdl.attribute, !irdl.attribute) -> ()
+ // expected-error at +1 {{'irdl.attributes' op the number of attribute names and their constraints must be the same, but got 1 and 2 respectively}}
+ "irdl.attributes"(%0, %1) <{attributeValueNames = ["attr1"], variadicity = #irdl<variadicity_array[ single, single]>}> : (!irdl.attribute, !irdl.attribute) -> ()
}
}
@@ -15,8 +16,8 @@ irdl.dialect @errors {
irdl.operation @attrs2 {
%0 = irdl.is i32
%1 = irdl.is i64
-
- // expected-error at +1 {{'irdl.attributes' op the number of attribute names and their constraints must be the same but got 2 and 1 respectively}}
- "irdl.attributes"(%0) <{attributeValueNames = ["attr1", "attr2"]}> : (!irdl.attribute) -> ()
+
+ // expected-error at +1 {{'irdl.attributes' op the number of attribute names and their constraints must be the same, but got 2 and 1 respectively}}
+ "irdl.attributes"(%0) <{attributeValueNames = ["attr1", "attr2"], variadicity = #irdl<variadicity_array[ single]>}> : (!irdl.attribute) -> ()
}
}
diff --git a/mlir/test/Dialect/IRDL/variadics-error.irdl.mlir b/mlir/test/Dialect/IRDL/variadics-error.irdl.mlir
index 3e29dd837916b..86758fb97ac75 100644
--- a/mlir/test/Dialect/IRDL/variadics-error.irdl.mlir
+++ b/mlir/test/Dialect/IRDL/variadics-error.irdl.mlir
@@ -14,7 +14,7 @@ irdl.dialect @errors {
irdl.dialect @errors {
irdl.operation @operands2 {
%0 = irdl.is i32
-
+
// expected-error at +1 {{'irdl.operands' op the number of operands and their variadicities must be the same, but got 1 and 2 respectively}}
"irdl.operands"(%0) <{names = ["foo"], variadicity = #irdl<variadicity_array[single, single]>}> : (!irdl.attribute) -> ()
}
@@ -36,8 +36,56 @@ irdl.dialect @errors {
irdl.dialect @errors {
irdl.operation @results2 {
%0 = irdl.is i32
-
+
// expected-error at +1 {{'irdl.results' op the number of results and their variadicities must be the same, but got 1 and 2 respectively}}
"irdl.results"(%0) <{names = ["foo"], variadicity = #irdl<variadicity_array[single, single]>}> : (!irdl.attribute) -> ()
}
}
+
+// -----
+
+irdl.dialect @errors {
+ irdl.operation @no_var {
+ %0 = irdl.is i32
+ %1 = irdl.is i64
+
+ // expected-error at +1 {{'irdl.attributes' op requires attribute 'variadicity'}}
+ "irdl.attributes"(%0) <{attributeValueNames = ["attr1"]}> : (!irdl.attribute) -> ()
+ }
+}
+
+// -----
+
+irdl.dialect @errors {
+ irdl.operation @attrs1 {
+ %0 = irdl.is i32
+ %1 = irdl.is i64
+
+ // expected-error at +1 {{'irdl.attributes' op the number of attributes and their variadicities must be the same, but got 2 and 1 respectively}}
+ "irdl.attributes"(%0, %1) <{attributeValueNames = ["attr1", "attr2"], variadicity = #irdl<variadicity_array[ single]>}> : (!irdl.attribute, !irdl.attribute) -> ()
+ }
+}
+
+// -----
+
+irdl.dialect @errors {
+ irdl.operation @attrs2 {
+ %0 = irdl.is i32
+ %1 = irdl.is i64
+
+ // expected-error at +1 {{'irdl.attributes' op the number of attributes and their variadicities must be the same, but got 1 and 2 respectively}}
+ "irdl.attributes"(%0) <{attributeValueNames = ["attr1"], variadicity = #irdl<variadicity_array[ single, single]>}> : (!irdl.attribute) -> ()
+ }
+}
+
+// -----
+
+irdl.dialect @errors {
+ irdl.operation @attrs_variadic {
+ %0 = irdl.is i32
+
+ // expected-error at +1 {{'irdl.attributes' op requires attributes to have single or optional variadicity, but "attr1" was specified as variadic}}
+ "irdl.attributes"(%0) <{attributeValueNames = ["attr1"], variadicity = #irdl<variadicity_array[ variadic]>}> : (!irdl.attribute) -> ()
+ }
+}
+
diff --git a/mlir/test/Dialect/IRDL/variadics.irdl.mlir b/mlir/test/Dialect/IRDL/variadics.irdl.mlir
index 5118320f6d2e8..73d303941e99f 100644
--- a/mlir/test/Dialect/IRDL/variadics.irdl.mlir
+++ b/mlir/test/Dialect/IRDL/variadics.irdl.mlir
@@ -13,9 +13,9 @@ irdl.dialect @testvar {
}
// CHECK-LABEL: irdl.operation @var_operand {
- // CHECK-NEXT: %[[v0:[^ ]*]] = irdl.is i16
- // CHECK-NEXT: %[[v1:[^ ]*]] = irdl.is i32
- // CHECK-NEXT: %[[v2:[^ ]*]] = irdl.is i64
+ // CHECK-NEXT: %[[v0:[^ ]*]] = irdl.is i16
+ // CHECK-NEXT: %[[v1:[^ ]*]] = irdl.is i32
+ // CHECK-NEXT: %[[v2:[^ ]*]] = irdl.is i64
// CHECK-NEXT: irdl.operands(foo: %[[v0]], bar: variadic %[[v1]], baz: %[[v2]])
// CHECK-NEXT: }
irdl.operation @var_operand {
@@ -26,9 +26,9 @@ irdl.dialect @testvar {
}
// CHECK-LABEL: irdl.operation @opt_operand {
- // CHECK-NEXT: %[[v0:[^ ]*]] = irdl.is i16
- // CHECK-NEXT: %[[v1:[^ ]*]] = irdl.is i32
- // CHECK-NEXT: %[[v2:[^ ]*]] = irdl.is i64
+ // CHECK-NEXT: %[[v0:[^ ]*]] = irdl.is i16
+ // CHECK-NEXT: %[[v1:[^ ]*]] = irdl.is i32
+ // CHECK-NEXT: %[[v2:[^ ]*]] = irdl.is i64
// CHECK-NEXT: irdl.operands(foo: %[[v0]], bar: optional %[[v1]], baz: %[[v2]])
// CHECK-NEXT: }
irdl.operation @opt_operand {
@@ -39,9 +39,9 @@ irdl.dialect @testvar {
}
// CHECK-LABEL: irdl.operation @var_and_opt_operand {
- // CHECK-NEXT: %[[v0:[^ ]*]] = irdl.is i16
- // CHECK-NEXT: %[[v1:[^ ]*]] = irdl.is i32
- // CHECK-NEXT: %[[v2:[^ ]*]] = irdl.is i64
+ // CHECK-NEXT: %[[v0:[^ ]*]] = irdl.is i16
+ // CHECK-NEXT: %[[v1:[^ ]*]] = irdl.is i32
+ // CHECK-NEXT: %[[v2:[^ ]*]] = irdl.is i64
// CHECK-NEXT: irdl.operands(foo: variadic %[[v0]], bar: optional %[[v1]], baz: %[[v2]])
// CHECK-NEXT: }
irdl.operation @var_and_opt_operand {
@@ -62,9 +62,9 @@ irdl.dialect @testvar {
}
// CHECK-LABEL: irdl.operation @var_result {
- // CHECK-NEXT: %[[v0:[^ ]*]] = irdl.is i16
- // CHECK-NEXT: %[[v1:[^ ]*]] = irdl.is i32
- // CHECK-NEXT: %[[v2:[^ ]*]] = irdl.is i64
+ // CHECK-NEXT: %[[v0:[^ ]*]] = irdl.is i16
+ // CHECK-NEXT: %[[v1:[^ ]*]] = irdl.is i32
+ // CHECK-NEXT: %[[v2:[^ ]*]] = irdl.is i64
// CHECK-NEXT: irdl.results(foo: %[[v0]], bar: variadic %[[v1]], baz: %[[v2]])
// CHECK-NEXT: }
irdl.operation @var_result {
@@ -75,9 +75,9 @@ irdl.dialect @testvar {
}
// CHECK-LABEL: irdl.operation @opt_result {
- // CHECK-NEXT: %[[v0:[^ ]*]] = irdl.is i16
- // CHECK-NEXT: %[[v1:[^ ]*]] = irdl.is i32
- // CHECK-NEXT: %[[v2:[^ ]*]] = irdl.is i64
+ // CHECK-NEXT: %[[v0:[^ ]*]] = irdl.is i16
+ // CHECK-NEXT: %[[v1:[^ ]*]] = irdl.is i32
+ // CHECK-NEXT: %[[v2:[^ ]*]] = irdl.is i64
// CHECK-NEXT: irdl.results(foo: %[[v0]], bar: optional %[[v1]], baz: %[[v2]])
// CHECK-NEXT: }
irdl.operation @opt_result {
@@ -88,9 +88,9 @@ irdl.dialect @testvar {
}
// CHECK-LABEL: irdl.operation @var_and_opt_result {
- // CHECK-NEXT: %[[v0:[^ ]*]] = irdl.is i16
- // CHECK-NEXT: %[[v1:[^ ]*]] = irdl.is i32
- // CHECK-NEXT: %[[v2:[^ ]*]] = irdl.is i64
+ // CHECK-NEXT: %[[v0:[^ ]*]] = irdl.is i16
+ // CHECK-NEXT: %[[v1:[^ ]*]] = irdl.is i32
+ // CHECK-NEXT: %[[v2:[^ ]*]] = irdl.is i64
// CHECK-NEXT: irdl.results(foo: variadic %[[v0]], bar: optional %[[v1]], baz: %[[v2]])
// CHECK-NEXT: }
irdl.operation @var_and_opt_result {
@@ -99,4 +99,21 @@ irdl.dialect @testvar {
%2 = irdl.is i64
irdl.results(foo: variadic %0, bar: optional %1, baz: %2)
}
+
+ // CHECK-LABEL: irdl.operation @var_attr {
+ // CHECK-NEXT: %[[v0:[^ ]*]] = irdl.is i16
+ // CHECK-NEXT: %[[v1:[^ ]*]] = irdl.is i32
+ // CHECK-NEXT: %[[v2:[^ ]*]] = irdl.is i64
+ // CHECK-NEXT: irdl.attributes {"optional" = optional %[[v0]], "single" = %[[v1]], "single_no_word" = %[[v2]]}
+ // CHECK-NEXT: }
+ irdl.operation @var_attr {
+ %0 = irdl.is i16
+ %1 = irdl.is i32
+ %2 = irdl.is i64
+ irdl.attributes {
+ "optional" = optional %0,
+ "single" = single %1,
+ "single_no_word" = %2
+ }
+ }
}
diff --git a/mlir/tools/tblgen-to-irdl/OpDefinitionsGen.cpp b/mlir/tools/tblgen-to-irdl/OpDefinitionsGen.cpp
index c2ad09ffaaed5..2cb603e27c417 100644
--- a/mlir/tools/tblgen-to-irdl/OpDefinitionsGen.cpp
+++ b/mlir/tools/tblgen-to-irdl/OpDefinitionsGen.cpp
@@ -454,11 +454,18 @@ irdl::OperationOp createIRDLOperation(OpBuilder &builder,
SmallVector<Value> attributes;
SmallVector<Attribute> attrNames;
+ SmallVector<irdl::VariadicityAttr> attrVariadicity;
for (auto namedAttr : tblgenOp.getAttributes()) {
+ irdl::VariadicityAttr var;
if (namedAttr.attr.isOptional())
- continue;
+ var = consBuilder.getAttr<irdl::VariadicityAttr>(
+ irdl::Variadicity::optional);
+ else
+ var =
+ consBuilder.getAttr<irdl::VariadicityAttr>(irdl::Variadicity::single);
attributes.push_back(createAttrConstraint(consBuilder, namedAttr.attr));
attrNames.push_back(StringAttr::get(ctx, namedAttr.name));
+ attrVariadicity.push_back(var);
}
SmallVector<Value> regions;
@@ -479,8 +486,9 @@ irdl::OperationOp createIRDLOperation(OpBuilder &builder,
ArrayAttr::get(ctx, resultNames),
resultVariadicity);
if (!attributes.empty())
- consBuilder.create<irdl::AttributesOp>(UnknownLoc::get(ctx), attributes,
- ArrayAttr::get(ctx, attrNames));
+ consBuilder.create<irdl::AttributesOp>(
+ UnknownLoc::get(ctx), attributes, ArrayAttr::get(ctx, attrNames),
+ irdl::VariadicityArrayAttr::get(ctx, attrVariadicity));
if (!regions.empty())
consBuilder.create<irdl::RegionsOp>(UnknownLoc::get(ctx), regions,
ArrayAttr::get(ctx, regionNames));
>From 8f664e87df3ddc38087826e351b6da286b0a1ccb Mon Sep 17 00:00:00 2001
From: Alex Rice <alexrice999 at hotmail.co.uk>
Date: Thu, 20 Feb 2025 18:22:25 +0000
Subject: [PATCH 2/2] formatting
---
mlir/lib/Dialect/IRDL/IR/IRDL.cpp | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/mlir/lib/Dialect/IRDL/IR/IRDL.cpp b/mlir/lib/Dialect/IRDL/IR/IRDL.cpp
index 641f8b7eef285..2f2646a43d3b6 100644
--- a/mlir/lib/Dialect/IRDL/IR/IRDL.cpp
+++ b/mlir/lib/Dialect/IRDL/IR/IRDL.cpp
@@ -198,10 +198,10 @@ LogicalResult AttributesOp::verify() {
for (size_t i = 0; i < numVariadicities; ++i) {
if (variadicities[i].getValue() == Variadicity::variadic) {
// auto test =
- return emitOpError() << "requires attributes to have single or optional variadicity, but " << getAttributeValueNames()[i]
+ return emitOpError() << "requires attributes to have single or optional "
+ "variadicity, but "
+ << getAttributeValueNames()[i]
<< " was specified as variadic.";
-
-
}
}
More information about the Mlir-commits
mailing list