This is the mail archive of the
fortran@gcc.gnu.org
mailing list for the GNU Fortran project.
[gomp4] update gfortran's tile clause error handling
- From: Cesar Philippidis <cesar_philippidis at mentor dot com>
- To: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>, Fortran List <fortran at gcc dot gnu dot org>, Nathan Sidwell <nathan at codesourcery dot com>
- Date: Mon, 3 Oct 2016 07:07:31 -0700
- Subject: [gomp4] update gfortran's tile clause error handling
- Authentication-results: sourceware.org; auth=none
This patch updates the fortran FE to generate errors, rather than
warnings, for non-positive integer tile clause arguments. I noticed this
problem when I ported over the C/C++ compile time test cases to fortran.
In addition to the two new test files, a couple of other existing tests
needed to be updated to accommodate this new behavior. I've applied it
to gomp-4_0-branch.
Nathan, I haven't looked too deeply into your tile changes yet. Do you
know of the fortran FE is doing anything wrong? I haven't checked if
it's lowering the tile clause in the proper format yet.
Cesar
2016-10-03 Cesar Philippidis <cesar@codesourcery.com>
gcc/fortran/
* openmp.c (resolve_oacc_positive_int_expr):Promote the
warning to an error.
gcc/testsuite/
* gfortran.dg/goacc/loop-2.f95: Change expected tile clause
warnings to errors.
* gfortran.dg/goacc/loop-5.f95: Likewise.
* gfortran.dg/goacc/sie.f95: Likewise.
* gfortran.dg/goacc/tile-1.f90: New test.
* gfortran.dg/goacc/tile-2.f90: New test.
diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c
index 92b9afe..399b5d1 100644
--- a/gcc/fortran/openmp.c
+++ b/gcc/fortran/openmp.c
@@ -3266,8 +3266,8 @@ resolve_oacc_positive_int_expr (gfc_expr *expr, const char *clause)
resolve_oacc_scalar_int_expr (expr, clause);
if (expr->expr_type == EXPR_CONSTANT && expr->ts.type == BT_INTEGER
&& mpz_sgn(expr->value.integer) <= 0)
- gfc_warning (0, "INTEGER expression of %s clause at %L must be positive",
- clause, &expr->where);
+ gfc_error ("INTEGER expression of %s clause at %L must be positive",
+ clause, &expr->where);
}
/* Emits error when symbol is pointer, cray pointer or cray pointee
diff --git a/gcc/testsuite/gfortran.dg/goacc/loop-2.f95 b/gcc/testsuite/gfortran.dg/goacc/loop-2.f95
index 0c902b2..d4c6273 100644
--- a/gcc/testsuite/gfortran.dg/goacc/loop-2.f95
+++ b/gcc/testsuite/gfortran.dg/goacc/loop-2.f95
@@ -143,7 +143,7 @@ program test
DO j = 1,10
ENDDO
ENDDO
- !$acc loop tile(-1) ! { dg-warning "must be positive" }
+ !$acc loop tile(-1) ! { dg-error "must be positive" }
do i = 1,10
enddo
!$acc loop tile(i) ! { dg-error "constant expression" }
@@ -307,7 +307,7 @@ program test
DO j = 1,10
ENDDO
ENDDO
- !$acc loop tile(-1) ! { dg-warning "must be positive" }
+ !$acc loop tile(-1) ! { dg-error "must be positive" }
do i = 1,10
enddo
!$acc loop tile(i) ! { dg-error "constant expression" }
@@ -460,7 +460,7 @@ program test
DO j = 1,10
ENDDO
ENDDO
- !$acc kernels loop tile(-1) ! { dg-warning "must be positive" }
+ !$acc kernels loop tile(-1) ! { dg-error "must be positive" }
do i = 1,10
enddo
!$acc kernels loop tile(i) ! { dg-error "constant expression" }
@@ -612,7 +612,7 @@ program test
DO j = 1,10
ENDDO
ENDDO
- !$acc parallel loop tile(-1) ! { dg-warning "must be positive" }
+ !$acc parallel loop tile(-1) ! { dg-error "must be positive" }
do i = 1,10
enddo
!$acc parallel loop tile(i) ! { dg-error "constant expression" }
diff --git a/gcc/testsuite/gfortran.dg/goacc/loop-5.f95 b/gcc/testsuite/gfortran.dg/goacc/loop-5.f95
index d059cf7..fe137d5 100644
--- a/gcc/testsuite/gfortran.dg/goacc/loop-5.f95
+++ b/gcc/testsuite/gfortran.dg/goacc/loop-5.f95
@@ -93,9 +93,6 @@ program test
DO j = 1,10
ENDDO
ENDDO
- !$acc loop tile(-1) ! { dg-warning "must be positive" }
- do i = 1,10
- enddo
!$acc loop vector tile(*)
DO i = 1,10
ENDDO
@@ -129,9 +126,6 @@ program test
DO j = 1,10
ENDDO
ENDDO
- !$acc loop tile(-1) ! { dg-warning "must be positive" }
- do i = 1,10
- enddo
!$acc loop vector tile(*)
DO i = 1,10
ENDDO
@@ -242,9 +236,6 @@ program test
DO j = 1,10
ENDDO
ENDDO
- !$acc kernels loop tile(-1) ! { dg-warning "must be positive" }
- do i = 1,10
- enddo
!$acc kernels loop vector tile(*)
DO i = 1,10
ENDDO
@@ -333,9 +324,6 @@ program test
DO j = 1,10
ENDDO
ENDDO
- !$acc parallel loop tile(-1) ! { dg-warning "must be positive" }
- do i = 1,10
- enddo
!$acc parallel loop vector tile(*)
DO i = 1,10
ENDDO
diff --git a/gcc/testsuite/gfortran.dg/goacc/sie.f95 b/gcc/testsuite/gfortran.dg/goacc/sie.f95
index 2d66026..b4dd9ed 100644
--- a/gcc/testsuite/gfortran.dg/goacc/sie.f95
+++ b/gcc/testsuite/gfortran.dg/goacc/sie.f95
@@ -78,10 +78,10 @@ program test
!$acc parallel num_gangs(i+1)
!$acc end parallel
- !$acc parallel num_gangs(-1) ! { dg-warning "must be positive" }
+ !$acc parallel num_gangs(-1) ! { dg-error "must be positive" }
!$acc end parallel
- !$acc parallel num_gangs(0) ! { dg-warning "must be positive" }
+ !$acc parallel num_gangs(0) ! { dg-error "must be positive" }
!$acc end parallel
!$acc parallel num_gangs() ! { dg-error "Invalid character in name" }
@@ -107,10 +107,10 @@ program test
!$acc parallel num_workers(i+1)
!$acc end parallel
- !$acc parallel num_workers(-1) ! { dg-warning "must be positive" }
+ !$acc parallel num_workers(-1) ! { dg-error "must be positive" }
!$acc end parallel
- !$acc parallel num_workers(0) ! { dg-warning "must be positive" }
+ !$acc parallel num_workers(0) ! { dg-error "must be positive" }
!$acc end parallel
!$acc parallel num_workers() ! { dg-error "Invalid character in name" }
@@ -136,10 +136,10 @@ program test
!$acc parallel vector_length(i+1)
!$acc end parallel
- !$acc parallel vector_length(-1) ! { dg-warning "must be positive" }
+ !$acc parallel vector_length(-1) ! { dg-error "must be positive" }
!$acc end parallel
- !$acc parallel vector_length(0) ! { dg-warning "must be positive" }
+ !$acc parallel vector_length(0) ! { dg-error "must be positive" }
!$acc end parallel
!$acc parallel vector_length() ! { dg-error "Invalid character in name" }
@@ -166,10 +166,10 @@ program test
!$acc loop gang(i+1)
do i = 1,10
enddo
- !$acc loop gang(-1) ! { dg-warning "must be positive" }
+ !$acc loop gang(-1) ! { dg-error "must be positive" }
do i = 1,10
enddo
- !$acc loop gang(0) ! { dg-warning "must be positive" }
+ !$acc loop gang(0) ! { dg-error "must be positive" }
do i = 1,10
enddo
!$acc loop gang() ! { dg-error "Invalid character in name" }
@@ -198,10 +198,10 @@ program test
!$acc loop worker(i+1)
do i = 1,10
enddo
- !$acc loop worker(-1) ! { dg-warning "must be positive" }
+ !$acc loop worker(-1) ! { dg-error "must be positive" }
do i = 1,10
enddo
- !$acc loop worker(0) ! { dg-warning "must be positive" }
+ !$acc loop worker(0) ! { dg-error "must be positive" }
do i = 1,10
enddo
!$acc loop worker() ! { dg-error "Invalid character in name" }
@@ -230,10 +230,10 @@ program test
!$acc loop vector(i+1)
do i = 1,10
enddo
- !$acc loop vector(-1) ! { dg-warning "must be positive" }
+ !$acc loop vector(-1) ! { dg-error "must be positive" }
do i = 1,10
enddo
- !$acc loop vector(0) ! { dg-warning "must be positive" }
+ !$acc loop vector(0) ! { dg-error "must be positive" }
do i = 1,10
enddo
!$acc loop vector() ! { dg-error "Invalid character in name" }
@@ -249,4 +249,4 @@ program test
do i = 1,10
enddo
-end program test
\ No newline at end of file
+end program test
diff --git a/gcc/testsuite/gfortran.dg/goacc/tile-1.f90 b/gcc/testsuite/gfortran.dg/goacc/tile-1.f90
new file mode 100644
index 0000000..967a7c3
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/tile-1.f90
@@ -0,0 +1,315 @@
+subroutine parloop
+ integer, parameter :: n = 100
+ integer i, j, k, a
+
+ !$acc parallel loop tile(10)
+ do i = 1, n
+ end do
+
+ !$acc parallel loop tile(*)
+ do i = 1, n
+ end do
+
+ !$acc parallel loop tile(10, *)
+ do i = 1, n
+ do j = 1, n
+ end do
+ end do
+
+ !$acc parallel loop tile(10, *, i) ! { dg-error "" }
+ do i = 1, n
+ do j = 1, n
+ do k = 1, n
+ end do
+ end do
+ end do
+
+ !$acc parallel loop tile ! { dg-error "Unclassifiable" }
+ do i = 1, n
+ end do
+
+ !$acc parallel loop tile() ! { dg-error "Syntax error" }
+ do i = 1, n
+ end do
+
+ !$acc parallel loop tile(,1) ! { dg-error "Syntax error" }
+ do i = 1, n
+ end do
+
+ !$acc parallel loop tile(,,) ! { dg-error "Syntax error" }
+ do i = 1, n
+ end do
+
+ !$acc parallel loop tile(1.1) ! { dg-error "requires a scalar INTEGER" }
+ do i = 1, n
+ end do
+
+ !$acc parallel loop tile(-3) ! { dg-error "must be positive" }
+ do i = 1, n
+ end do
+
+ !$acc parallel loop tile(10, -3) ! { dg-error "must be positive" }
+ do i = 1, n
+ do j = 1, n
+ end do
+ end do
+
+ !$acc parallel loop tile(-100, 10, 5) ! { dg-error "must be positive" }
+ do i = 1, n
+ do j = 1, n
+ do k = 1, n
+ end do
+ end do
+ end do
+
+ !$acc parallel loop tile(10, .true.) ! { dg-error "requires a scalar" }
+ do i = 1, n
+ do j = 1, n
+ end do
+ end do
+
+ !$acc parallel loop tile(1, a) ! { dg-error "constant expression" }
+ do i = 1, n
+ do j = 1, n
+ end do
+ end do
+
+ !$acc parallel loop tile(a, 1) ! { dg-error "constant expression" }
+ do i = 1, n
+ do j = 1, n
+ end do
+ end do
+end subroutine parloop
+
+subroutine par
+ integer, parameter :: n = 100
+ integer i, j, k
+
+ !$acc parallel
+ !$acc loop tile ! { dg-error "Unclassifiable" }
+ do i = 1, n
+ end do
+
+ !$acc loop tile() ! { dg-error "Syntax error" }
+ do i = 1, n
+ end do
+
+ !$acc loop tile(1)
+ do i = 1, n
+ end do
+
+ !$acc loop tile(*)
+ do i = 1, n
+ end do
+
+ !$acc loop tile(2)
+ do i = 1, n
+ do j = 1, n
+ end do
+ end do
+
+ !$acc loop tile(-2) ! { dg-error "must be positive" }
+ do i = 1, n
+ end do
+
+ !$acc loop tile(i) ! { dg-error "constant expression" }
+ do i = 1, n
+ end do
+
+ !$acc loop tile(2, 2, 1)
+ do i = 1, n
+ do j = 1, n
+ do k = 1, n
+ end do
+ end do
+ end do
+
+ !$acc parallel loop tile(2, 2)
+ do i = 1, n
+ do j = i+1, n, j ! { dg-error "rectangular iteration space" }
+ end do
+ end do
+
+ !$acc loop vector tile(*)
+ do i = 1, n
+ end do
+
+ !$acc loop worker tile(*)
+ do i = 1, n
+ end do
+
+ !$acc loop gang tile(*)
+ do i = 1, n
+ end do
+
+ !$acc loop vector gang tile(*)
+ do i = 1, n
+ end do
+
+ !$acc loop vector worker tile(*)
+ do i = 1, n
+ end do
+
+ !$acc loop gang worker tile(*)
+ do i = 1, n
+ end do
+ !$acc end parallel
+end subroutine par
+
+subroutine kern
+ integer, parameter :: n = 100
+ integer i, j, k
+
+ !$acc kernels
+ !$acc loop tile ! { dg-error "Unclassifiable" }
+ do i = 1, n
+ end do
+
+ !$acc loop tile() ! { dg-error "Syntax error" }
+ do i = 1, n
+ end do
+
+ !$acc loop tile(1)
+ do i = 1, n
+ end do
+
+ !$acc loop tile(*)
+ do i = 1, n
+ end do
+
+ !$acc loop tile(2)
+ do i = 1, n
+ do j = 1, n
+ end do
+ end do
+
+ !$acc loop tile(-2) ! { dg-error "must be positive" }
+ do i = 1, n
+ end do
+
+ !$acc loop tile(i) ! { dg-error "constant expression" }
+ do i = 1, n
+ end do
+
+ !$acc loop tile(2, 2, 1)
+ do i = 1, n
+ do j = 1, n
+ do k = 1, n
+ end do
+ end do
+ end do
+
+ !$acc parallel loop tile(2, 2)
+ do i = 1, n
+ do j = 1, n
+ end do
+ end do
+
+ !$acc loop vector tile(*)
+ do i = 1, n
+ end do
+
+ !$acc loop worker tile(*)
+ do i = 1, n
+ end do
+
+ !$acc loop gang tile(*)
+ do i = 1, n
+ end do
+
+ !$acc loop vector gang tile(*)
+ do i = 1, n
+ end do
+
+ !$acc loop vector worker tile(*)
+ do i = 1, n
+ end do
+
+ !$acc loop gang worker tile(*)
+ do i = 1, n
+ end do
+ !$acc end kernels
+end subroutine kern
+
+subroutine kernsloop
+ integer, parameter :: n = 100
+ integer i, j, k, a
+
+ !$acc kernels loop tile(10)
+ do i = 1, n
+ end do
+
+ !$acc kernels loop tile(*)
+ do i = 1, n
+ end do
+
+ !$acc kernels loop tile(10, *)
+ do i = 1, n
+ do j = 1, n
+ end do
+ end do
+
+ !$acc kernels loop tile(10, *, i) ! { dg-error "" }
+ do i = 1, n
+ do j = 1, n
+ do k = 1, n
+ end do
+ end do
+ end do
+
+ !$acc kernels loop tile ! { dg-error "Unclassifiable" }
+ do i = 1, n
+ end do
+
+ !$acc kernels loop tile() ! { dg-error "Syntax error" }
+ do i = 1, n
+ end do
+
+ !$acc kernels loop tile(,1) ! { dg-error "Syntax error" }
+ do i = 1, n
+ end do
+
+ !$acc kernels loop tile(,,) ! { dg-error "Syntax error" }
+ do i = 1, n
+ end do
+
+ !$acc kernels loop tile(1.1) ! { dg-error "requires a scalar INTEGER" }
+ do i = 1, n
+ end do
+
+ !$acc kernels loop tile(-3) ! { dg-error "must be positive" }
+ do i = 1, n
+ end do
+
+ !$acc kernels loop tile(10, -3) ! { dg-error "must be positive" }
+ do i = 1, n
+ do j = 1, n
+ end do
+ end do
+
+ !$acc kernels loop tile(-100, 10, 5) ! { dg-error "must be positive" }
+ do i = 1, n
+ do j = 1, n
+ do k = 1, n
+ end do
+ end do
+ end do
+
+ !$acc kernels loop tile(10, .true.) ! { dg-error "requires a scalar" }
+ do i = 1, n
+ do j = 1, n
+ end do
+ end do
+
+ !$acc kernels loop tile(1, a) ! { dg-error "constant expression" }
+ do i = 1, n
+ do j = 1, n
+ end do
+ end do
+
+ !$acc kernels loop tile(a, 1) ! { dg-error "constant expression" }
+ do i = 1, n
+ do j = 1, n
+ end do
+ end do
+end subroutine kernsloop
diff --git a/gcc/testsuite/gfortran.dg/goacc/tile-2.f90 b/gcc/testsuite/gfortran.dg/goacc/tile-2.f90
new file mode 100644
index 0000000..c567543
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/tile-2.f90
@@ -0,0 +1,21 @@
+subroutine par
+ integer ix, jx
+
+ !$acc parallel
+ !$acc loop tile (*,*) ! { dg-error "not enough DO loops for tiled" }
+ do ix = 1, 30
+ end do
+
+ !$acc loop tile (*,*)
+ do ix = 1, 30
+ do jx = 1, ix ! { dg-error "tiled loops don.t form rectangular" }
+ end do
+ end do
+
+ !$acc loop tile (*)
+ do ix = 1, 30
+ do jx = 1, ix
+ end do
+ end do
+ !$acc end parallel
+end subroutine par