Lower Fortran OpenMP `taskgroup` to FIR + OpenMP Dialect.
Reviewed By: kiranchandramohan, peixin
Differential Revision: https://reviews.llvm.org/D133918
/*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<mlir::omp::TaskGroupOp>(
+ currentLocation, /*task_reduction_vars=*/ValueRange(),
+ /*task_reductions=*/nullptr, allocateOperands, allocatorOperands);
+ createBodyOfOp(taskGroupOp, converter, currentLocation, eval,
+ &opClauseList);
} else {
TODO(converter.getCurrentLocation(), "Unhandled block directive");
}
// 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: }
--- /dev/null
+!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<i32>)
+!$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