From: Sourabh Singh Tomar Date: Thu, 15 Sep 2022 07:04:38 +0000 (+0530) Subject: [flang][OpenMP] Lower OpenMP `taskgroup` construct X-Git-Tag: upstream/17.0.6~33346 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=396ed327bbb1f7c3a2a0fca429debb3ca12b0523;p=platform%2Fupstream%2Fllvm.git [flang][OpenMP] Lower OpenMP `taskgroup` construct Lower Fortran OpenMP `taskgroup` to FIR + OpenMP Dialect. Reviewed By: kiranchandramohan, peixin Differential Revision: https://reviews.llvm.org/D133918 --- diff --git a/flang/lib/Lower/OpenMP.cpp b/flang/lib/Lower/OpenMP.cpp index 6391845..ae21ae9 100644 --- a/flang/lib/Lower/OpenMP.cpp +++ b/flang/lib/Lower/OpenMP.cpp @@ -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( + 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 index d40e69d..b6e97d9 100644 --- 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 @@ 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 index 0000000..0cac784 --- /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