* [Patch, committed] Fortran: Fix OpenMP's 'if(simd:' etc. conditions
@ 2020-08-20 11:36 Tobias Burnus
2020-08-20 16:22 ` Jakub Jelinek
0 siblings, 1 reply; 2+ messages in thread
From: Tobias Burnus @ 2020-08-20 11:36 UTC (permalink / raw)
To: gcc-patches, fortran, Jakub Jelinek
[-- Attachment #1: Type: text/plain, Size: 1163 bytes --]
This patch adds two 'simdlen' testcases by converting
the respective C testcases. When doing so, it turned out that
'if (simd: x)'
generated the symbol 'simd' due to:
gfc_match ("if ( ") == MATCH_YES
...
gfc_match ("%e )", &c->if_expr)
The latter matches "%e", which creates the symbol and
then fails at ")". It frees the gfc_expr but does not
undo the symbol.
(In the normal parser there is some logic to do this
→ undo_new_statement, but this is not done for "subpasing")
The next match works (" simd : %e )" and parsing finishes
successfully. But at resolution stage, the 'implicit none'
picks up the spurious 'simd' symbol and gives an error.
Solution: Simply match first the '<modifier> : %e' and only
then try to match '%e )'.
Committed as obvious to mainline: r11-2780-g656218ab982cc22b826227045826c92743143af1
Tobias
PS: I note that C/C++ print an error if safelen is not >0
while Fortran only prints a warning.
-----------------
Mentor Graphics (Deutschland) GmbH, Arnulfstraße 201, 80634 München / Germany
Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Alexander Walter
[-- Attachment #2: committed.diff --]
[-- Type: text/x-patch, Size: 5274 bytes --]
commit 656218ab982cc22b826227045826c92743143af1
Author: Tobias Burnus <tobias@codesourcery.com>
Date: Thu Aug 20 13:33:21 2020 +0200
Fortran: Fix OpenMP's 'if(simd:' etc. conditions
gcc/fortran/ChangeLog:
* openmp.c (gfc_match_omp_clauses): Re-order 'if' clause pasing
to avoid creating spurious symbols.
libgomp/ChangeLog:
* testsuite/libgomp.fortran/lastprivate-conditional-10.f90: New test.
---
gcc/fortran/openmp.c | 4 +-
gcc/testsuite/gfortran.dg/gomp/pr67500.f90 | 57 ++++++++++++++++++++
.../libgomp.fortran/lastprivate-conditional-10.f90 | 63 ++++++++++++++++++++++
3 files changed, 122 insertions(+), 2 deletions(-)
diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c
index 4d33a450a33..50983737af4 100644
--- a/gcc/fortran/openmp.c
+++ b/gcc/fortran/openmp.c
@@ -1299,8 +1299,6 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask,
&& c->if_expr == NULL
&& gfc_match ("if ( ") == MATCH_YES)
{
- if (gfc_match ("%e )", &c->if_expr) == MATCH_YES)
- continue;
if (!openacc)
{
/* This should match the enum gfc_omp_if_kind order. */
@@ -1323,6 +1321,8 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask,
if (i < OMP_IF_LAST)
continue;
}
+ if (gfc_match ("%e )", &c->if_expr) == MATCH_YES)
+ continue;
gfc_current_locus = old_loc;
}
if ((mask & OMP_CLAUSE_IF_PRESENT)
diff --git a/gcc/testsuite/gfortran.dg/gomp/pr67500.f90 b/gcc/testsuite/gfortran.dg/gomp/pr67500.f90
new file mode 100644
index 00000000000..1cecdc48578
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/gomp/pr67500.f90
@@ -0,0 +1,57 @@
+! Fortran version of PR c/67500
+! { dg-do compile }
+
+subroutine f1
+ !$omp declare simd simdlen(d) ! { dg-error "requires a scalar INTEGER expression" }
+end subroutine
+
+subroutine f2
+ !$omp declare simd simdlen(0.5) ! { dg-error "requires a scalar INTEGER expression" }
+end
+
+subroutine f3 (i)
+ !$omp declare simd simdlen(-2) ! { dg-warning "INTEGER expression of SIMDLEN clause at .1. must be positive" }
+end subroutine
+
+subroutine f4
+ !$omp declare simd simdlen(0) ! { dg-warning "INTEGER expression of SIMDLEN clause at .1. must be positive" }
+end
+
+subroutine foo(p, d, n)
+ integer, allocatable :: p(:)
+ real, value :: d
+ integer, value :: n
+ integer :: i
+
+ !$omp simd safelen(d) ! { dg-error "requires a scalar INTEGER expression" }
+ do i = 1, 16
+ end do
+
+ !$omp simd safelen(0.5) ! { dg-error "requires a scalar INTEGER expression" }
+ do i = 1, 16
+ end do
+
+ !$omp simd safelen(-2) ! { dg-warning "INTEGER expression of SAFELEN clause at .1. must be positive" }
+ do i = 1, 16
+ end do
+
+ !$omp simd safelen(0) ! { dg-warning "INTEGER expression of SAFELEN clause at .1. must be positive" }
+ do i = 1, 16
+ end do
+
+ !$omp simd aligned(p:n) ! { dg-error "requires a scalar positive constant integer alignment expression" }
+ do i = 1, 16
+ end do
+
+ !$omp simd aligned(p:0.5) ! { dg-error "requires a scalar positive constant integer alignment expression" }
+ do i = 1, 16
+ end do
+
+ !$omp simd aligned(p:-2) ! { dg-error "requires a scalar positive constant integer alignment expression" }
+ do i = 1, 16
+ end do
+
+ !$omp simd aligned(p:0) ! { dg-error "requires a scalar positive constant integer alignment expression" }
+ do i = 1, 16
+ end do
+end
diff --git a/libgomp/testsuite/libgomp.fortran/lastprivate-conditional-10.f90 b/libgomp/testsuite/libgomp.fortran/lastprivate-conditional-10.f90
new file mode 100644
index 00000000000..116166c48ee
--- /dev/null
+++ b/libgomp/testsuite/libgomp.fortran/lastprivate-conditional-10.f90
@@ -0,0 +1,63 @@
+! { dg-do run }
+! Fortran version of libgomp.c-c++-common/lastprivate-conditional-10.c
+
+module m
+ implicit none
+ integer :: v = 0
+ integer :: x = 0
+contains
+ integer function foo (a)
+ integer, contiguous :: a(0:)
+ integer i
+
+ !$omp parallel do simd lastprivate (conditional: x) schedule(simd : static) if (simd : .false.)
+ do i = 0, 127
+ if (a(i) /= 0) x = a(i)
+ end do
+ foo = x
+ end
+
+ integer function bar (a, b)
+ integer, contiguous :: a(0:), b(0:)
+ integer :: i
+ !$omp parallel
+ !$omp do simd lastprivate (conditional: x, v) schedule(static, 16) simdlen (1)
+ do i = 16, 127
+ if (a(i) /= 0) x = a(i);
+ if (b(i) /= 0) v = b(i) + 10;
+ end do
+ !$omp end parallel
+ bar = x
+ end
+
+ integer function baz (a)
+ integer, contiguous :: a(0:)
+ integer :: i
+ !$omp parallel do simd if (simd : .false.) lastprivate (conditional: x) schedule(simd : dynamic, 16)
+ do i = 0, 127
+ if (a(i) /= 0) x = a(i) + 5
+ end do
+ baz = x
+ end
+end module m
+
+program main
+ use m
+ implicit none
+ integer :: a(0:127), b(0:127), i
+ do i = 0, 127
+ if (mod(i, 11) == 2) then
+ a(i) = i + 10
+ else
+ a(i) = 0
+ endif
+ if (mod(i, 13) == 5) then
+ b(i) = i * 2
+ else
+ b(i) = 0
+ endif
+ end do
+ if (foo (a) /= 133) stop 1
+ if (bar (b, a) /= 244 .or. v /= 143) stop 2
+ if (baz (b) /= 249) stop 3
+end
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [Patch, committed] Fortran: Fix OpenMP's 'if(simd:' etc. conditions
2020-08-20 11:36 [Patch, committed] Fortran: Fix OpenMP's 'if(simd:' etc. conditions Tobias Burnus
@ 2020-08-20 16:22 ` Jakub Jelinek
0 siblings, 0 replies; 2+ messages in thread
From: Jakub Jelinek @ 2020-08-20 16:22 UTC (permalink / raw)
To: Tobias Burnus; +Cc: gcc-patches, fortran
On Thu, Aug 20, 2020 at 01:36:01PM +0200, Tobias Burnus wrote:
> gcc/fortran/ChangeLog:
>
> * openmp.c (gfc_match_omp_clauses): Re-order 'if' clause pasing
> to avoid creating spurious symbols.
>
> libgomp/ChangeLog:
>
> * testsuite/libgomp.fortran/lastprivate-conditional-10.f90: New test.
LGTM, thanks.
Jakub
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2020-08-20 16:22 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-08-20 11:36 [Patch, committed] Fortran: Fix OpenMP's 'if(simd:' etc. conditions Tobias Burnus
2020-08-20 16:22 ` Jakub Jelinek
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).