diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp index 90fc1f80f57ab..83aebdaecd350 100644 --- a/flang/lib/Lower/OpenMP/OpenMP.cpp +++ b/flang/lib/Lower/OpenMP/OpenMP.cpp @@ -1810,7 +1810,11 @@ genOMP(Fortran::lower::AbstractConverter &converter, /*outerCombined=*/false); break; case llvm::omp::Directive::OMPD_workshare: - TODO(currentLocation, "Workshare construct"); + // FIXME: Workshare is not a commonly used OpenMP construct, an + // implementation for this feature will come later. For the codes + // that use this construct, add a single construct for now. + genSingleOp(converter, semaCtx, eval, /*genNested=*/true, currentLocation, + beginClauseList, endClauseList); break; default: singleDirective = false; @@ -1845,7 +1849,8 @@ genOMP(Fortran::lower::AbstractConverter &converter, } if ((llvm::omp::workShareSet & llvm::omp::blockConstructSet) .test(directive.v)) { - TODO(currentLocation, "Workshare construct"); + genSingleOp(converter, semaCtx, eval, /*genNested=*/false, currentLocation, + beginClauseList, endClauseList); combinedDirective = true; } if (!combinedDirective) diff --git a/flang/test/Lower/OpenMP/workshare.f90 b/flang/test/Lower/OpenMP/workshare.f90 new file mode 100644 index 0000000000000..1e11677a15e1f --- /dev/null +++ b/flang/test/Lower/OpenMP/workshare.f90 @@ -0,0 +1,42 @@ + +!RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | FileCheck %s + +!CHECK-LABEL: func @_QPsb1 +subroutine sb1(arr) + integer :: arr(:) +!CHECK: omp.parallel { + !$omp parallel +!CHECK: omp.single { + !$omp workshare + arr = 0 + !$omp end workshare +!CHECK: } + !$omp end parallel +!CHECK: } +end subroutine + +!CHECK-LABEL: func @_QPsb2 +subroutine sb2(arr) + integer :: arr(:) +!CHECK: omp.parallel { + !$omp parallel +!CHECK: omp.single nowait { + !$omp workshare + arr = 0 + !$omp end workshare nowait +!CHECK: } + !$omp end parallel +!CHECK: } +end subroutine + +!CHECK-LABEL: func @_QPsb3 +subroutine sb3(arr) + integer :: arr(:) +!CHECK: omp.parallel { +!CHECK: omp.single { + !$omp parallel workshare + arr = 0 + !$omp end parallel workshare +!CHECK: } +!CHECK: } +end subroutine