===================================================================
@@ -3024,8 +3024,8 @@ resolve_oacc_positive_int_expr (gfc_expr *expr, co
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
@@ -3859,6 +3859,8 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_claus
if (omp_clauses->wait_list)
for (el = omp_clauses->wait_list; el; el = el->next)
resolve_oacc_scalar_int_expr (el->expr, "WAIT");
+ if (omp_clauses->collapse && omp_clauses->tile_list)
+ gfc_error ("Incompatible use of TILE and COLLAPSE at %L", &code->loc);
}
@@ -4964,11 +4966,11 @@ resolve_oacc_loop_blocks (gfc_code *code)
if (el->expr == NULL)
{
/* NULL expressions are used to represent '*' arguments.
- Convert those to a -1 expressions. */
+ Convert those to a 0 expressions. */
el->expr = gfc_get_constant_expr (BT_INTEGER,
gfc_default_integer_kind,
&code->loc);
- mpz_set_si (el->expr->value.integer, -1);
+ mpz_set_si (el->expr->value.integer, 0);
}
else
{
===================================================================
@@ -3162,7 +3162,18 @@ gfc_trans_omp_do (gfc_code *code, gfc_exec_op op,
vec<dovar_init> inits = vNULL;
dovar_init *di;
unsigned ix;
+ gfc_expr_list *tile = do_clauses ? do_clauses->tile_list : clauses->tile_list;
+ /* Both collapsed and tiled loops are lowered the same way. In
+ OpenACC, those clauses are not compatible, so prioritize the tile
+ clause, if present. */
+ if (tile)
+ {
+ collapse = 0;
+ for (gfc_expr_list *el = tile; el; el = el->next)
+ collapse++;
+ }
+
if (collapse <= 0)
collapse = 1;
===================================================================
@@ -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
===================================================================
@@ -0,0 +1,339 @@
+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
+
+ !$acc parallel loop tile(2, 3) collapse (2) ! { dg-error "Incompatible use" }
+ 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 loop tile(2, 3) collapse (2) ! { dg-error "Incompatible use" }
+ do i = 1, n
+ do j = 1, n
+ end do
+ 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 loop tile(2, 3) collapse (2) ! { dg-error "Incompatible use" }
+ do i = 1, n
+ do j = 1, n
+ end do
+ 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
+
+ !$acc kernels loop tile(2, 3) collapse (2) ! { dg-error "Incompatible use" }
+ do i = 1, n
+ do j = 1, n
+ end do
+ end do
+end subroutine kernsloop
===================================================================
@@ -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
===================================================================
@@ -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
===================================================================
@@ -0,0 +1,292 @@
+! { dg-do compile }
+! { dg-additional-options "-fdump-tree-original" }
+
+subroutine par
+ integer i, j, k
+
+ !$acc parallel
+ !$acc loop tile (1)
+ do i = 1, 10
+ end do
+
+ !$acc loop tile (*)
+ do i = 1, 10
+ end do
+
+ !$acc loop tile (1,2)
+ do i = 1, 10
+ do j = 1, 10
+ end do
+ end do
+
+ !$acc loop tile (*,2)
+ do i = 1, 10
+ do j = 1, 10
+ end do
+ end do
+
+ !$acc loop tile (1,*)
+ do i = 1, 10
+ do j = 1, 10
+ end do
+ end do
+
+ !$acc loop tile (*,*)
+ do i = 1, 10
+ do j = 1, 10
+ end do
+ end do
+
+ !$acc loop tile (1,2,3)
+ do i = 1, 10
+ do j = 1, 10
+ do k = 1, 10
+ end do
+ end do
+ end do
+
+ !$acc loop tile (*,2,3)
+ do i = 1, 10
+ do j = 1, 10
+ do k = 1, 10
+ end do
+ end do
+ end do
+
+ !$acc loop tile (1,*,3)
+ do i = 1, 10
+ do j = 1, 10
+ do k = 1, 10
+ end do
+ end do
+ end do
+
+ !$acc loop tile (1,2,*)
+ do i = 1, 10
+ do j = 1, 10
+ do k = 1, 10
+ end do
+ end do
+ end do
+ !$acc end parallel
+end subroutine par
+
+subroutine kerns
+ integer i, j, k
+
+ !$acc kernels
+ !$acc loop tile (1)
+ do i = 1, 10
+ end do
+
+ !$acc loop tile (*)
+ do i = 1, 10
+ end do
+
+ !$acc loop tile (1,2)
+ do i = 1, 10
+ do j = 1, 10
+ end do
+ end do
+
+ !$acc loop tile (*,2)
+ do i = 1, 10
+ do j = 1, 10
+ end do
+ end do
+
+ !$acc loop tile (1,*)
+ do i = 1, 10
+ do j = 1, 10
+ end do
+ end do
+
+ !$acc loop tile (*,*)
+ do i = 1, 10
+ do j = 1, 10
+ end do
+ end do
+
+ !$acc loop tile (1,2,3)
+ do i = 1, 10
+ do j = 1, 10
+ do k = 1, 10
+ end do
+ end do
+ end do
+
+ !$acc loop tile (*,2,3)
+ do i = 1, 10
+ do j = 1, 10
+ do k = 1, 10
+ end do
+ end do
+ end do
+
+ !$acc loop tile (1,*,3)
+ do i = 1, 10
+ do j = 1, 10
+ do k = 1, 10
+ end do
+ end do
+ end do
+
+ !$acc loop tile (1,2,*)
+ do i = 1, 10
+ do j = 1, 10
+ do k = 1, 10
+ end do
+ end do
+ end do
+ !$acc end kernels
+end subroutine kerns
+
+subroutine parloop
+ integer i, j, k
+
+ !$acc parallel loop tile (1)
+ do i = 1, 10
+ end do
+
+ !$acc parallel loop tile (*)
+ do i = 1, 10
+ end do
+
+ !$acc parallel loop tile (1,2)
+ do i = 1, 10
+ do j = 1, 10
+ end do
+ end do
+
+ !$acc parallel loop tile (*,2)
+ do i = 1, 10
+ do j = 1, 10
+ end do
+ end do
+
+ !$acc parallel loop tile (1,*)
+ do i = 1, 10
+ do j = 1, 10
+ end do
+ end do
+
+ !$acc parallel loop tile (*,*)
+ do i = 1, 10
+ do j = 1, 10
+ end do
+ end do
+
+ !$acc parallel loop tile (1,2,3)
+ do i = 1, 10
+ do j = 1, 10
+ do k = 1, 10
+ end do
+ end do
+ end do
+
+ !$acc parallel loop tile (*,2,3)
+ do i = 1, 10
+ do j = 1, 10
+ do k = 1, 10
+ end do
+ end do
+ end do
+
+ !$acc parallel loop tile (1,*,3)
+ do i = 1, 10
+ do j = 1, 10
+ do k = 1, 10
+ end do
+ end do
+ end do
+
+ !$acc parallel loop tile (1,2,*)
+ do i = 1, 10
+ do j = 1, 10
+ do k = 1, 10
+ end do
+ end do
+ end do
+end subroutine parloop
+
+subroutine kernloop
+ integer i, j, k
+
+ !$acc kernels loop tile (1)
+ do i = 1, 10
+ end do
+
+ !$acc kernels loop tile (*)
+ do i = 1, 10
+ end do
+
+ !$acc kernels loop tile (1,2)
+ do i = 1, 10
+ do j = 1, 10
+ end do
+ end do
+
+ !$acc kernels loop tile (*,2)
+ do i = 1, 10
+ do j = 1, 10
+ end do
+ end do
+
+ !$acc kernels loop tile (1,*)
+ do i = 1, 10
+ do j = 1, 10
+ end do
+ end do
+
+ !$acc kernels loop tile (*,*)
+ do i = 1, 10
+ do j = 1, 10
+ end do
+ end do
+
+ !$acc kernels loop tile (1,2,3)
+ do i = 1, 10
+ do j = 1, 10
+ do k = 1, 10
+ end do
+ end do
+ end do
+
+ !$acc kernels loop tile (*,2,3)
+ do i = 1, 10
+ do j = 1, 10
+ do k = 1, 10
+ end do
+ end do
+ end do
+
+ !$acc kernels loop tile (1,*,3)
+ do i = 1, 10
+ do j = 1, 10
+ do k = 1, 10
+ end do
+ end do
+ end do
+
+ !$acc kernels loop tile (1,2,*)
+ do i = 1, 10
+ do j = 1, 10
+ do k = 1, 10
+ end do
+ end do
+ end do
+end subroutine kernloop
+
+
+! { dg-final { scan-tree-dump-times "tile\\(1\\)" 4 "original" } }
+! { dg-final { scan-tree-dump-times "tile\\(0\\)" 4 "original" } }
+! { dg-final { scan-tree-dump-times "tile\\(1, 2\\)" 4 "original" } }
+! { dg-final { scan-tree-dump-times "tile\\(0, 2\\)" 4 "original" } }
+! { dg-final { scan-tree-dump-times "tile\\(1, 0\\)" 4 "original" } }
+! { dg-final { scan-tree-dump-times "tile\\(0, 0\\)" 4 "original" } }
+! { dg-final { scan-tree-dump-times "tile\\(1, 2, 3\\)" 4 "original" } }
+! { dg-final { scan-tree-dump-times "tile\\(0, 2, 3\\)" 4 "original" } }
+! { dg-final { scan-tree-dump-times "tile\\(1, 0, 3\\)" 4 "original" } }
+! { dg-final { scan-tree-dump-times "tile\\(1, 2, 0\\)" 4 "original" } }
+! { dg-final { scan-tree-dump-times "for \\(" 88 "original" } }
+! { dg-final { scan-tree-dump-times "while \\(" 0 "original" } }
===================================================================
@@ -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" }