[Mlir-commits] [mlir] [MLIR][IRDL] Support camelCase segment size attributes in IRDL verifier (PR #168836)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Sun Nov 23 18:34:04 PST 2025
https://github.com/PragmaTwice updated https://github.com/llvm/llvm-project/pull/168836
>From ee7f8f585d7cd817f3a0ad8dac66becb04623dcc Mon Sep 17 00:00:00 2001
From: PragmaTwice <twice at apache.org>
Date: Thu, 20 Nov 2025 14:56:11 +0800
Subject: [PATCH 1/2] [MLIR][IRDL] Support camelCase segment size attributes in
IRDL verifier
---
mlir/lib/Dialect/IRDL/IRDLLoading.cpp | 14 ++++++++++----
mlir/test/Dialect/IRDL/variadics.mlir | 25 +++++++++++++++++++++++++
2 files changed, 35 insertions(+), 4 deletions(-)
diff --git a/mlir/lib/Dialect/IRDL/IRDLLoading.cpp b/mlir/lib/Dialect/IRDL/IRDLLoading.cpp
index 212ccc931f6e0..22b91a844fa8d 100644
--- a/mlir/lib/Dialect/IRDL/IRDLLoading.cpp
+++ b/mlir/lib/Dialect/IRDL/IRDLLoading.cpp
@@ -169,8 +169,11 @@ LogicalResult getSegmentSizes(Operation *op, StringRef elemName,
LogicalResult getOperandSegmentSizes(Operation *op,
ArrayRef<Variadicity> variadicities,
SmallVectorImpl<int> &segmentSizes) {
- return getSegmentSizes(op, "operand", "operand_segment_sizes",
- op->getNumOperands(), variadicities, segmentSizes);
+ StringRef attrName = op->getAttr("operandSegmentSizes")
+ ? "operandSegmentSizes"
+ : "operand_segment_sizes";
+ return getSegmentSizes(op, "operand", attrName, op->getNumOperands(),
+ variadicities, segmentSizes);
}
/// Compute the segment sizes of the given results.
@@ -180,8 +183,11 @@ LogicalResult getOperandSegmentSizes(Operation *op,
LogicalResult getResultSegmentSizes(Operation *op,
ArrayRef<Variadicity> variadicities,
SmallVectorImpl<int> &segmentSizes) {
- return getSegmentSizes(op, "result", "result_segment_sizes",
- op->getNumResults(), variadicities, segmentSizes);
+ StringRef attrName = op->getAttr("resultSegmentSizes")
+ ? "resultSegmentSizes"
+ : "result_segment_sizes";
+ return getSegmentSizes(op, "result", attrName, op->getNumResults(),
+ variadicities, segmentSizes);
}
/// Verify that the given operation satisfies the given constraints.
diff --git a/mlir/test/Dialect/IRDL/variadics.mlir b/mlir/test/Dialect/IRDL/variadics.mlir
index a8871fcf5ebd9..97b28e0998e00 100644
--- a/mlir/test/Dialect/IRDL/variadics.mlir
+++ b/mlir/test/Dialect/IRDL/variadics.mlir
@@ -161,6 +161,18 @@ func.func @testMultOperands(%x: i16, %y: i32, %z: i64) {
// CHECK-NEXT: "testvar.var_and_opt_operand"(%{{.*}}, %{{.*}}) {operand_segment_sizes = array<i32: 0, 1, 1>} : (i32, i64) -> ()
return
}
+// -----
+
+// Check that attribute 'operandSegmentSizes' can work well as 'operand_segment_sizes'
+func.func @testMultOperands(%x: i16, %y: i32, %z: i64) {
+ "testvar.var_and_opt_operand"(%x, %x, %z) {operandSegmentSizes = array<i32: 2, 0, 1>} : (i16, i16, i64) -> ()
+ // CHECK: "testvar.var_and_opt_operand"(%{{.*}}, %{{.*}}, %{{.*}}) {operandSegmentSizes = array<i32: 2, 0, 1>} : (i16, i16, i64) -> ()
+ "testvar.var_and_opt_operand"(%x, %x, %y, %z) {operandSegmentSizes = array<i32: 2, 1, 1>} : (i16, i16, i32, i64) -> ()
+ // CHECK-NEXT: "testvar.var_and_opt_operand"(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) {operandSegmentSizes = array<i32: 2, 1, 1>} : (i16, i16, i32, i64) -> ()
+ "testvar.var_and_opt_operand"(%y, %z) {operandSegmentSizes = array<i32: 0, 1, 1>} : (i32, i64) -> ()
+ // CHECK-NEXT: "testvar.var_and_opt_operand"(%{{.*}}, %{{.*}}) {operandSegmentSizes = array<i32: 0, 1, 1>} : (i32, i64) -> ()
+ return
+}
// -----
@@ -365,6 +377,19 @@ func.func @testMultResults() {
// -----
+// Check that attribute 'resultSegmentSizes' can work well as 'result_segment_sizes'
+func.func @testMultResults() {
+ "testvar.var_and_opt_result"() {resultSegmentSizes = array<i32: 2, 0, 1>} : () -> (i16, i16, i64)
+ // CHECK: "testvar.var_and_opt_result"() {resultSegmentSizes = array<i32: 2, 0, 1>} : () -> (i16, i16, i64)
+ "testvar.var_and_opt_result"() {resultSegmentSizes = array<i32: 2, 1, 1>} : () -> (i16, i16, i32, i64)
+ // CHECK-NEXT: "testvar.var_and_opt_result"() {resultSegmentSizes = array<i32: 2, 1, 1>} : () -> (i16, i16, i32, i64)
+ "testvar.var_and_opt_result"() {resultSegmentSizes = array<i32: 0, 1, 1>} : () -> (i32, i64)
+ // CHECK-NEXT: "testvar.var_and_opt_result"() {resultSegmentSizes = array<i32: 0, 1, 1>} : () -> (i32, i64)
+ return
+}
+
+// -----
+
// Check that the segment sizes expects non-negative values
func.func @testMultResultsSegmentNegative() {
// expected-error at +1 {{'result_segment_sizes' attribute for specifying result segments must have non-negative values}}
>From 895aa68a89a1b33d87aa0cc17190309644fef7f0 Mon Sep 17 00:00:00 2001
From: PragmaTwice <twice at apache.org>
Date: Mon, 24 Nov 2025 10:32:36 +0800
Subject: [PATCH 2/2] Drop support of operand_segment_sizes
---
mlir/lib/Dialect/IRDL/IRDLLoading.cpp | 14 ++----
mlir/test/Dialect/IRDL/variadics.mlir | 69 +++++++++------------------
2 files changed, 26 insertions(+), 57 deletions(-)
diff --git a/mlir/lib/Dialect/IRDL/IRDLLoading.cpp b/mlir/lib/Dialect/IRDL/IRDLLoading.cpp
index 22b91a844fa8d..8d10aacb53ec9 100644
--- a/mlir/lib/Dialect/IRDL/IRDLLoading.cpp
+++ b/mlir/lib/Dialect/IRDL/IRDLLoading.cpp
@@ -169,11 +169,8 @@ LogicalResult getSegmentSizes(Operation *op, StringRef elemName,
LogicalResult getOperandSegmentSizes(Operation *op,
ArrayRef<Variadicity> variadicities,
SmallVectorImpl<int> &segmentSizes) {
- StringRef attrName = op->getAttr("operandSegmentSizes")
- ? "operandSegmentSizes"
- : "operand_segment_sizes";
- return getSegmentSizes(op, "operand", attrName, op->getNumOperands(),
- variadicities, segmentSizes);
+ return getSegmentSizes(op, "operand", "operandSegmentSizes",
+ op->getNumOperands(), variadicities, segmentSizes);
}
/// Compute the segment sizes of the given results.
@@ -183,11 +180,8 @@ LogicalResult getOperandSegmentSizes(Operation *op,
LogicalResult getResultSegmentSizes(Operation *op,
ArrayRef<Variadicity> variadicities,
SmallVectorImpl<int> &segmentSizes) {
- StringRef attrName = op->getAttr("resultSegmentSizes")
- ? "resultSegmentSizes"
- : "result_segment_sizes";
- return getSegmentSizes(op, "result", attrName, op->getNumResults(),
- variadicities, segmentSizes);
+ return getSegmentSizes(op, "result", "resultSegmentSizes",
+ op->getNumResults(), variadicities, segmentSizes);
}
/// Verify that the given operation satisfies the given constraints.
diff --git a/mlir/test/Dialect/IRDL/variadics.mlir b/mlir/test/Dialect/IRDL/variadics.mlir
index 97b28e0998e00..873f2488bfd0d 100644
--- a/mlir/test/Dialect/IRDL/variadics.mlir
+++ b/mlir/test/Dialect/IRDL/variadics.mlir
@@ -133,7 +133,7 @@ func.func @testOptOperandFail(%x: i16) {
// Check that an operation with multiple variadics expects the segment size
// attribute
func.func @testMultOperandsMissingSegment(%x: i16, %z: i64) {
- // expected-error at +1 {{'operand_segment_sizes' attribute is expected but not provided}}
+ // expected-error at +1 {{'operandSegmentSizes' attribute is expected but not provided}}
"testvar.var_and_opt_operand"(%x, %x, %z) : (i16, i16, i64) -> ()
return
}
@@ -143,8 +143,8 @@ func.func @testMultOperandsMissingSegment(%x: i16, %z: i64) {
// Check that an operation with multiple variadics expects the segment size
// attribute of the right type
func.func @testMultOperandsWrongSegmentType(%x: i16, %z: i64) {
- // expected-error at +1 {{'operand_segment_sizes' attribute is expected to be a dense i32 array}}
- "testvar.var_and_opt_operand"(%x, %x, %z) {operand_segment_sizes = i32} : (i16, i16, i64) -> ()
+ // expected-error at +1 {{'operandSegmentSizes' attribute is expected to be a dense i32 array}}
+ "testvar.var_and_opt_operand"(%x, %x, %z) {operandSegmentSizes = i32} : (i16, i16, i64) -> ()
return
}
@@ -152,18 +152,6 @@ func.func @testMultOperandsWrongSegmentType(%x: i16, %z: i64) {
// Check that an operation with multiple variadics with the right segment size
// verifies.
-func.func @testMultOperands(%x: i16, %y: i32, %z: i64) {
- "testvar.var_and_opt_operand"(%x, %x, %z) {operand_segment_sizes = array<i32: 2, 0, 1>} : (i16, i16, i64) -> ()
- // CHECK: "testvar.var_and_opt_operand"(%{{.*}}, %{{.*}}, %{{.*}}) {operand_segment_sizes = array<i32: 2, 0, 1>} : (i16, i16, i64) -> ()
- "testvar.var_and_opt_operand"(%x, %x, %y, %z) {operand_segment_sizes = array<i32: 2, 1, 1>} : (i16, i16, i32, i64) -> ()
- // CHECK-NEXT: "testvar.var_and_opt_operand"(%{{.*}}, %{{.*}}, %{{.*}}, %{{.*}}) {operand_segment_sizes = array<i32: 2, 1, 1>} : (i16, i16, i32, i64) -> ()
- "testvar.var_and_opt_operand"(%y, %z) {operand_segment_sizes = array<i32: 0, 1, 1>} : (i32, i64) -> ()
- // CHECK-NEXT: "testvar.var_and_opt_operand"(%{{.*}}, %{{.*}}) {operand_segment_sizes = array<i32: 0, 1, 1>} : (i32, i64) -> ()
- return
-}
-// -----
-
-// Check that attribute 'operandSegmentSizes' can work well as 'operand_segment_sizes'
func.func @testMultOperands(%x: i16, %y: i32, %z: i64) {
"testvar.var_and_opt_operand"(%x, %x, %z) {operandSegmentSizes = array<i32: 2, 0, 1>} : (i16, i16, i64) -> ()
// CHECK: "testvar.var_and_opt_operand"(%{{.*}}, %{{.*}}, %{{.*}}) {operandSegmentSizes = array<i32: 2, 0, 1>} : (i16, i16, i64) -> ()
@@ -178,8 +166,8 @@ func.func @testMultOperands(%x: i16, %y: i32, %z: i64) {
// Check that the segment sizes expects non-negative values
func.func @testMultOperandsSegmentNegative() {
- // expected-error at +1 {{'operand_segment_sizes' attribute for specifying operand segments must have non-negative values}}
- "testvar.var_and_opt_operand"() {operand_segment_sizes = array<i32: 2, -1, 1>} : () -> ()
+ // expected-error at +1 {{'operandSegmentSizes' attribute for specifying operand segments must have non-negative values}}
+ "testvar.var_and_opt_operand"() {operandSegmentSizes = array<i32: 2, -1, 1>} : () -> ()
return
}
@@ -187,8 +175,8 @@ func.func @testMultOperandsSegmentNegative() {
// Check that the segment sizes expects 1 for single values
func.func @testMultOperandsSegmentWrongSingle() {
- // expected-error at +1 {{element 2 in 'operand_segment_sizes' attribute must be equal to 1}}
- "testvar.var_and_opt_operand"() {operand_segment_sizes = array<i32: 0, 0, 0>} : () -> ()
+ // expected-error at +1 {{element 2 in 'operandSegmentSizes' attribute must be equal to 1}}
+ "testvar.var_and_opt_operand"() {operandSegmentSizes = array<i32: 0, 0, 0>} : () -> ()
return
}
@@ -196,8 +184,8 @@ func.func @testMultOperandsSegmentWrongSingle() {
// Check that the segment sizes expects not more than 1 for optional values
func.func @testMultOperandsSegmentWrongOptional() {
- // expected-error at +1 {{element 1 in 'operand_segment_sizes' attribute must be equal to 0 or 1}}
- "testvar.var_and_opt_operand"() {operand_segment_sizes = array<i32: 0, 2, 0>} : () -> ()
+ // expected-error at +1 {{element 1 in 'operandSegmentSizes' attribute must be equal to 0 or 1}}
+ "testvar.var_and_opt_operand"() {operandSegmentSizes = array<i32: 0, 2, 0>} : () -> ()
return
}
@@ -205,8 +193,8 @@ func.func @testMultOperandsSegmentWrongOptional() {
// Check that the sum of the segment sizes should be equal to the number of operands
func.func @testMultOperandsSegmentWrongOptional(%y: i32, %z: i64) {
- // expected-error at +1 {{sum of elements in 'operand_segment_sizes' attribute must be equal to the number of operands}}
- "testvar.var_and_opt_operand"(%y, %z) {operand_segment_sizes = array<i32: 0, 0, 1>} : (i32, i64) -> ()
+ // expected-error at +1 {{sum of elements in 'operandSegmentSizes' attribute must be equal to the number of operands}}
+ "testvar.var_and_opt_operand"(%y, %z) {operandSegmentSizes = array<i32: 0, 0, 1>} : (i32, i64) -> ()
return
}
@@ -346,7 +334,7 @@ func.func @testOptResultFail() {
// Check that an operation with multiple variadics expects the segment size
// attribute
func.func @testMultResultsMissingSegment() {
- // expected-error at +1 {{'result_segment_sizes' attribute is expected but not provided}}
+ // expected-error at +1 {{'resultSegmentSizes' attribute is expected but not provided}}
"testvar.var_and_opt_result"() : () -> (i16, i16, i64)
return
}
@@ -356,8 +344,8 @@ func.func @testMultResultsMissingSegment() {
// Check that an operation with multiple variadics expects the segment size
// attribute of the right type
func.func @testMultResultsWrongSegmentType() {
- // expected-error at +1 {{'result_segment_sizes' attribute is expected to be a dense i32 array}}
- "testvar.var_and_opt_result"() {result_segment_sizes = i32} : () -> (i16, i16, i64)
+ // expected-error at +1 {{'resultSegmentSizes' attribute is expected to be a dense i32 array}}
+ "testvar.var_and_opt_result"() {resultSegmentSizes = i32} : () -> (i16, i16, i64)
return
}
@@ -365,19 +353,6 @@ func.func @testMultResultsWrongSegmentType() {
// Check that an operation with multiple variadics with the right segment size
// verifies.
-func.func @testMultResults() {
- "testvar.var_and_opt_result"() {result_segment_sizes = array<i32: 2, 0, 1>} : () -> (i16, i16, i64)
- // CHECK: "testvar.var_and_opt_result"() {result_segment_sizes = array<i32: 2, 0, 1>} : () -> (i16, i16, i64)
- "testvar.var_and_opt_result"() {result_segment_sizes = array<i32: 2, 1, 1>} : () -> (i16, i16, i32, i64)
- // CHECK-NEXT: "testvar.var_and_opt_result"() {result_segment_sizes = array<i32: 2, 1, 1>} : () -> (i16, i16, i32, i64)
- "testvar.var_and_opt_result"() {result_segment_sizes = array<i32: 0, 1, 1>} : () -> (i32, i64)
- // CHECK-NEXT: "testvar.var_and_opt_result"() {result_segment_sizes = array<i32: 0, 1, 1>} : () -> (i32, i64)
- return
-}
-
-// -----
-
-// Check that attribute 'resultSegmentSizes' can work well as 'result_segment_sizes'
func.func @testMultResults() {
"testvar.var_and_opt_result"() {resultSegmentSizes = array<i32: 2, 0, 1>} : () -> (i16, i16, i64)
// CHECK: "testvar.var_and_opt_result"() {resultSegmentSizes = array<i32: 2, 0, 1>} : () -> (i16, i16, i64)
@@ -392,8 +367,8 @@ func.func @testMultResults() {
// Check that the segment sizes expects non-negative values
func.func @testMultResultsSegmentNegative() {
- // expected-error at +1 {{'result_segment_sizes' attribute for specifying result segments must have non-negative values}}
- "testvar.var_and_opt_result"() {result_segment_sizes = array<i32: 2, -1, 1>} : () -> ()
+ // expected-error at +1 {{'resultSegmentSizes' attribute for specifying result segments must have non-negative values}}
+ "testvar.var_and_opt_result"() {resultSegmentSizes = array<i32: 2, -1, 1>} : () -> ()
return
}
@@ -401,8 +376,8 @@ func.func @testMultResultsSegmentNegative() {
// Check that the segment sizes expects 1 for single values
func.func @testMultResultsSegmentWrongSingle() {
- // expected-error at +1 {{element 2 in 'result_segment_sizes' attribute must be equal to 1}}
- "testvar.var_and_opt_result"() {result_segment_sizes = array<i32: 0, 0, 0>} : () -> ()
+ // expected-error at +1 {{element 2 in 'resultSegmentSizes' attribute must be equal to 1}}
+ "testvar.var_and_opt_result"() {resultSegmentSizes = array<i32: 0, 0, 0>} : () -> ()
return
}
@@ -410,8 +385,8 @@ func.func @testMultResultsSegmentWrongSingle() {
// Check that the segment sizes expects not more than 1 for optional values
func.func @testMultResultsSegmentWrongOptional() {
- // expected-error at +1 {{element 1 in 'result_segment_sizes' attribute must be equal to 0 or 1}}
- "testvar.var_and_opt_result"() {result_segment_sizes = array<i32: 0, 2, 0>} : () -> ()
+ // expected-error at +1 {{element 1 in 'resultSegmentSizes' attribute must be equal to 0 or 1}}
+ "testvar.var_and_opt_result"() {resultSegmentSizes = array<i32: 0, 2, 0>} : () -> ()
return
}
@@ -419,7 +394,7 @@ func.func @testMultResultsSegmentWrongOptional() {
// Check that the sum of the segment sizes should be equal to the number of results
func.func @testMultResultsSegmentWrongOptional() {
- // expected-error at +1 {{sum of elements in 'result_segment_sizes' attribute must be equal to the number of results}}
- "testvar.var_and_opt_result"() {result_segment_sizes = array<i32: 0, 0, 1>} : () -> (i32, i64)
+ // expected-error at +1 {{sum of elements in 'resultSegmentSizes' attribute must be equal to the number of results}}
+ "testvar.var_and_opt_result"() {resultSegmentSizes = array<i32: 0, 0, 1>} : () -> (i32, i64)
return
}
More information about the Mlir-commits
mailing list