Commit 4b195d27 by Thomas Schwinge Committed by Thomas Schwinge

Use existing middle end checking for Fortran OpenACC loop clauses

Don't duplicate in the Fortran front end what's generically being checked in
the middle end.

	gcc/fortran/
	* openmp.c (resolve_oacc_loop_blocks): Remove checking of OpenACC
	loop clauses.
	gcc/testsuite/
	* gfortran.dg/goacc/loop-2-kernels.f95: Update.
	* gfortran.dg/goacc/loop-2-parallel.f95: Likewise.
	* gfortran.dg/goacc/nested-parallelism.f90: Likewise.

From-SVN: r266922
parent 877009a5
2018-12-09 Thomas Schwinge <thomas@codesourcery.com> 2018-12-09 Thomas Schwinge <thomas@codesourcery.com>
* openmp.c (resolve_oacc_loop_blocks): Remove checking of OpenACC
loop clauses.
PR fortran/88420 PR fortran/88420
* openmp.c (resolve_oacc_loop_blocks): Remove "Clause SEQ * openmp.c (resolve_oacc_loop_blocks): Remove "Clause SEQ
conflicts with INDEPENDENT" diagnostic. conflicts with INDEPENDENT" diagnostic.
......
...@@ -5659,12 +5659,6 @@ oacc_is_parallel (gfc_code *code) ...@@ -5659,12 +5659,6 @@ oacc_is_parallel (gfc_code *code)
return code->op == EXEC_OACC_PARALLEL || code->op == EXEC_OACC_PARALLEL_LOOP; return code->op == EXEC_OACC_PARALLEL || code->op == EXEC_OACC_PARALLEL_LOOP;
} }
static bool
oacc_is_kernels (gfc_code *code)
{
return code->op == EXEC_OACC_KERNELS || code->op == EXEC_OACC_KERNELS_LOOP;
}
static gfc_statement static gfc_statement
omp_code_to_statement (gfc_code *code) omp_code_to_statement (gfc_code *code)
{ {
...@@ -5846,73 +5840,9 @@ resolve_oacc_params_in_parallel (gfc_code *code, const char *clause, ...@@ -5846,73 +5840,9 @@ resolve_oacc_params_in_parallel (gfc_code *code, const char *clause,
static void static void
resolve_oacc_loop_blocks (gfc_code *code) resolve_oacc_loop_blocks (gfc_code *code)
{ {
fortran_omp_context *c;
if (!oacc_is_loop (code)) if (!oacc_is_loop (code))
return; return;
if (code->op == EXEC_OACC_LOOP)
for (c = omp_current_ctx; c; c = c->previous)
{
if (oacc_is_loop (c->code))
{
if (code->ext.omp_clauses->gang)
{
if (c->code->ext.omp_clauses->gang)
gfc_error ("Loop parallelized across gangs is not allowed "
"inside another loop parallelized across gangs at %L",
&code->loc);
if (c->code->ext.omp_clauses->worker)
gfc_error ("Loop parallelized across gangs is not allowed "
"inside loop parallelized across workers at %L",
&code->loc);
if (c->code->ext.omp_clauses->vector)
gfc_error ("Loop parallelized across gangs is not allowed "
"inside loop parallelized across vectors at %L",
&code->loc);
}
if (code->ext.omp_clauses->worker)
{
if (c->code->ext.omp_clauses->worker)
gfc_error ("Loop parallelized across workers is not allowed "
"inside another loop parallelized across workers at %L",
&code->loc);
if (c->code->ext.omp_clauses->vector)
gfc_error ("Loop parallelized across workers is not allowed "
"inside another loop parallelized across vectors at %L",
&code->loc);
}
if (code->ext.omp_clauses->vector)
if (c->code->ext.omp_clauses->vector)
gfc_error ("Loop parallelized across vectors is not allowed "
"inside another loop parallelized across vectors at %L",
&code->loc);
}
if (oacc_is_parallel (c->code) || oacc_is_kernels (c->code))
break;
}
if (code->ext.omp_clauses->seq)
{
if (code->ext.omp_clauses->gang)
gfc_error ("Clause SEQ conflicts with GANG at %L", &code->loc);
if (code->ext.omp_clauses->worker)
gfc_error ("Clause SEQ conflicts with WORKER at %L", &code->loc);
if (code->ext.omp_clauses->vector)
gfc_error ("Clause SEQ conflicts with VECTOR at %L", &code->loc);
if (code->ext.omp_clauses->par_auto)
gfc_error ("Clause SEQ conflicts with AUTO at %L", &code->loc);
}
if (code->ext.omp_clauses->par_auto)
{
if (code->ext.omp_clauses->gang)
gfc_error ("Clause AUTO conflicts with GANG at %L", &code->loc);
if (code->ext.omp_clauses->worker)
gfc_error ("Clause AUTO conflicts with WORKER at %L", &code->loc);
if (code->ext.omp_clauses->vector)
gfc_error ("Clause AUTO conflicts with VECTOR at %L", &code->loc);
}
if (code->ext.omp_clauses->tile_list && code->ext.omp_clauses->gang if (code->ext.omp_clauses->tile_list && code->ext.omp_clauses->gang
&& code->ext.omp_clauses->worker && code->ext.omp_clauses->vector) && code->ext.omp_clauses->worker && code->ext.omp_clauses->vector)
gfc_error ("Tiled loop cannot be parallelized across gangs, workers and " gfc_error ("Tiled loop cannot be parallelized across gangs, workers and "
......
2018-12-09 Thomas Schwinge <thomas@codesourcery.com> 2018-12-09 Thomas Schwinge <thomas@codesourcery.com>
* gfortran.dg/goacc/loop-2-kernels.f95: Update.
* gfortran.dg/goacc/loop-2-parallel.f95: Likewise.
* gfortran.dg/goacc/nested-parallelism.f90: Likewise.
* gfortran.dg/goacc/loop-2.f95: Split into... * gfortran.dg/goacc/loop-2.f95: Split into...
* gfortran.dg/goacc/loop-2-kernels-nested.f95: ... this new * gfortran.dg/goacc/loop-2-kernels-nested.f95: ... this new
file... file...
......
...@@ -31,11 +31,11 @@ program test ...@@ -31,11 +31,11 @@ program test
!$acc loop worker !$acc loop worker
DO j = 1,10 DO j = 1,10
ENDDO ENDDO
!$acc loop gang ! { dg-error "not allowed" } !$acc loop gang ! { dg-error "inner loop uses same OpenACC parallelism as containing loop" }
DO j = 1,10 DO j = 1,10
ENDDO ENDDO
ENDDO ENDDO
!$acc loop seq gang ! { dg-error "conflicts with" } !$acc loop seq gang ! { dg-error "'seq' overrides other OpenACC loop specifiers" }
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
...@@ -53,14 +53,14 @@ program test ...@@ -53,14 +53,14 @@ program test
!$acc loop vector !$acc loop vector
DO j = 1,10 DO j = 1,10
ENDDO ENDDO
!$acc loop worker ! { dg-error "not allowed" } !$acc loop worker ! { dg-error "inner loop uses same OpenACC parallelism as containing loop" }
DO j = 1,10 DO j = 1,10
ENDDO ENDDO
!$acc loop gang ! { dg-error "not allowed" } !$acc loop gang ! { dg-error "" "TODO" { xfail *-*-* } }
DO j = 1,10 DO j = 1,10
ENDDO ENDDO
ENDDO ENDDO
!$acc loop seq worker ! { dg-error "conflicts with" } !$acc loop seq worker ! { dg-error "'seq' overrides other OpenACC loop specifiers" }
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
!$acc loop gang worker !$acc loop gang worker
...@@ -78,17 +78,17 @@ program test ...@@ -78,17 +78,17 @@ program test
ENDDO ENDDO
!$acc loop vector !$acc loop vector
DO i = 1,10 DO i = 1,10
!$acc loop vector ! { dg-error "not allowed" } !$acc loop vector ! { dg-error "inner loop uses same OpenACC parallelism as containing loop" }
DO j = 1,10 DO j = 1,10
ENDDO ENDDO
!$acc loop worker ! { dg-error "not allowed" } !$acc loop worker ! { dg-error "" "TODO" { xfail *-*-* } }
DO j = 1,10 DO j = 1,10
ENDDO ENDDO
!$acc loop gang ! { dg-error "not allowed" } !$acc loop gang ! { dg-error "" "TODO" { xfail *-*-* } }
DO j = 1,10 DO j = 1,10
ENDDO ENDDO
ENDDO ENDDO
!$acc loop seq vector ! { dg-error "conflicts with" } !$acc loop seq vector ! { dg-error "'seq' overrides other OpenACC loop specifiers" }
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
!$acc loop gang vector !$acc loop gang vector
...@@ -101,16 +101,16 @@ program test ...@@ -101,16 +101,16 @@ program test
!$acc loop auto !$acc loop auto
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
!$acc loop seq auto ! { dg-error "conflicts with" } !$acc loop seq auto ! { dg-error "'seq' overrides other OpenACC loop specifiers" }
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
!$acc loop gang auto ! { dg-error "conflicts with" } !$acc loop gang auto ! { dg-error "'auto' conflicts with other OpenACC loop specifiers" }
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
!$acc loop worker auto ! { dg-error "conflicts with" } !$acc loop worker auto ! { dg-error "'auto' conflicts with other OpenACC loop specifiers" }
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
!$acc loop vector auto ! { dg-error "conflicts with" } !$acc loop vector auto ! { dg-error "'auto' conflicts with other OpenACC loop specifiers" }
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
!$acc end kernels !$acc end kernels
...@@ -133,7 +133,7 @@ program test ...@@ -133,7 +133,7 @@ program test
!$acc kernels loop gang(static:*) !$acc kernels loop gang(static:*)
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
!$acc kernels loop seq gang ! { dg-error "conflicts with" } !$acc kernels loop seq gang ! { dg-error "'seq' overrides other OpenACC loop specifiers" }
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
...@@ -146,7 +146,7 @@ program test ...@@ -146,7 +146,7 @@ program test
!$acc kernels loop worker(num:5) !$acc kernels loop worker(num:5)
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
!$acc kernels loop seq worker ! { dg-error "conflicts with" } !$acc kernels loop seq worker ! { dg-error "'seq' overrides other OpenACC loop specifiers" }
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
!$acc kernels loop gang worker !$acc kernels loop gang worker
...@@ -162,7 +162,7 @@ program test ...@@ -162,7 +162,7 @@ program test
!$acc kernels loop vector(length:5) !$acc kernels loop vector(length:5)
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
!$acc kernels loop seq vector ! { dg-error "conflicts with" } !$acc kernels loop seq vector ! { dg-error "'seq' overrides other OpenACC loop specifiers" }
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
!$acc kernels loop gang vector !$acc kernels loop gang vector
...@@ -175,16 +175,16 @@ program test ...@@ -175,16 +175,16 @@ program test
!$acc kernels loop auto !$acc kernels loop auto
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
!$acc kernels loop seq auto ! { dg-error "conflicts with" } !$acc kernels loop seq auto ! { dg-error "'seq' overrides other OpenACC loop specifiers" }
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
!$acc kernels loop gang auto ! { dg-error "conflicts with" } !$acc kernels loop gang auto ! { dg-error "'auto' conflicts with other OpenACC loop specifiers" }
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
!$acc kernels loop worker auto ! { dg-error "conflicts with" } !$acc kernels loop worker auto ! { dg-error "'auto' conflicts with other OpenACC loop specifiers" }
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
!$acc kernels loop vector auto ! { dg-error "conflicts with" } !$acc kernels loop vector auto ! { dg-error "'auto' conflicts with other OpenACC loop specifiers" }
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
end end
...@@ -25,11 +25,11 @@ program test ...@@ -25,11 +25,11 @@ program test
!$acc loop worker !$acc loop worker
DO j = 1,10 DO j = 1,10
ENDDO ENDDO
!$acc loop gang ! { dg-error "not allowed" } !$acc loop gang ! { dg-error "inner loop uses same OpenACC parallelism as containing loop" }
DO j = 1,10 DO j = 1,10
ENDDO ENDDO
ENDDO ENDDO
!$acc loop seq gang ! { dg-error "conflicts with" } !$acc loop seq gang ! { dg-error "'seq' overrides other OpenACC loop specifiers" }
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
...@@ -41,14 +41,14 @@ program test ...@@ -41,14 +41,14 @@ program test
!$acc loop vector !$acc loop vector
DO j = 1,10 DO j = 1,10
ENDDO ENDDO
!$acc loop worker ! { dg-error "not allowed" } !$acc loop worker ! { dg-error "inner loop uses same OpenACC parallelism as containing loop" }
DO j = 1,10 DO j = 1,10
ENDDO ENDDO
!$acc loop gang ! { dg-error "not allowed" } !$acc loop gang ! { dg-error "incorrectly nested OpenACC loop parallelism" }
DO j = 1,10 DO j = 1,10
ENDDO ENDDO
ENDDO ENDDO
!$acc loop seq worker ! { dg-error "conflicts with" } !$acc loop seq worker ! { dg-error "'seq' overrides other OpenACC loop specifiers" }
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
!$acc loop gang worker !$acc loop gang worker
...@@ -60,17 +60,17 @@ program test ...@@ -60,17 +60,17 @@ program test
ENDDO ENDDO
!$acc loop vector !$acc loop vector
DO i = 1,10 DO i = 1,10
!$acc loop vector ! { dg-error "not allowed" } !$acc loop vector ! { dg-error "inner loop uses same OpenACC parallelism as containing loop" }
DO j = 1,10 DO j = 1,10
ENDDO ENDDO
!$acc loop worker ! { dg-error "not allowed" } !$acc loop worker ! { dg-error "incorrectly nested OpenACC loop parallelism" }
DO j = 1,10 DO j = 1,10
ENDDO ENDDO
!$acc loop gang ! { dg-error "not allowed" } !$acc loop gang ! { dg-error "incorrectly nested OpenACC loop parallelism" }
DO j = 1,10 DO j = 1,10
ENDDO ENDDO
ENDDO ENDDO
!$acc loop seq vector ! { dg-error "conflicts with" } !$acc loop seq vector ! { dg-error "'seq' overrides other OpenACC loop specifiers" }
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
!$acc loop gang vector !$acc loop gang vector
...@@ -83,16 +83,16 @@ program test ...@@ -83,16 +83,16 @@ program test
!$acc loop auto !$acc loop auto
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
!$acc loop seq auto ! { dg-error "conflicts with" } !$acc loop seq auto ! { dg-error "'seq' overrides other OpenACC loop specifiers" }
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
!$acc loop gang auto ! { dg-error "conflicts with" } !$acc loop gang auto ! { dg-error "'auto' conflicts with other OpenACC loop specifiers" }
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
!$acc loop worker auto ! { dg-error "conflicts with" } !$acc loop worker auto ! { dg-error "'auto' conflicts with other OpenACC loop specifiers" }
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
!$acc loop vector auto ! { dg-error "conflicts with" } !$acc loop vector auto ! { dg-error "'auto' conflicts with other OpenACC loop specifiers" }
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
!$acc end parallel !$acc end parallel
...@@ -109,14 +109,14 @@ program test ...@@ -109,14 +109,14 @@ program test
!$acc parallel loop gang(static:*) !$acc parallel loop gang(static:*)
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
!$acc parallel loop seq gang ! { dg-error "conflicts with" } !$acc parallel loop seq gang ! { dg-error "'seq' overrides other OpenACC loop specifiers" }
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
!$acc parallel loop worker !$acc parallel loop worker
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
!$acc parallel loop seq worker ! { dg-error "conflicts with" } !$acc parallel loop seq worker ! { dg-error "'seq' overrides other OpenACC loop specifiers" }
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
!$acc parallel loop gang worker !$acc parallel loop gang worker
...@@ -126,7 +126,7 @@ program test ...@@ -126,7 +126,7 @@ program test
!$acc parallel loop vector !$acc parallel loop vector
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
!$acc parallel loop seq vector ! { dg-error "conflicts with" } !$acc parallel loop seq vector ! { dg-error "'seq' overrides other OpenACC loop specifiers" }
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
!$acc parallel loop gang vector !$acc parallel loop gang vector
...@@ -139,16 +139,16 @@ program test ...@@ -139,16 +139,16 @@ program test
!$acc parallel loop auto !$acc parallel loop auto
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
!$acc parallel loop seq auto ! { dg-error "conflicts with" } !$acc parallel loop seq auto ! { dg-error "'seq' overrides other OpenACC loop specifiers" }
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
!$acc parallel loop gang auto ! { dg-error "conflicts with" } !$acc parallel loop gang auto ! { dg-error "'auto' conflicts with other OpenACC loop specifiers" }
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
!$acc parallel loop worker auto ! { dg-error "conflicts with" } !$acc parallel loop worker auto ! { dg-error "'auto' conflicts with other OpenACC loop specifiers" }
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
!$acc parallel loop vector auto ! { dg-error "conflicts with" } !$acc parallel loop vector auto ! { dg-error "'auto' conflicts with other OpenACC loop specifiers" }
DO i = 1,10 DO i = 1,10
ENDDO ENDDO
end end
...@@ -6,7 +6,7 @@ program np ...@@ -6,7 +6,7 @@ program np
!$acc parallel loop gang !$acc parallel loop gang
do i = 1, n do i = 1, n
!$acc loop gang ! { dg-error "gangs is not allowed inside another loop parallelized across gangs" } !$acc loop gang ! { dg-error "inner loop uses same OpenACC parallelism as containing loop" }
do j = 1, n do j = 1, n
end do end do
...@@ -21,11 +21,11 @@ program np ...@@ -21,11 +21,11 @@ program np
!$acc parallel loop worker !$acc parallel loop worker
do i = 1, n do i = 1, n
!$acc loop gang ! { dg-error "gangs is not allowed inside loop parallelized across workers" } !$acc loop gang ! { dg-error "incorrectly nested OpenACC loop parallelism" }
do j = 1, n do j = 1, n
end do end do
!$acc loop worker ! { dg-error "workers is not allowed inside another loop parallelized across workers" } !$acc loop worker ! { dg-error "inner loop uses same OpenACC parallelism as containing loop" }
do j = 1, n do j = 1, n
end do end do
...@@ -36,15 +36,15 @@ program np ...@@ -36,15 +36,15 @@ program np
!$acc parallel loop vector !$acc parallel loop vector
do i = 1, n do i = 1, n
!$acc loop gang ! { dg-error "gangs is not allowed inside loop parallelized across vectors" } !$acc loop gang ! { dg-error "incorrectly nested OpenACC loop parallelism" }
do j = 1, n do j = 1, n
end do end do
!$acc loop worker ! { dg-error "workers is not allowed inside another loop parallelized across vectors" } !$acc loop worker ! { dg-error "incorrectly nested OpenACC loop parallelism" }
do j = 1, n do j = 1, n
end do end do
!$acc loop vector ! { dg-error "vectors is not allowed inside another loop parallelized across vectors" } !$acc loop vector ! { dg-error "inner loop uses same OpenACC parallelism as containing loop" }
do j = 1, n do j = 1, n
end do end do
end do end do
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment