[flang][OpenMP] Lower OpenMP `taskgroup` construct
authorSourabh Singh Tomar <SourabhSingh.Tomar@amd.com>
Thu, 15 Sep 2022 07:04:38 +0000 (12:34 +0530)
committerSourabh Singh Tomar <SourabhSingh.Tomar@amd.com>
Fri, 16 Sep 2022 15:37:47 +0000 (21:07 +0530)
Lower Fortran OpenMP `taskgroup` to FIR + OpenMP Dialect.

Reviewed By: kiranchandramohan, peixin

Differential Revision: https://reviews.llvm.org/D133918

flang/lib/Lower/OpenMP.cpp
flang/test/Fir/convert-to-llvm-openmp-and-fir.fir
flang/test/Lower/OpenMP/taskgroup.f90 [new file with mode: 0644]

index 6391845..ae21ae9 100644 (file)
@@ -837,6 +837,13 @@ genOMP(Fortran::lower::AbstractConverter &converter,
         /*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");
   }
index d40e69d..b6e97d9 100644 (file)
@@ -270,3 +270,30 @@ func.func @_QPsimdloop_with_nested_loop() {
 // 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 (file)
index 0000000..0cac784
--- /dev/null
@@ -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<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