aboutsummaryrefslogtreecommitdiff
path: root/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp')
-rw-r--r--mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp b/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp
index f380926..528a0d0 100644
--- a/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp
+++ b/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp
@@ -1344,6 +1344,22 @@ static LogicalResult verifyPrivateVarList(OpType &op) {
}
LogicalResult ParallelOp::verify() {
+ // Check that it is a valid loop wrapper if it's taking that role.
+ if (isa<DistributeOp>((*this)->getParentOp())) {
+ if (!isWrapper())
+ return emitOpError() << "must take a loop wrapper role if nested inside "
+ "of 'omp.distribute'";
+
+ if (LoopWrapperInterface nested = getNestedWrapper()) {
+ // Check for the allowed leaf constructs that may appear in a composite
+ // construct directly after PARALLEL.
+ if (!isa<WsloopOp>(nested))
+ return emitError() << "only supported nested wrapper is 'omp.wsloop'";
+ } else {
+ return emitOpError() << "must not wrap an 'omp.loop_nest' directly";
+ }
+ }
+
if (getAllocateVars().size() != getAllocatorsVars().size())
return emitError(
"expected equal sizes for allocate and allocator variables");