[Mlir-commits] [mlir] d1a688c - [mlir-c] Add Region iterators matching Block & Operation ones
Jacques Pienaar
llvmlistbot at llvm.org
Tue Nov 9 17:53:08 PST 2021
Author: Jacques Pienaar
Date: 2021-11-09T17:52:56-08:00
New Revision: d1a688ce0e19754b7eecfe56ddf14cc7bc6813ef
URL: https://github.com/llvm/llvm-project/commit/d1a688ce0e19754b7eecfe56ddf14cc7bc6813ef
DIFF: https://github.com/llvm/llvm-project/commit/d1a688ce0e19754b7eecfe56ddf14cc7bc6813ef.diff
LOG: [mlir-c] Add Region iterators matching Block & Operation ones
Enables using the same iterator interface to these even though underlying storage is different.
Differential Revision: https://reviews.llvm.org/D113512
Added:
Modified:
mlir/include/mlir-c/IR.h
mlir/lib/CAPI/IR/IR.cpp
mlir/test/CAPI/ir.c
Removed:
################################################################################
diff --git a/mlir/include/mlir-c/IR.h b/mlir/include/mlir-c/IR.h
index 1610191256eea..6c1a92cea01d0 100644
--- a/mlir/include/mlir-c/IR.h
+++ b/mlir/include/mlir-c/IR.h
@@ -517,6 +517,13 @@ MLIR_CAPI_EXPORTED void mlirRegionInsertOwnedBlockBefore(MlirRegion region,
MlirBlock reference,
MlirBlock block);
+/// Returns first region attached to the operation.
+MLIR_CAPI_EXPORTED MlirRegion mlirOperationGetFirstRegion(MlirOperation op);
+
+/// Returns the region immediately following the given region in its parent
+/// operation.
+MLIR_CAPI_EXPORTED MlirRegion mlirRegionGetNextInOperation(MlirRegion region);
+
//===----------------------------------------------------------------------===//
// Block API.
//===----------------------------------------------------------------------===//
diff --git a/mlir/lib/CAPI/IR/IR.cpp b/mlir/lib/CAPI/IR/IR.cpp
index 13490b342d9f7..8bed10a9d9d56 100644
--- a/mlir/lib/CAPI/IR/IR.cpp
+++ b/mlir/lib/CAPI/IR/IR.cpp
@@ -379,6 +379,22 @@ MlirRegion mlirOperationGetRegion(MlirOperation op, intptr_t pos) {
return wrap(&unwrap(op)->getRegion(static_cast<unsigned>(pos)));
}
+MlirRegion mlirOperationGetFirstRegion(MlirOperation op) {
+ Operation *cppOp = unwrap(op);
+ if (cppOp->getNumRegions() == 0)
+ return wrap(static_cast<Region *>(nullptr));
+ return wrap(&cppOp->getRegion(0));
+}
+
+MlirRegion mlirRegionGetNextInOperation(MlirRegion region) {
+ Region *cppRegion = unwrap(region);
+ Operation *parent = cppRegion->getParentOp();
+ intptr_t next = cppRegion->getRegionNumber() + 1;
+ if (parent->getNumRegions() > next)
+ return wrap(&parent->getRegion(next));
+ return wrap(static_cast<Region *>(nullptr));
+}
+
MlirOperation mlirOperationGetNextInBlock(MlirOperation op) {
return wrap(unwrap(op)->getNextNode());
}
diff --git a/mlir/test/CAPI/ir.c b/mlir/test/CAPI/ir.c
index 1056f65080be7..ac74c5748286d 100644
--- a/mlir/test/CAPI/ir.c
+++ b/mlir/test/CAPI/ir.c
@@ -226,8 +226,8 @@ int collectStatsSingle(OpListNode *head, ModuleStats *stats) {
++stats->numOpResults;
}
- for (unsigned i = 0; i < numRegions; ++i) {
- MlirRegion region = mlirOperationGetRegion(operation, i);
+ MlirRegion region = mlirOperationGetFirstRegion(operation);
+ while (!mlirRegionIsNull(region)) {
for (MlirBlock block = mlirRegionGetFirstBlock(region);
!mlirBlockIsNull(block); block = mlirBlockGetNextInRegion(block)) {
++stats->numBlocks;
@@ -255,6 +255,7 @@ int collectStatsSingle(OpListNode *head, ModuleStats *stats) {
head->next = node;
}
}
+ region = mlirRegionGetNextInOperation(region);
}
return 0;
}
More information about the Mlir-commits
mailing list