diff --git a/flang/lib/Lower/OpenMP.cpp b/flang/lib/Lower/OpenMP.cpp --- a/flang/lib/Lower/OpenMP.cpp +++ b/flang/lib/Lower/OpenMP.cpp @@ -837,6 +837,13 @@ /*in_reductions=*/nullptr, priorityClauseOperand, allocateOperands, allocatorOperands); createBodyOfOp(taskOp, converter, currentLocation, eval, &opClauseList); + } else if (blockDirective.v == llvm::omp::OMPD_taskgroup) { + // TODO: Add task_reduction support + auto taskGroupOp = firOpBuilder.create( + currentLocation, /*task_reduction_vars=*/ValueRange(), + /*task_reductions=*/nullptr, allocateOperands, allocatorOperands); + createBodyOfOp(taskGroupOp, converter, currentLocation, eval, + &opClauseList); } else { TODO(converter.getCurrentLocation(), "Unhandled block directive"); } diff --git a/flang/test/Fir/convert-to-llvm-openmp-and-fir.fir b/flang/test/Fir/convert-to-llvm-openmp-and-fir.fir --- a/flang/test/Fir/convert-to-llvm-openmp-and-fir.fir +++ b/flang/test/Fir/convert-to-llvm-openmp-and-fir.fir @@ -270,3 +270,30 @@ // CHECK: } // CHECK: llvm.return // CHECK: } + +// ----- + +func.func @_QPomp_taskgroup() { + omp.taskgroup { + omp.task { + fir.call @_QPwork() : () -> () + omp.terminator + } + omp.terminator + } + return +} +func.func private @_QPwork() + +// CHECK-LABEL: llvm.func @_QPomp_taskgroup() { +// CHECK: omp.taskgroup { +// CHECK: omp.task { +// CHECK: llvm.call @_QPwork() : () -> () +// CHECK: omp.terminator +// CHECK: } +// CHECK: omp.terminator +// CHECK: } +// CHECK: llvm.return +// CHECK: } +// CHECK: llvm.func @_QPwork() attributes {sym_visibility = "private"} +// CHECK: } diff --git a/flang/test/Lower/OpenMP/taskgroup.f90 b/flang/test/Lower/OpenMP/taskgroup.f90 new file mode 100644 --- /dev/null +++ b/flang/test/Lower/OpenMP/taskgroup.f90 @@ -0,0 +1,19 @@ +!RUN: %flang_fc1 -emit-fir -fopenmp %s -o - | FileCheck %s + +!CHECK-LABEL: @_QPomp_taskgroup +subroutine omp_taskgroup +use omp_lib +integer :: allocated_x +!CHECK-DAG: %{{.*}} = fir.alloca i32 {bindc_name = "allocated_x", uniq_name = "_QFomp_taskgroupEallocated_x"} +!CHECK-DAG: %{{.*}} = arith.constant 1 : i32 + +!CHECK: omp.taskgroup allocate(%{{.*}} : i32 -> %0 : !fir.ref) +!$omp taskgroup allocate(omp_high_bw_mem_alloc: allocated_x) +!$omp task +!CHECK: fir.call @_QPwork() : () -> () + call work() +!CHECK: omp.terminator +!$omp end task +!CHECK: omp.terminator +!$omp end taskgroup +end subroutine