[Fortran] OpenMP 5 – permit more sharing clauses for SIMD (PR94690)

gcc/fortran/
	PR fortran/94690
	* openmp.c (resolve_omp_do): Permit more clauses for SIMD
	iteration variables.

gcc/testsuite/
	PR fortran/94690
	* gfortran.dg/gomp/openmp-simd-4.f90: New test.
This commit is contained in:
Tobias Burnus
2020-05-15 16:40:34 +02:00
parent 75514d157e
commit 0ec52417fd
4 changed files with 82 additions and 11 deletions

View File

@@ -1,3 +1,9 @@
2020-05-15 Tobias Burnus <tobias@codesourcery.com>
PR fortran/94690
* openmp.c (resolve_omp_do): Permit more clauses for SIMD
iteration variables.
2020-05-14 Jakub Jelinek <jakub@redhat.com>
* trans-openmp.c: Include function.h.

View File

@@ -5847,26 +5847,21 @@ resolve_omp_do (gfc_code *code)
"at %L", name, &do_code->loc);
if (code->ext.omp_clauses)
for (list = 0; list < OMP_LIST_NUM; list++)
if (!is_simd
if (!is_simd || code->ext.omp_clauses->collapse > 1
? (list != OMP_LIST_PRIVATE && list != OMP_LIST_LASTPRIVATE)
: code->ext.omp_clauses->collapse > 1
? (list != OMP_LIST_LASTPRIVATE)
: (list != OMP_LIST_LINEAR))
: (list != OMP_LIST_PRIVATE && list != OMP_LIST_LASTPRIVATE
&& list != OMP_LIST_LINEAR))
for (n = code->ext.omp_clauses->lists[list]; n; n = n->next)
if (dovar == n->sym)
{
if (!is_simd)
if (!is_simd || code->ext.omp_clauses->collapse > 1)
gfc_error ("%s iteration variable present on clause "
"other than PRIVATE or LASTPRIVATE at %L",
name, &do_code->loc);
else if (code->ext.omp_clauses->collapse > 1)
gfc_error ("%s iteration variable present on clause "
"other than LASTPRIVATE at %L",
name, &do_code->loc);
else
gfc_error ("%s iteration variable present on clause "
"other than LINEAR at %L",
name, &do_code->loc);
"other than PRIVATE, LASTPRIVATE or "
"LINEAR at %L", name, &do_code->loc);
break;
}
if (i > 1)

View File

@@ -1,3 +1,8 @@
2020-05-15 Tobias Burnus <tobias@codesourcery.com>
PR fortran/94690
* gfortran.dg/gomp/openmp-simd-4.f90: New test.
2020-05-15 Richard Biener <rguenther@suse.de>
PR tree-optimization/95133

View File

@@ -0,0 +1,65 @@
! { dg-do compile }
integer :: i, j, k
integer :: x(5), y(2,5)
!$omp parallel do private(i)
do i = 1, 5
x(i) = 42
end do
!$omp parallel do lastprivate(i)
do i = 1, 5
x(i) = 42
end do
!$omp simd private(i)
do i = 1, 5
x(i) = 42
end do
!$omp simd linear(i)
do i = 1, 5
x(i) = 42
end do
!$omp simd lastprivate(i)
do i = 1, 5
x(i) = 42
end do
!$omp simd private(i) lastprivate(j) collapse(2)
do i = 1, 5
do j = 1, 2
y(j, i) = 52
end do
end do
!$omp simd lastprivate(i) private(j) collapse(2)
do i = 1, 5
do j = 1, 2
y(j, i) = 52
end do
end do
!$omp parallel do firstprivate(i)
do i = 1, 5 ! { dg-error "PARALLEL DO iteration variable present on clause other than PRIVATE or LASTPRIVATE" }
x(i) = 42
end do
!$omp parallel do simd firstprivate(i)
do i = 1, 5 ! { dg-error "PARALLEL DO SIMD iteration variable present on clause other than PRIVATE, LASTPRIVATE or LINEAR" }
x(i) = 42
end do
!$omp simd linear(i) collapse(2)
do i = 1, 5 ! { dg-error "SIMD iteration variable present on clause other than PRIVATE or LASTPRIVATE" }
do j = 1, 2
y(j, i) = 52
end do
end do
end