From 4fb2b4f7ea6b80ae75d3efb6f86e7c6179080535 Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Tue, 24 May 2022 10:41:43 +0200 Subject: [PATCH] OpenMP: Support nowait with Fortran [PR105378] Fortran part to C/C++/libgomp commit r13-724-gb43836914bdc2a37563cf31359b2c4803bfe4374 gcc/fortran/ PR c/105378 * openmp.cc (gfc_match_omp_taskwait): Accept nowait. gcc/testsuite/ PR c/105378 * gfortran.dg/gomp/taskwait-depend-nowait-1.f90: New. libgomp/ PR c/105378 * libgomp.texi (OpenMP 5.1): Set 'taskwait nowait' to 'Y'. * testsuite/libgomp.fortran/taskwait-depend-nowait-1.f90: New. --- gcc/fortran/openmp.cc | 3 +- .../gomp/taskwait-depend-nowait-1.f90 | 14 +++++++ libgomp/libgomp.texi | 2 +- .../taskwait-depend-nowait-1.f90 | 42 +++++++++++++++++++ 4 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/gomp/taskwait-depend-nowait-1.f90 create mode 100644 libgomp/testsuite/libgomp.fortran/taskwait-depend-nowait-1.f90 diff --git a/gcc/fortran/openmp.cc b/gcc/fortran/openmp.cc index 63fd4dd2767..6172ec27687 100644 --- a/gcc/fortran/openmp.cc +++ b/gcc/fortran/openmp.cc @@ -5701,7 +5701,8 @@ gfc_match_omp_taskwait (void) new_st.ext.omp_clauses = NULL; return MATCH_YES; } - return match_omp (EXEC_OMP_TASKWAIT, omp_mask (OMP_CLAUSE_DEPEND)); + return match_omp (EXEC_OMP_TASKWAIT, + omp_mask (OMP_CLAUSE_DEPEND) | OMP_CLAUSE_NOWAIT); } diff --git a/gcc/testsuite/gfortran.dg/gomp/taskwait-depend-nowait-1.f90 b/gcc/testsuite/gfortran.dg/gomp/taskwait-depend-nowait-1.f90 new file mode 100644 index 00000000000..cd2f1d288be --- /dev/null +++ b/gcc/testsuite/gfortran.dg/gomp/taskwait-depend-nowait-1.f90 @@ -0,0 +1,14 @@ +subroutine foo (p) + integer :: p(*) + !$omp taskwait depend(iterator(i = 1:17) , in : p(i)) nowait depend(out : p(32)) +end + +subroutine bar (p) + implicit none + integer :: p(*) + !$omp taskwait depend(mutexinoutset : p(1)) nowait ! { dg-error "'mutexinoutset' kind in 'depend' clause on a 'taskwait' construct" } +end + +subroutine baz + !$omp taskwait nowait ! { dg-error "'taskwait' construct with 'nowait' clause but no 'depend' clauses" } +end diff --git a/libgomp/libgomp.texi b/libgomp/libgomp.texi index b54555d0ccb..56724687fb4 100644 --- a/libgomp/libgomp.texi +++ b/libgomp/libgomp.texi @@ -303,7 +303,7 @@ The OpenMP 4.5 specification is fully supported. @code{target} regions @tab N @tab @item @code{interop} directive @tab N @tab @item @code{omp_interop_t} object support in runtime routines @tab N @tab -@item @code{nowait} clause in @code{taskwait} directive @tab N @tab +@item @code{nowait} clause in @code{taskwait} directive @tab Y @tab @item Extensions to the @code{atomic} directive @tab Y @tab @item @code{seq_cst} clause on a @code{flush} construct @tab Y @tab @item @code{inoutset} argument to the @code{depend} clause @tab Y @tab diff --git a/libgomp/testsuite/libgomp.fortran/taskwait-depend-nowait-1.f90 b/libgomp/testsuite/libgomp.fortran/taskwait-depend-nowait-1.f90 new file mode 100644 index 00000000000..a5b058d4a4f --- /dev/null +++ b/libgomp/testsuite/libgomp.fortran/taskwait-depend-nowait-1.f90 @@ -0,0 +1,42 @@ +program main + implicit none + integer :: a(0:63), b = 1 + !$omp parallel num_threads (4) + block + !$omp single + block + integer :: i + !$omp taskwait depend(in: a) nowait + !$omp taskwait depend(in: a) nowait + !$omp taskwait + !$omp taskgroup + block + !$omp taskwait depend(in: a) nowait + !$omp taskwait depend(in: a) nowait + end block + do i = 0, 63 + !$omp task depend(in: a) shared(a) + block + a(i) = i + end block + end do + !$omp taskwait depend(inout: a) nowait + do i = 0, 63 + !$omp task depend(inoutset: a) shared(a) + block + if (a(i) /= i) then + error stop + else + a(i) = 2 * i + 1 + end if + end block + end do + !$omp taskwait nowait depend(out: a) depend(in: b) + !$omp taskwait depend(inout: b) + do i = 0, 63 + if (a(i) /= 2 * i + 1) & + error stop + end do + end block + end block +end program