mirror of
https://forge.sourceware.org/marek/gcc.git
synced 2026-02-22 03:47:02 -05:00
Fortran version to commit e45483c7c4,
which implemented OpenMP's scope construct for C and C++.
Most testcases are based on the C testcases; it also contains some
testcases which existed previously but had no Fortran equivalent.
gcc/fortran/ChangeLog:
* dump-parse-tree.c (show_omp_node, show_code_node): Handle
EXEC_OMP_SCOPE.
* gfortran.h (enum gfc_statement): Add ST_OMP_(END_)SCOPE.
(enum gfc_exec_op): Add EXEC_OMP_SCOPE.
* match.h (gfc_match_omp_scope): New.
* openmp.c (OMP_SCOPE_CLAUSES): Define
(gfc_match_omp_scope): New.
(gfc_match_omp_cancellation_point, gfc_match_omp_end_nowait):
Improve error diagnostic.
(omp_code_to_statement): Handle ST_OMP_SCOPE.
(gfc_resolve_omp_directive): Handle EXEC_OMP_SCOPE.
* parse.c (decode_omp_directive, next_statement,
gfc_ascii_statement, parse_omp_structured_block,
parse_executable): Handle OpenMP's scope construct.
* resolve.c (gfc_resolve_blocks): Likewise
* st.c (gfc_free_statement): Likewise
* trans-openmp.c (gfc_trans_omp_scope): New.
(gfc_trans_omp_directive): Call it.
* trans.c (trans_code): handle EXEC_OMP_SCOPE.
libgomp/ChangeLog:
* testsuite/libgomp.fortran/scope-1.f90: New test.
* testsuite/libgomp.fortran/task-reduction-16.f90: New test.
gcc/testsuite/ChangeLog:
* gfortran.dg/gomp/scan-1.f90:
* gfortran.dg/gomp/cancel-1.f90: New test.
* gfortran.dg/gomp/cancel-4.f90: New test.
* gfortran.dg/gomp/loop-4.f90: New test.
* gfortran.dg/gomp/nesting-1.f90: New test.
* gfortran.dg/gomp/nesting-2.f90: New test.
* gfortran.dg/gomp/nesting-3.f90: New test.
* gfortran.dg/gomp/nowait-1.f90: New test.
* gfortran.dg/gomp/reduction-task-1.f90: New test.
* gfortran.dg/gomp/reduction-task-2.f90: New test.
* gfortran.dg/gomp/reduction-task-2a.f90: New test.
* gfortran.dg/gomp/reduction-task-3.f90: New test.
* gfortran.dg/gomp/scope-1.f90: New test.
* gfortran.dg/gomp/scope-2.f90: New test.
56 lines
1.0 KiB
Fortran
56 lines
1.0 KiB
Fortran
program main
|
|
implicit none (type, external)
|
|
integer :: r, r2, i
|
|
integer a(0:63)
|
|
a = 0
|
|
r = 0; r2 = 0
|
|
!$omp parallel
|
|
!$omp scope
|
|
!$omp scope
|
|
!$omp do
|
|
do i = 0, 63
|
|
a(i) = a(i) + 1
|
|
end do
|
|
!$omp end do
|
|
!$omp end scope nowait
|
|
!$omp end scope nowait
|
|
|
|
!$omp scope reduction(+: r)
|
|
!$omp do
|
|
do i = 0, 63
|
|
r = r + i
|
|
if (a(i) /= 1) &
|
|
stop 1
|
|
end do
|
|
!$omp end do nowait
|
|
!$omp barrier
|
|
!$omp end scope nowait
|
|
|
|
!$omp barrier
|
|
|
|
if (r /= 64 * 63 / 2) &
|
|
stop 2
|
|
|
|
!$omp scope private (i)
|
|
!$omp scope reduction(+: r2)
|
|
!$omp do
|
|
do i = 0, 63
|
|
r2 = r2 + 2 * i
|
|
a(i) = a(i) + i
|
|
end do
|
|
!$omp end do nowait
|
|
!$omp end scope
|
|
!$omp end scope nowait
|
|
|
|
if (r2 /= 64 * 63) &
|
|
stop 3
|
|
|
|
!$omp do
|
|
do i = 0, 63
|
|
if (a(i) /= i + 1) &
|
|
stop 4
|
|
end do
|
|
!$omp end do nowait
|
|
!$omp end parallel
|
|
end
|