diff options
author | Tobias Burnus <tobias@codesourcery.com> | 2022-05-24 10:41:43 +0200 |
---|---|---|
committer | Tobias Burnus <tobias@codesourcery.com> | 2022-05-24 10:45:26 +0200 |
commit | 4fb2b4f7ea6b80ae75d3efb6f86e7c6179080535 (patch) | |
tree | d47491145e4e0ef0d7fcb234c6c1d6599b9d7638 | |
parent | b646d7d279ae0c0d35564542d09866bf3e8afac0 (diff) | |
download | gcc-4fb2b4f7ea6b80ae75d3efb6f86e7c6179080535.zip gcc-4fb2b4f7ea6b80ae75d3efb6f86e7c6179080535.tar.gz gcc-4fb2b4f7ea6b80ae75d3efb6f86e7c6179080535.tar.bz2 |
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.
-rw-r--r-- | gcc/fortran/openmp.cc | 3 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/gomp/taskwait-depend-nowait-1.f90 | 14 | ||||
-rw-r--r-- | libgomp/libgomp.texi | 2 | ||||
-rw-r--r-- | libgomp/testsuite/libgomp.fortran/taskwait-depend-nowait-1.f90 | 42 |
4 files changed, 59 insertions, 2 deletions
diff --git a/gcc/fortran/openmp.cc b/gcc/fortran/openmp.cc index 63fd4dd..6172ec2 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 0000000..cd2f1d2 --- /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 b54555d..5672468 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 0000000..a5b058d --- /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 |