[llvm] c685f82 - [mlir][OpenMP] Add omp.cancel and omp.cancellationpoint.
Rumeet Dhindsa via llvm-commits
llvm-commits at lists.llvm.org
Mon May 2 11:47:00 PDT 2022
Hi Raghu,
I see a warning with this change:
clang/lib/CodeGen/CGStmtOpenMP.cpp:6166:11: warning: enumeration value
'OMPC_cancellation_construct_type' not handled in switch [-Wswitch]
switch (Kind) {
^
It also needs to be added to the switch statement for emitOMPAtomicExpr.
Can you please also add it there.
Thanks,
Rumeet
On Mon, May 2, 2022 at 10:24 AM Raghu Maddhipatla via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
>
> Author: Raghu Maddhipatla
> Date: 2022-05-02T12:23:38-05:00
> New Revision: c685f8212689665968de47f8bd4b1146296e8cc2
>
> URL:
> https://github.com/llvm/llvm-project/commit/c685f8212689665968de47f8bd4b1146296e8cc2
> DIFF:
> https://github.com/llvm/llvm-project/commit/c685f8212689665968de47f8bd4b1146296e8cc2.diff
>
> LOG: [mlir][OpenMP] Add omp.cancel and omp.cancellationpoint.
>
> Reviewed By: kiranchandramohan, peixin, shraiysh
>
> Differential Revision: https://reviews.llvm.org/D123828
>
> Added:
>
>
> Modified:
> flang/lib/Semantics/check-omp-structure.cpp
> llvm/include/llvm/Frontend/OpenMP/OMP.td
> mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td
> mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp
> mlir/test/Dialect/OpenMP/invalid.mlir
> mlir/test/Dialect/OpenMP/ops.mlir
>
> Removed:
>
>
>
>
> ################################################################################
> diff --git a/flang/lib/Semantics/check-omp-structure.cpp
> b/flang/lib/Semantics/check-omp-structure.cpp
> index cf56efb632d0f..83acaba367ffd 100644
> --- a/flang/lib/Semantics/check-omp-structure.cpp
> +++ b/flang/lib/Semantics/check-omp-structure.cpp
> @@ -1806,6 +1806,7 @@ CHECK_SIMPLE_CLAUSE(MemoryOrder, OMPC_memory_order)
> CHECK_SIMPLE_CLAUSE(Bind, OMPC_bind)
> CHECK_SIMPLE_CLAUSE(Align, OMPC_align)
> CHECK_SIMPLE_CLAUSE(Compare, OMPC_compare)
> +CHECK_SIMPLE_CLAUSE(CancellationConstructType,
> OMPC_cancellation_construct_type)
>
> CHECK_REQ_SCALAR_INT_CLAUSE(Grainsize, OMPC_grainsize)
> CHECK_REQ_SCALAR_INT_CLAUSE(NumTasks, OMPC_num_tasks)
>
> diff --git a/llvm/include/llvm/Frontend/OpenMP/OMP.td
> b/llvm/include/llvm/Frontend/OpenMP/OMP.td
> index e5a1dd3931247..9575f6df6caea 100644
> --- a/llvm/include/llvm/Frontend/OpenMP/OMP.td
> +++ b/llvm/include/llvm/Frontend/OpenMP/OMP.td
> @@ -163,6 +163,25 @@ def OMPC_MemoryOrder : Clause<"memory_order"> {
> ];
> }
>
> +def OMP_CANCELLATION_CONSTRUCT_Parallel : ClauseVal<"parallel", 1, 1> {}
> +def OMP_CANCELLATION_CONSTRUCT_Loop : ClauseVal<"loop", 2, 1> {}
> +def OMP_CANCELLATION_CONSTRUCT_Sections : ClauseVal<"sections", 3, 1> {}
> +def OMP_CANCELLATION_CONSTRUCT_Taskgroup : ClauseVal<"taskgroup", 4, 1> {}
> +def OMP_CANCELLATION_CONSTRUCT_None : ClauseVal<"none", 5, 0> {
> + let isDefault = 1;
> +}
> +
> +def OMPC_CancellationConstructType :
> Clause<"cancellation_construct_type"> {
> + let enumClauseValue = "CancellationConstructType";
> + let allowedClauseValues = [
> + OMP_CANCELLATION_CONSTRUCT_Parallel,
> + OMP_CANCELLATION_CONSTRUCT_Loop,
> + OMP_CANCELLATION_CONSTRUCT_Sections,
> + OMP_CANCELLATION_CONSTRUCT_Taskgroup,
> + OMP_CANCELLATION_CONSTRUCT_None
> + ];
> +}
> +
> def OMPC_Ordered : Clause<"ordered"> {
> let clangClass = "OMPOrderedClause";
> let flangClass = "ScalarIntConstantExpr";
>
> diff --git a/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td
> b/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td
> index bc5a7ff89783f..e69891ec9abf3 100644
> --- a/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td
> +++ b/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td
> @@ -998,6 +998,40 @@ def ThreadprivateOp : OpenMP_Op<"threadprivate"> {
> }];
> }
>
>
> +//===----------------------------------------------------------------------===//
> +// 2.18.1 Cancel Construct
>
> +//===----------------------------------------------------------------------===//
> +def CancelOp : OpenMP_Op<"cancel"> {
> + let summary = "cancel directive";
> + let description = [{
> + The cancel construct activates cancellation of the innermost enclosing
> + region of the type specified.
> + }];
> + let arguments = (ins
> CancellationConstructTypeAttr:$cancellation_construct_type_val,
> + Optional<I1>:$if_expr);
> + let assemblyFormat = [{ `cancellation_construct_type` `(`
> +
> custom<ClauseAttr>($cancellation_construct_type_val) `)`
> + ( `if` `(` $if_expr^ `)` )? attr-dict}];
> + let hasVerifier = 1;
> +}
> +
>
> +//===----------------------------------------------------------------------===//
> +// 2.18.2 Cancellation Point Construct
>
> +//===----------------------------------------------------------------------===//
> +def CancellationPointOp : OpenMP_Op<"cancellationpoint"> {
> + let summary = "cancellation point directive";
> + let description = [{
> + The cancellation point construct introduces a user-defined
> cancellation
> + point at which implicit or explicit tasks check if cancellation of the
> + innermost enclosing region of the type specified has been activated.
> + }];
> + let arguments = (ins
> CancellationConstructTypeAttr:$cancellation_construct_type_val);
> + let assemblyFormat = [{ `cancellation_construct_type` `(`
> +
> custom<ClauseAttr>($cancellation_construct_type_val) `)`
> + attr-dict}];
> + let hasVerifier = 1;
> +}
> +
>
> //===----------------------------------------------------------------------===//
> // 2.19.5.7 declare reduction Directive
>
> //===----------------------------------------------------------------------===//
>
> diff --git a/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp
> b/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp
> index fa2becae7e637..5540eec8f3005 100644
> --- a/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp
> +++ b/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp
> @@ -950,6 +950,80 @@ LogicalResult AtomicCaptureOp::verifyRegions() {
> return success();
> }
>
>
> +//===----------------------------------------------------------------------===//
> +// Verifier for CancelOp
>
> +//===----------------------------------------------------------------------===//
> +
> +LogicalResult CancelOp::verify() {
> + ClauseCancellationConstructType cct = cancellation_construct_type_val();
> + Operation *parentOp = (*this)->getParentOp();
> +
> + if (!parentOp) {
> + return emitOpError() << "must be used within a region supporting "
> + "cancel directive";
> + }
> +
> + if ((cct == ClauseCancellationConstructType::Parallel) &&
> + !isa<ParallelOp>(parentOp)) {
> + return emitOpError() << "cancel parallel must appear "
> + << "inside a parallel region";
> + } else if (cct == ClauseCancellationConstructType::Loop) {
> + if (!isa<WsLoopOp>(parentOp)) {
> + return emitOpError() << "cancel loop must appear "
> + << "inside a worksharing-loop region";
> + } else {
> + if (cast<WsLoopOp>(parentOp).nowaitAttr()) {
> + return emitError() << "A worksharing construct that is canceled "
> + << "must not have a nowait clause";
> + } else if (cast<WsLoopOp>(parentOp).ordered_valAttr()) {
> + return emitError() << "A worksharing construct that is canceled "
> + << "must not have an ordered clause";
> + }
> + }
> + } else if (cct == ClauseCancellationConstructType::Sections) {
> + if (!(isa<SectionsOp>(parentOp) || isa<SectionOp>(parentOp))) {
> + return emitOpError() << "cancel sections must appear "
> + << "inside a sections region";
> + }
> + if (parentOp->getParentOp() &&
> isa<SectionsOp>(parentOp->getParentOp()) &&
> + cast<SectionsOp>(parentOp->getParentOp()).nowaitAttr()) {
> + return emitError() << "A sections construct that is canceled "
> + << "must not have a nowait clause";
> + }
> + }
> + // TODO : Add more when we support taskgroup.
> + return success();
> +}
>
> +//===----------------------------------------------------------------------===//
> +// Verifier for CancelOp
>
> +//===----------------------------------------------------------------------===//
> +
> +LogicalResult CancellationPointOp::verify() {
> + ClauseCancellationConstructType cct = cancellation_construct_type_val();
> + Operation *parentOp = (*this)->getParentOp();
> +
> + if (!parentOp) {
> + return emitOpError() << "must be used within a region supporting "
> + "cancellation point directive";
> + }
> +
> + if ((cct == ClauseCancellationConstructType::Parallel) &&
> + !(isa<ParallelOp>(parentOp))) {
> + return emitOpError() << "cancellation point parallel must appear "
> + << "inside a parallel region";
> + } else if ((cct == ClauseCancellationConstructType::Loop) &&
> + !isa<WsLoopOp>(parentOp)) {
> + return emitOpError() << "cancellation point loop must appear "
> + << "inside a worksharing-loop region";
> + } else if ((cct == ClauseCancellationConstructType::Sections) &&
> + !(isa<SectionsOp>(parentOp) || isa<SectionOp>(parentOp))) {
> + return emitOpError() << "cancellation point sections must appear "
> + << "inside a sections region";
> + }
> + // TODO : Add more when we support taskgroup.
> + return success();
> +}
> +
> #define GET_ATTRDEF_CLASSES
> #include "mlir/Dialect/OpenMP/OpenMPOpsAttributes.cpp.inc"
>
>
> diff --git a/mlir/test/Dialect/OpenMP/invalid.mlir
> b/mlir/test/Dialect/OpenMP/invalid.mlir
> index e88c7c4b70597..61e44b04593bd 100644
> --- a/mlir/test/Dialect/OpenMP/invalid.mlir
> +++ b/mlir/test/Dialect/OpenMP/invalid.mlir
> @@ -1143,3 +1143,116 @@ func.func @omp_task(%mem: memref<1xf32>) {
> }
> return
> }
> +
> +// -----
> +
> +func @omp_cancel() {
> + omp.sections {
> + // expected-error @below {{cancel parallel must appear inside a
> parallel region}}
> + omp.cancel cancellation_construct_type(parallel)
> + // CHECK: omp.terminator
> + omp.terminator
> + }
> + return
> +}
> +
> +// -----
> +
> +func @omp_cancel1() {
> + omp.parallel {
> + // expected-error @below {{cancel sections must appear inside a
> sections region}}
> + omp.cancel cancellation_construct_type(sections)
> + // CHECK: omp.terminator
> + omp.terminator
> + }
> + return
> +}
> +
> +// -----
> +
> +func @omp_cancel2() {
> + omp.sections {
> + // expected-error @below {{cancel loop must appear inside a
> worksharing-loop region}}
> + omp.cancel cancellation_construct_type(loop)
> + // CHECK: omp.terminator
> + omp.terminator
> + }
> + return
> +}
> +
> +// -----
> +
> +func @omp_cancel3(%arg1 : i32, %arg2 : i32, %arg3 : i32) -> () {
> + omp.wsloop nowait
> + for (%0) : i32 = (%arg1) to (%arg2) step (%arg3) {
> + // expected-error @below {{A worksharing construct that is canceled
> must not have a nowait clause}}
> + omp.cancel cancellation_construct_type(loop)
> + // CHECK: omp.terminator
> + omp.terminator
> + }
> + return
> +}
> +
> +// -----
> +
> +func @omp_cancel4(%arg1 : i32, %arg2 : i32, %arg3 : i32) -> () {
> + omp.wsloop ordered(1)
> + for (%0) : i32 = (%arg1) to (%arg2) step (%arg3) {
> + // expected-error @below {{A worksharing construct that is canceled
> must not have an ordered clause}}
> + omp.cancel cancellation_construct_type(loop)
> + // CHECK: omp.terminator
> + omp.terminator
> + }
> + return
> +}
> +
> +// -----
> +
> +func @omp_cancel5() -> () {
> + omp.sections nowait {
> + omp.section {
> + // expected-error @below {{A sections construct that is canceled
> must not have a nowait clause}}
> + omp.cancel cancellation_construct_type(sections)
> + omp.terminator
> + }
> + // CHECK: omp.terminator
> + omp.terminator
> + }
> + return
> +}
> +
> +// -----
> +
> +func @omp_cancellationpoint() {
> + omp.sections {
> + // expected-error @below {{cancellation point parallel must appear
> inside a parallel region}}
> + omp.cancellationpoint cancellation_construct_type(parallel)
> + // CHECK: omp.terminator
> + omp.terminator
> + }
> + return
> +}
> +
> +// -----
> +
> +func @omp_cancellationpoint1() {
> + omp.parallel {
> + // expected-error @below {{cancellation point sections must appear
> inside a sections region}}
> + omp.cancellationpoint cancellation_construct_type(sections)
> + // CHECK: omp.terminator
> + omp.terminator
> + }
> + return
> +}
> +
> +// -----
> +
> +func @omp_cancellationpoint2() {
> + omp.sections {
> + // expected-error @below {{cancellation point loop must appear inside
> a worksharing-loop region}}
> + omp.cancellationpoint cancellation_construct_type(loop)
> + // CHECK: omp.terminator
> + omp.terminator
> + }
> + return
> +}
>
> diff --git a/mlir/test/Dialect/OpenMP/ops.mlir
> b/mlir/test/Dialect/OpenMP/ops.mlir
> index 15ec6f796b880..9dd76c4dfc2ac 100644
> --- a/mlir/test/Dialect/OpenMP/ops.mlir
> +++ b/mlir/test/Dialect/OpenMP/ops.mlir
> @@ -1276,3 +1276,77 @@ func.func @omp_threadprivate() {
> }
>
> llvm.mlir.global internal @_QFsubEx() : i32
> +
> +func @omp_cancel_parallel(%if_cond : i1) -> () {
> + // Test with optional operand; if_expr.
> + omp.parallel {
> + // CHECK: omp.cancel cancellation_construct_type(parallel) if(%{{.*}})
> + omp.cancel cancellation_construct_type(parallel) if(%if_cond)
> + // CHECK: omp.terminator
> + omp.terminator
> + }
> + return
> +}
> +
> +func @omp_cancel_wsloop(%lb : index, %ub : index, %step : index) {
> + omp.wsloop
> + for (%iv) : index = (%lb) to (%ub) step (%step) {
> + // CHECK: omp.cancel cancellation_construct_type(loop)
> + omp.cancel cancellation_construct_type(loop)
> + // CHECK: omp.terminator
> + omp.terminator
> + }
> + return
> +}
> +
> +func @omp_cancel_sections() -> () {
> + omp.sections {
> + omp.section {
> + // CHECK: omp.cancel cancellation_construct_type(sections)
> + omp.cancel cancellation_construct_type(sections)
> + omp.terminator
> + }
> + // CHECK: omp.terminator
> + omp.terminator
> + }
> + return
> +}
> +
> +func @omp_cancellationpoint_parallel() -> () {
> + omp.parallel {
> + // CHECK: omp.cancellationpoint cancellation_construct_type(parallel)
> + omp.cancellationpoint cancellation_construct_type(parallel)
> + // CHECK: omp.cancel cancellation_construct_type(parallel)
> + omp.cancel cancellation_construct_type(parallel)
> + omp.terminator
> + }
> + return
> +}
> +
> +func @omp_cancellationpoint_wsloop(%lb : index, %ub : index, %step :
> index) {
> + omp.wsloop
> + for (%iv) : index = (%lb) to (%ub) step (%step) {
> + // CHECK: omp.cancellationpoint cancellation_construct_type(loop)
> + omp.cancellationpoint cancellation_construct_type(loop)
> + // CHECK: omp.cancel cancellation_construct_type(loop)
> + omp.cancel cancellation_construct_type(loop)
> + // CHECK: omp.terminator
> + omp.terminator
> + }
> + return
> +}
> +
> +func @omp_cancellationpoint_sections() -> () {
> + omp.sections {
> + omp.section {
> + // CHECK: omp.cancellationpoint
> cancellation_construct_type(sections)
> + omp.cancellationpoint cancellation_construct_type(sections)
> + // CHECK: omp.cancel cancellation_construct_type(sections)
> + omp.cancel cancellation_construct_type(sections)
> + omp.terminator
> + }
> + // CHECK: omp.terminator
> + omp.terminator
> + }
> + return
> +}
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220502/7f1cc88f/attachment.html>
More information about the llvm-commits
mailing list