diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp index b07e89d201d19..4de5ecf187a4c 100644 --- a/flang/lib/Lower/OpenMP/OpenMP.cpp +++ b/flang/lib/Lower/OpenMP/OpenMP.cpp @@ -2867,6 +2867,7 @@ static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable, !std::holds_alternative(clause.u) && !std::holds_alternative(clause.u) && !std::holds_alternative(clause.u) && + !std::holds_alternative(clause.u) && !std::holds_alternative(clause.u) && !std::holds_alternative(clause.u)) { std::string name = diff --git a/flang/test/Lower/OpenMP/Todo/task_untied.f90 b/flang/test/Lower/OpenMP/Todo/task_untied.f90 deleted file mode 100644 index 87d242ba3e9d2..0000000000000 --- a/flang/test/Lower/OpenMP/Todo/task_untied.f90 +++ /dev/null @@ -1,13 +0,0 @@ -! RUN: %not_todo_cmd bbc -emit-fir -fopenmp -o - %s 2>&1 | FileCheck %s -! RUN: %not_todo_cmd %flang_fc1 -emit-fir -fopenmp -o - %s 2>&1 | FileCheck %s - -!=============================================================================== -! `untied` clause -!=============================================================================== - -! CHECK: not yet implemented: UNTIED clause is not implemented yet -subroutine omp_task_untied() - !$omp task untied - call foo() - !$omp end task -end subroutine omp_task_untied diff --git a/flang/test/Lower/OpenMP/task.f90 b/flang/test/Lower/OpenMP/task.f90 index 6e525a044b011..a8cc16c540c9c 100644 --- a/flang/test/Lower/OpenMP/task.f90 +++ b/flang/test/Lower/OpenMP/task.f90 @@ -235,6 +235,10 @@ subroutine task_multiple_clauses() !$omp end task end subroutine task_multiple_clauses +!=============================================================================== +! `mergeable` clause +!=============================================================================== + subroutine task_mergeable() !CHECK: omp.task mergeable { !CHECK: omp.terminator @@ -242,3 +246,16 @@ subroutine task_mergeable() !$omp task mergeable !$omp end task end subroutine + +!=============================================================================== +! `untied` clause +!=============================================================================== + +!CHECK-LABEL: func.func @_QPomp_task_untied() { +subroutine omp_task_untied() + !CHECK: omp.task untied { + !$omp task untied + call foo() + !CHECK: omp.terminator + !$omp end task +end subroutine omp_task_untied diff --git a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp index 060113c412324..d591c98a5497f 100644 --- a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp @@ -258,7 +258,6 @@ static LogicalResult checkImplementationStatus(Operation &op) { checkAllocate(op, result); checkInReduction(op, result); checkPriority(op, result); - checkUntied(op, result); }) .Case([&](omp::TaskgroupOp op) { checkAllocate(op, result); @@ -268,6 +267,10 @@ static LogicalResult checkImplementationStatus(Operation &op) { checkDepend(op, result); checkNowait(op, result); }) + .Case([&](omp::TaskloopOp op) { + // TODO: Add other clauses check + checkUntied(op, result); + }) .Case([&](omp::WsloopOp op) { checkAllocate(op, result); checkLinear(op, result); diff --git a/mlir/test/Target/LLVMIR/openmp-llvm.mlir b/mlir/test/Target/LLVMIR/openmp-llvm.mlir index 5f8bdf8afdf78..8903bf283b5c7 100644 --- a/mlir/test/Target/LLVMIR/openmp-llvm.mlir +++ b/mlir/test/Target/LLVMIR/openmp-llvm.mlir @@ -3020,6 +3020,18 @@ module attributes {omp.is_target_device = true} { // ----- +llvm.func @omp_task_untied() { + // The third argument is 0: which signifies the united task + // CHECK: {{.*}} = call ptr @__kmpc_omp_task_alloc(ptr @1, i32 %{{.*}}, i32 0, + // CHECK-SAME: i64 40, i64 0, ptr @{{.*}}) + omp.task untied { + omp.terminator + } + llvm.return +} + +// ----- + // Third argument is 5: essentially (4 || 1) // signifying this task is TIED and MERGEABLE diff --git a/mlir/test/Target/LLVMIR/openmp-todo.mlir b/mlir/test/Target/LLVMIR/openmp-todo.mlir index 8f3e466cfbbeb..8ae795ec1ec6b 100644 --- a/mlir/test/Target/LLVMIR/openmp-todo.mlir +++ b/mlir/test/Target/LLVMIR/openmp-todo.mlir @@ -440,17 +440,6 @@ llvm.func @task_priority(%x : i32) { // ----- -llvm.func @task_untied() { - // expected-error@below {{not yet implemented: Unhandled clause untied in omp.task operation}} - // expected-error@below {{LLVM Translation failed for operation: omp.task}} - omp.task untied { - omp.terminator - } - llvm.return -} - -// ----- - llvm.func @taskgroup_allocate(%x : !llvm.ptr) { // expected-error@below {{not yet implemented: Unhandled clause allocate in omp.taskgroup operation}} // expected-error@below {{LLVM Translation failed for operation: omp.taskgroup}} @@ -503,6 +492,19 @@ llvm.func @taskloop(%lb : i32, %ub : i32, %step : i32) { // ----- +llvm.func @taskloop_untied(%lb : i32, %ub : i32, %step : i32) { + // expected-error@below {{not yet implemented: omp.taskloop}} + // expected-error@below {{LLVM Translation failed for operation: omp.taskloop}} + omp.taskloop untied { + omp.loop_nest (%iv) : i32 = (%lb) to (%ub) step (%step) { + omp.yield + } + } + llvm.return +} + +// ----- + llvm.func @taskwait_depend(%x: !llvm.ptr) { // expected-error@below {{not yet implemented: Unhandled clause depend in omp.taskwait operation}} // expected-error@below {{LLVM Translation failed for operation: omp.taskwait}}