diff options
-rw-r--r-- | mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp | 12 | ||||
-rw-r--r-- | mlir/test/Dialect/OpenMP/invalid.mlir | 24 | ||||
-rw-r--r-- | mlir/test/Dialect/OpenMP/ops.mlir | 61 |
3 files changed, 95 insertions, 2 deletions
diff --git a/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp b/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp index dd701da..0f65ace 100644 --- a/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp +++ b/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp @@ -3216,7 +3216,11 @@ LogicalResult CancelOp::verify() { << "must not have a nowait clause"; } } - // TODO : Add more when we support taskgroup. + if ((cct == ClauseCancellationConstructType::Taskgroup) && + !mlir::isa<omp::TaskOp>(structuralParent)) { + return emitOpError() << "cancel taskgroup must appear " + << "inside a task region"; + } return success(); } @@ -3253,7 +3257,11 @@ LogicalResult CancellationPointOp::verify() { return emitOpError() << "cancellation point sections must appear " << "inside a sections region"; } - // TODO : Add more when we support taskgroup. + if ((cct == ClauseCancellationConstructType::Taskgroup) && + !mlir::isa<omp::TaskOp>(structuralParent)) { + return emitOpError() << "cancellation point taskgroup must appear " + << "inside a task region"; + } return success(); } diff --git a/mlir/test/Dialect/OpenMP/invalid.mlir b/mlir/test/Dialect/OpenMP/invalid.mlir index 41e1788..060b3cd 100644 --- a/mlir/test/Dialect/OpenMP/invalid.mlir +++ b/mlir/test/Dialect/OpenMP/invalid.mlir @@ -1754,6 +1754,18 @@ func.func @omp_cancel2() { // ----- +func.func @omp_cancel_taskloop() { + omp.sections { + // expected-error @below {{cancel taskgroup must appear inside a task region}} + omp.cancel cancellation_construct_type(taskgroup) + // CHECK: omp.terminator + omp.terminator + } + return +} + +// ----- + func.func @omp_cancel3(%arg1 : i32, %arg2 : i32, %arg3 : i32) -> () { omp.wsloop nowait { omp.loop_nest (%0) : i32 = (%arg1) to (%arg2) step (%arg3) { @@ -1841,6 +1853,18 @@ func.func @omp_cancellationpoint2() { // ----- +func.func @omp_cancellationpoint_taskgroup() { + omp.sections { + // expected-error @below {{cancellation point taskgroup must appear inside a task region}} + omp.cancellation_point cancellation_construct_type(taskgroup) + // CHECK: omp.terminator + omp.terminator + } + return +} + +// ----- + omp.declare_reduction @add_f32 : f32 init { ^bb0(%arg: f32): diff --git a/mlir/test/Dialect/OpenMP/ops.mlir b/mlir/test/Dialect/OpenMP/ops.mlir index d5e2bfa..a3c5917 100644 --- a/mlir/test/Dialect/OpenMP/ops.mlir +++ b/mlir/test/Dialect/OpenMP/ops.mlir @@ -2201,6 +2201,20 @@ func.func @omp_cancel_sections() -> () { return } +func.func @omp_cancel_taskgroup() -> () { + omp.taskgroup { + omp.task { + // CHECK: omp.cancel cancellation_construct_type(taskgroup) + omp.cancel cancellation_construct_type(taskgroup) + // CHECK: omp.terminator + omp.terminator + } + // CHECK: omp.terminator + omp.terminator + } + return +} + func.func @omp_cancel_parallel_nested(%if_cond : i1) -> () { omp.parallel { scf.if %if_cond { @@ -2243,6 +2257,22 @@ func.func @omp_cancel_sections_nested(%if_cond : i1) -> () { return } +func.func @omp_cancel_taskgroup_nested(%if_cond : i1) -> () { + omp.taskgroup { + omp.task { + scf.if %if_cond { + // CHECK: omp.cancel cancellation_construct_type(taskgroup) + omp.cancel cancellation_construct_type(taskgroup) + } + // CHECK: omp.terminator + omp.terminator + } + // CHECK: omp.terminator + omp.terminator + } + return +} + func.func @omp_cancellationpoint_parallel() -> () { omp.parallel { // CHECK: omp.cancellation_point cancellation_construct_type(parallel) @@ -2283,6 +2313,22 @@ func.func @omp_cancellationpoint_sections() -> () { return } +func.func @omp_cancellationpoint_taskgroup() -> () { + omp.taskgroup { + omp.task { + // CHECK: omp.cancellation_point cancellation_construct_type(taskgroup) + omp.cancellation_point cancellation_construct_type(taskgroup) + // CHECK: omp.cancel cancellation_construct_type(taskgroup) + omp.cancel cancellation_construct_type(taskgroup) + // CHECK: omp.terminator + omp.terminator + } + // CHECK: omp.terminator + omp.terminator + } + return +} + func.func @omp_cancellationpoint_parallel_nested(%if_cond : i1) -> () { omp.parallel { scf.if %if_cond { @@ -2323,6 +2369,21 @@ func.func @omp_cancellationpoint_sections_nested(%if_cond : i1) -> () { return } +func.func @omp_cancellationpoint_taskgroup_nested(%if_cond : i1) -> () { + omp.taskgroup { + omp.task { + scf.if %if_cond { + // CHECK: omp.cancellation_point cancellation_construct_type(taskgroup) + omp.cancellation_point cancellation_construct_type(taskgroup) + } + omp.terminator + } + // CHECK: omp.terminator + omp.terminator + } + return +} + // CHECK-LABEL: @omp_taskgroup_no_tasks func.func @omp_taskgroup_no_tasks() -> () { |