[Mlir-commits] [mlir] 5762bd6 - [mlir] [tblgen-to-irdl] Add region support (#110512)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Wed Oct 2 17:26:55 PDT 2024
Author: Alex Rice
Date: 2024-10-03T01:26:52+01:00
New Revision: 5762bd60d64ed63f2f1774c41b31a84f7a677524
URL: https://github.com/llvm/llvm-project/commit/5762bd60d64ed63f2f1774c41b31a84f7a677524
DIFF: https://github.com/llvm/llvm-project/commit/5762bd60d64ed63f2f1774c41b31a84f7a677524.diff
LOG: [mlir] [tblgen-to-irdl] Add region support (#110512)
Adds support to exporting regions.
Added:
Modified:
mlir/include/mlir/IR/OpBase.td
mlir/test/tblgen-to-irdl/TestDialect.td
mlir/tools/tblgen-to-irdl/OpDefinitionsGen.cpp
Removed:
################################################################################
diff --git a/mlir/include/mlir/IR/OpBase.td b/mlir/include/mlir/IR/OpBase.td
index 4481e56615b8bf..5c82c041c62eeb 100644
--- a/mlir/include/mlir/IR/OpBase.td
+++ b/mlir/include/mlir/IR/OpBase.td
@@ -206,7 +206,9 @@ def AnyRegion : Region<CPred<"true">, "any region">;
// A region with the given number of blocks.
class SizedRegion<int numBlocks> : Region<
CPred<"::llvm::hasNItems($_self, " # numBlocks # ")">,
- "region with " # numBlocks # " blocks">;
+ "region with " # numBlocks # " blocks"> {
+ int blocks = numBlocks;
+}
// A region with at least the given number of blocks.
class MinSizedRegion<int numBlocks> : Region<
diff --git a/mlir/test/tblgen-to-irdl/TestDialect.td b/mlir/test/tblgen-to-irdl/TestDialect.td
index 1ba84a5d3683d4..7f4815d865b60b 100644
--- a/mlir/test/tblgen-to-irdl/TestDialect.td
+++ b/mlir/test/tblgen-to-irdl/TestDialect.td
@@ -106,6 +106,17 @@ def Test_OrOp : Test_Op<"or"> {
// CHECK-NEXT: irdl.operands(%[[v3]])
// CHECK-NEXT: }
+// Check regions are converted correctly.
+def Test_RegionsOp : Test_Op<"regions"> {
+ let regions = (region AnyRegion:$any_region,
+ SizedRegion<1>:$single_block_region);
+}
+// CHECK-LABEL: irdl.operation @regions {
+// CHECK-NEXT: %[[v0:[^ ]*]] = irdl.region
+// CHECK-NEXT: %[[v1:[^ ]*]] = irdl.region with size 1
+// CHECK-NEXT: irdl.regions(%[[v0]], %[[v1]])
+// CHECK-NEXT: }
+
// Check that various types are converted correctly.
def Test_TypesOp : Test_Op<"types"> {
let arguments = (ins I32:$a,
diff --git a/mlir/tools/tblgen-to-irdl/OpDefinitionsGen.cpp b/mlir/tools/tblgen-to-irdl/OpDefinitionsGen.cpp
index f0fd5bba1a65a1..ace1029b4e7ff0 100644
--- a/mlir/tools/tblgen-to-irdl/OpDefinitionsGen.cpp
+++ b/mlir/tools/tblgen-to-irdl/OpDefinitionsGen.cpp
@@ -340,6 +340,29 @@ Value createAttrConstraint(OpBuilder &builder, tblgen::Constraint constraint) {
return createPredicate(builder, constraint.getPredicate());
}
+Value createRegionConstraint(OpBuilder &builder, tblgen::Region constraint) {
+ MLIRContext *ctx = builder.getContext();
+ const Record &predRec = constraint.getDef();
+
+ if (predRec.getName() == "AnyRegion") {
+ ValueRange entryBlockArgs = {};
+ auto op =
+ builder.create<irdl::RegionOp>(UnknownLoc::get(ctx), entryBlockArgs);
+ return op.getResult();
+ }
+
+ if (predRec.isSubClassOf("SizedRegion")) {
+ ValueRange entryBlockArgs = {};
+ auto ty = IntegerType::get(ctx, 32);
+ auto op = builder.create<irdl::RegionOp>(
+ UnknownLoc::get(ctx), entryBlockArgs,
+ IntegerAttr::get(ty, predRec.getValueAsInt("blocks")));
+ return op.getResult();
+ }
+
+ return createPredicate(builder, constraint.getPredicate());
+}
+
/// Returns the name of the operation without the dialect prefix.
static StringRef getOperatorName(tblgen::Operator &tblgenOp) {
StringRef opName = tblgenOp.getDef().getValueAsString("opName");
@@ -406,6 +429,12 @@ irdl::OperationOp createIRDLOperation(OpBuilder &builder,
attrNames.push_back(StringAttr::get(ctx, namedAttr.name));
}
+ SmallVector<Value> regions;
+ for (auto namedRegion : tblgenOp.getRegions()) {
+ regions.push_back(
+ createRegionConstraint(consBuilder, namedRegion.constraint));
+ }
+
// Create the operands and results operations.
if (!operands.empty())
consBuilder.create<irdl::OperandsOp>(UnknownLoc::get(ctx), operands,
@@ -416,6 +445,8 @@ irdl::OperationOp createIRDLOperation(OpBuilder &builder,
if (!attributes.empty())
consBuilder.create<irdl::AttributesOp>(UnknownLoc::get(ctx), attributes,
ArrayAttr::get(ctx, attrNames));
+ if (!regions.empty())
+ consBuilder.create<irdl::RegionsOp>(UnknownLoc::get(ctx), regions);
return op;
}
More information about the Mlir-commits
mailing list