diff options
Diffstat (limited to 'gcc/testsuite')
23 files changed, 1295 insertions, 20 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index eb51808..c074e7b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,32 @@ +2015-11-05 Cesar Philippidis <cesar@codesourcery.com> + Tom de Vries <tom@codesourcery.com> + Nathan Sidwell <nathan@codesourcery.com> + Thomas Schwinge <thomas@codesourcery.com> + + * c-c++-common/goacc/combined-directives.c: New test. + * c-c++-common/goacc/loop-clauses.c: New test. + * c-c++-common/goacc/tile.c: New test. + * c-c++-common/goacc/loop-shape.c: Add test for pointer variable + as gang static arguments. + * c-c++-common/goacc/update-1.c: Adjust expected error message. + * g++.dg/goacc/template.C: New test. + * gfortran.dg/goacc/combined-directives.f90: New test. + * gfortran.dg/goacc/default.f95: New test. + * gfortran.dg/goacc/default_none.f95: New test. + * gfortran.dg/goacc/firstprivate-1.f95: New test. + * gfortran.dg/goacc/gang-static.f95: New test. + * gfortran.dg/goacc/kernels-loop-inner.f95: New test. + * gfortran.dg/goacc/kernels-loops-adjacent.f95: New test. + * gfortran.dg/goacc/list.f95: Update test. + * gfortran.dg/goacc/loop-2.f95: Likewise. + * gfortran.dg/goacc/loop-4.f95: New test. + * gfortran.dg/goacc/loop-5.f95: New test. + * gfortran.dg/goacc/loop-6.f95: New test. + * gfortran.dg/goacc/loop-tree-1.f90: Update test. + * gfortran.dg/goacc/multi-clause.f90: New test. + * gfortran.dg/goacc/parallel-tree.f95: Update test. + * gfortran.dg/goacc/update.f95: New test. + 2015-11-05 Martin Sebor <msebor@redhat.com> PR c++/67942 diff --git a/gcc/testsuite/c-c++-common/goacc/combined-directives.c b/gcc/testsuite/c-c++-common/goacc/combined-directives.c new file mode 100644 index 0000000..c387285 --- /dev/null +++ b/gcc/testsuite/c-c++-common/goacc/combined-directives.c @@ -0,0 +1,119 @@ +// { dg-do compile } +// { dg-options "-fopenacc -fdump-tree-gimple" } + +// This error is temporary. Remove when support is added for these clauses +// in the middle end. Also remove the comments from the reduction test +// after the FE learns that reduction variables may appear in data clauses too. +// { dg-prune-output "sorry, unimplemented" } + +void +test () +{ + int a[100], i, j, z; + + // acc parallel + + #pragma acc parallel loop collapse (2) + for (i = 0; i < 100; i++) + for (j = 0; j < 10; j++) + ; + + #pragma acc parallel loop gang + for (i = 0; i < 100; i++) + ; + + #pragma acc parallel loop worker + for (i = 0; i < 100; i++) + for (j = 0; j < 10; j++) + ; + + #pragma acc parallel loop vector + for (i = 0; i < 100; i++) + for (j = 0; j < 10; j++) + ; + + #pragma acc parallel loop seq + for (i = 0; i < 100; i++) + for (j = 0; j < 10; j++) + ; + + #pragma acc parallel loop auto + for (i = 0; i < 100; i++) + for (j = 0; j < 10; j++) + ; + + #pragma acc parallel loop tile (2, 3) + for (i = 0; i < 100; i++) + for (j = 0; j < 10; j++) + ; + + #pragma acc parallel loop independent + for (i = 0; i < 100; i++) + ; + + #pragma acc parallel loop private (z) + for (i = 0; i < 100; i++) + z = 0; + +// #pragma acc parallel loop reduction (+:z) copy (z) +// for (i = 0; i < 100; i++) +// ; + + // acc kernels + + #pragma acc kernels loop collapse (2) + for (i = 0; i < 100; i++) + for (j = 0; j < 10; j++) + ; + + #pragma acc kernels loop gang + for (i = 0; i < 100; i++) + ; + + #pragma acc kernels loop worker + for (i = 0; i < 100; i++) + for (j = 0; j < 10; j++) + ; + + #pragma acc kernels loop vector + for (i = 0; i < 100; i++) + for (j = 0; j < 10; j++) + ; + + #pragma acc kernels loop seq + for (i = 0; i < 100; i++) + for (j = 0; j < 10; j++) + ; + + #pragma acc kernels loop auto + for (i = 0; i < 100; i++) + for (j = 0; j < 10; j++) + ; + + #pragma acc kernels loop tile (2, 3) + for (i = 0; i < 100; i++) + for (j = 0; j < 10; j++) + ; + + #pragma acc kernels loop independent + for (i = 0; i < 100; i++) + ; + + #pragma acc kernels loop private (z) + for (i = 0; i < 100; i++) + z = 0; + +// #pragma acc kernels loop reduction (+:z) copy (z) +// for (i = 0; i < 100; i++) +// ; +} + +// { dg-final { scan-tree-dump-times "acc loop collapse.2. private.j. private.i" 2 "gimple" } } +// { dg-final { scan-tree-dump-times "acc loop gang" 2 "gimple" } } +// { dg-final { scan-tree-dump-times "acc loop worker" 2 "gimple" } } +// { dg-final { scan-tree-dump-times "acc loop vector" 2 "gimple" } } +// { dg-final { scan-tree-dump-times "acc loop seq" 2 "gimple" } } +// { dg-final { scan-tree-dump-times "acc loop auto" 2 "gimple" } } +// { dg-final { scan-tree-dump-times "acc loop tile.2, 3" 2 "gimple" } } +// { dg-final { scan-tree-dump-times "acc loop independent private.i" 2 "gimple" } } +// { dg-final { scan-tree-dump-times "private.z" 2 "gimple" } } diff --git a/gcc/testsuite/c-c++-common/goacc/loop-clauses.c b/gcc/testsuite/c-c++-common/goacc/loop-clauses.c new file mode 100644 index 0000000..97b8786 --- /dev/null +++ b/gcc/testsuite/c-c++-common/goacc/loop-clauses.c @@ -0,0 +1,86 @@ +/* { dg-do compile } */ + +/* { dg-prune-output "sorry, unimplemented" } */ + +int +main () +{ + int i, j; + +#pragma acc parallel firstprivate (j) private (i) + { +#pragma acc loop seq + for (i = 0; i < 10; i++) + { } + } + +#pragma acc parallel default (none) + { +#pragma acc loop auto private (j) + for (i = 0; i < 10; i++) + { } +#pragma acc loop gang + for (i = 0; i < 10; i++) + { } +#pragma acc loop gang(static:5) + for (i = 0; i < 10; i++) + { } +#pragma acc loop gang(static:*) + for (i = 0; i < 10; i++) + { } +#pragma acc loop vector + for (i = 0; i < 10; i++) + { } +#pragma acc loop worker + for (i = 0; i < 10; i++) + { } +#pragma acc loop auto + for (i = 0; i < 10; i++) + { } +#pragma acc loop independent + for (i = 0; i < 10; i++) + { } +#pragma acc loop seq + for (i = 0; i < 10; i++) + { } +#pragma acc loop gang worker vector + for (i = 0; i < 10; i++) + { } + } + +#pragma acc kernels default (none) + { +#pragma acc loop auto + for (i = 0; i < 10; i++) + { } +#pragma acc loop gang (num:5) + for (i = 0; i < 10; i++) + { } +#pragma acc loop gang(static:5) + for (i = 0; i < 10; i++) + { } +#pragma acc loop gang(static:*) + for (i = 0; i < 10; i++) + { } +#pragma acc loop vector(length:10) + for (i = 0; i < 10; i++) + { } +#pragma acc loop worker(num:5) + for (i = 0; i < 10; i++) + { } +#pragma acc loop auto + for (i = 0; i < 10; i++) + { } +#pragma acc loop independent + for (i = 0; i < 10; i++) + { } +#pragma acc loop seq + for (i = 0; i < 10; i++) + { } +#pragma acc loop gang worker vector + for (i = 0; i < 10; i++) + { } + } + + return 0; +} diff --git a/gcc/testsuite/c-c++-common/goacc/loop-shape.c b/gcc/testsuite/c-c++-common/goacc/loop-shape.c index b6d3156..9708f7b 100644 --- a/gcc/testsuite/c-c++-common/goacc/loop-shape.c +++ b/gcc/testsuite/c-c++-common/goacc/loop-shape.c @@ -8,6 +8,7 @@ int main () int i; int v = 32, w = 19; int length = 1, num = 5; + int *abc; /* Valid uses. */ @@ -199,12 +200,12 @@ int main () ; #pragma acc kernels - #pragma acc loop gang(static: * abc) /* { dg-error "expected '.' before" } */ + #pragma acc loop gang(static: * abc) for (i = 0; i < 10; i++) ; #pragma acc kernels - #pragma acc loop gang(static:*num:1) /* { dg-error "expected '.' before" } */ + #pragma acc loop gang(static:*num:1) /* { dg-error "" } */ for (i = 0; i < 10; i++) ; diff --git a/gcc/testsuite/c-c++-common/goacc/tile.c b/gcc/testsuite/c-c++-common/goacc/tile.c new file mode 100644 index 0000000..2a81427 --- /dev/null +++ b/gcc/testsuite/c-c++-common/goacc/tile.c @@ -0,0 +1,73 @@ +/* { dg-do compile } */ + +int +main () +{ + int i, *a, b; + +#pragma acc parallel loop tile (10) + for (i = 0; i < 100; i++) + ; + +#pragma acc parallel loop tile (*) + for (i = 0; i < 100; i++) + ; + +#pragma acc parallel loop tile (10, *) + for (i = 0; i < 100; i++) + ; + +#pragma acc parallel loop tile (10, *, i) + for (i = 0; i < 100; i++) + ; + +#pragma acc parallel loop tile // { dg-error "expected '\\\('" } + for (i = 0; i < 100; i++) + ; + +#pragma acc parallel loop tile () // { dg-error "" } + for (i = 0; i < 100; i++) + ; + +#pragma acc parallel loop tile (,1) // { dg-error "" } + for (i = 0; i < 100; i++) + ; + +#pragma acc parallel loop tile (,,) // { dg-error "" } + for (i = 0; i < 100; i++) + ; + +#pragma acc parallel loop tile (1.1) // { dg-error "'tile' value must be integral" } + for (i = 0; i < 100; i++) + ; + +#pragma acc parallel loop tile (-3) // { dg-warning "'tile' value must be positive" } + for (i = 0; i < 100; i++) + ; + +#pragma acc parallel loop tile (10,-3) // { dg-warning "'tile' value must be positive" } + for (i = 0; i < 100; i++) + ; + +#pragma acc parallel loop tile (-100,10,5) // { dg-warning "'tile' value must be positive" } + for (i = 0; i < 100; i++) + ; + +#pragma acc parallel loop tile (1,2.0,true) // { dg-error "" } + for (i = 0; i < 100; i++) + ; + +#pragma acc parallel loop tile (*a, 1) + for (i = 0; i < 100; i++) + ; + +#pragma acc parallel loop tile (1, *a, b) + for (i = 0; i < 100; i++) + ; + +#pragma acc parallel loop tile (b, 1, *a) + for (i = 0; i < 100; i++) + ; + + return 0; +} diff --git a/gcc/testsuite/c-c++-common/goacc/update-1.c b/gcc/testsuite/c-c++-common/goacc/update-1.c index 97e9379..701ef36 100644 --- a/gcc/testsuite/c-c++-common/goacc/update-1.c +++ b/gcc/testsuite/c-c++-common/goacc/update-1.c @@ -1,7 +1,7 @@ void f (void) { -#pragma acc update /* { dg-error "'#pragma acc update' must contain at least one 'device' or 'host/self' clause" } */ +#pragma acc update /* { dg-error "'#pragma acc update' must contain at least one 'device' or 'host' or 'self' clause" } */ int i = 0; int a[10]; diff --git a/gcc/testsuite/g++.dg/goacc/template.C b/gcc/testsuite/g++.dg/goacc/template.C new file mode 100644 index 0000000..f7a717b --- /dev/null +++ b/gcc/testsuite/g++.dg/goacc/template.C @@ -0,0 +1,141 @@ +// This error is temporary. Remove when support is added for these clauses +// in the middle end. Also remove the comments from the reduction test +// after the FE learns that reduction variables may appear in data clauses too. +// { dg-prune-output "sorry, unimplemented" } + +#pragma acc routine +template <typename T> T +accDouble(int val) +{ + return val * 2; +} + +template<typename T> T +oacc_parallel_copy (T a) +{ + T b = 0; + char w = 1; + int x = 2; + float y = 3; + double z = 4; + +#pragma acc parallel num_gangs (a) num_workers (a) vector_length (a) default (none) copyout (b) copyin (a) + { + b = a; + } + +#pragma acc parallel num_gangs (a) copy (w, x, y, z) + { + w = accDouble<char>(w); + x = accDouble<int>(x); + y = accDouble<float>(y); + z = accDouble<double>(z); + } + +#pragma acc parallel num_gangs (a) if (1) + { +#pragma acc loop auto tile (a, 3) + for (int i = 0; i < a; i++) + for (int j = 0; j < 5; j++) + b = a; + +#pragma acc loop seq + for (int i = 0; i < a; i++) + b = a; + } + + T c; + +#pragma acc parallel num_workers (10) + { +#pragma acc atomic capture + c = b++; + +#pragma atomic update + c++; + +#pragma acc atomic read + b = a; + +#pragma acc atomic write + b = a; + } + +//#pragma acc parallel reduction (+:c) +// { +// c = 1; +// } + +#pragma acc data if (1) copy (b) + { + #pragma acc parallel + { + b = a; + } + } + +#pragma acc enter data copyin (b) +#pragma acc parallel present (b) + { + b = a; + } + +#pragma acc update host (b) +#pragma acc update self (b) +#pragma acc update device (b) +#pragma acc exit data delete (b) + + return b; +} + +template<typename T> T +oacc_kernels_copy (T a) +{ + T b = 0; + T c = 0; + char w = 1; + int x = 2; + float y = 3; + double z = 4; + +#pragma acc kernels copy (w, x, y, z) + { + w = accDouble<char>(w); + x = accDouble<int>(x); + y = accDouble<float>(y); + z = accDouble<double>(z); + } + +#pragma acc kernels copyout (b) copyin (a) + b = a; + +//#pragma acc kernels loop reduction (+:c) +// for (int i = 0; i < 10; i++) +// { +// c = 1; +// } + +#pragma acc data if (1) copy (b) + { + #pragma acc kernels + { + b = a; + } + } + +#pragma acc enter data copyin (b) +#pragma acc kernels present (b) + { + b = a; + } + return b; +} + +int +main () +{ + int b = oacc_parallel_copy<int> (5); + int c = oacc_kernels_copy<int> (5); + + return b + c; +} diff --git a/gcc/testsuite/gfortran.dg/goacc/combined-directives.f90 b/gcc/testsuite/gfortran.dg/goacc/combined-directives.f90 new file mode 100644 index 0000000..6977525 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/goacc/combined-directives.f90 @@ -0,0 +1,155 @@ +! Exercise combined OpenACC directives. + +! { dg-do compile } +! { dg-options "-fopenacc -fdump-tree-gimple" } + +! This error is temporary. Remove when support is added for these clauses +! in the middle end. +! { dg-prune-output "sorry, unimplemented" } + +! Update the reduction tests. + +subroutine test + implicit none + integer a(100), i, j, z + + ! PARALLEL + + !$acc parallel loop collapse (2) + do i = 1, 100 + do j = 1, 10 + end do + end do + !$acc end parallel loop + + !$acc parallel loop gang + do i = 1, 100 + end do + !$acc end parallel loop + + !$acc parallel loop worker + do i = 1, 100 + do j = 1, 10 + end do + end do + !$acc end parallel loop + + !$acc parallel loop vector + do i = 1, 100 + do j = 1, 10 + end do + end do + !$acc end parallel loop + + !$acc parallel loop seq + do i = 1, 100 + do j = 1, 10 + end do + end do + !$acc end parallel loop + + !$acc parallel loop auto + do i = 1, 100 + do j = 1, 10 + end do + end do + !$acc end parallel loop + + !$acc parallel loop tile (2, 3) + do i = 1, 100 + do j = 1, 10 + end do + end do + !$acc end parallel loop + + !$acc parallel loop independent + do i = 1, 100 + end do + !$acc end parallel loop + + !$acc parallel loop private (z) + do i = 1, 100 + z = 0 + end do + !$acc end parallel loop + +! !$acc parallel loop reduction (+:z) copy (z) +! do i = 1, 100 +! end do +! !$acc end parallel loop + + ! KERNELS + + !$acc kernels loop collapse (2) + do i = 1, 100 + do j = 1, 10 + end do + end do + !$acc end kernels loop + + !$acc kernels loop gang + do i = 1, 100 + end do + !$acc end kernels loop + + !$acc kernels loop worker + do i = 1, 100 + do j = 1, 10 + end do + end do + !$acc end kernels loop + + !$acc kernels loop vector + do i = 1, 100 + do j = 1, 10 + end do + end do + !$acc end kernels loop + + !$acc kernels loop seq + do i = 1, 100 + do j = 1, 10 + end do + end do + !$acc end kernels loop + + !$acc kernels loop auto + do i = 1, 100 + do j = 1, 10 + end do + end do + !$acc end kernels loop + + !$acc kernels loop tile (2, 3) + do i = 1, 100 + do j = 1, 10 + end do + end do + !$acc end kernels loop + + !$acc kernels loop independent + do i = 1, 100 + end do + !$acc end kernels loop + + !$acc kernels loop private (z) + do i = 1, 100 + z = 0 + end do + !$acc end kernels loop + +! !$acc kernels loop reduction (+:z) copy (z) +! do i = 1, 100 +! end do +! !$acc end kernels loop +end subroutine test + +! { dg-final { scan-tree-dump-times "acc loop private.i. private.j. collapse.2." 2 "gimple" } } +! { dg-final { scan-tree-dump-times "acc loop private.i. gang" 2 "gimple" } } +! { dg-final { scan-tree-dump-times "acc loop private.i. private.j. worker" 2 "gimple" } } +! { dg-final { scan-tree-dump-times "acc loop private.i. private.j. vector" 2 "gimple" } } +! { dg-final { scan-tree-dump-times "acc loop private.i. private.j. seq" 2 "gimple" } } +! { dg-final { scan-tree-dump-times "acc loop private.i. private.j. auto" 2 "gimple" } } +! { dg-final { scan-tree-dump-times "acc loop private.i. private.j. tile.2, 3" 2 "gimple" } } +! { dg-final { scan-tree-dump-times "acc loop private.i. independent" 2 "gimple" } } +! { dg-final { scan-tree-dump-times "private.z" 2 "gimple" } } diff --git a/gcc/testsuite/gfortran.dg/goacc/default.f95 b/gcc/testsuite/gfortran.dg/goacc/default.f95 new file mode 100644 index 0000000..c1fc52e --- /dev/null +++ b/gcc/testsuite/gfortran.dg/goacc/default.f95 @@ -0,0 +1,17 @@ +! { dg-do compile } + +program tile + integer i, j, a + + !$acc parallel default (shared) ! { dg-error "Unclassifiable OpenACC directive" } + !$acc end parallel ! { dg-error "Unexpected" } + + !$acc parallel default (private) ! { dg-error "Unclassifiable OpenACC directive" } + !$acc end parallel ! { dg-error "Unexpected" } + + !$acc parallel default (none) + !$acc end parallel + + !$acc parallel default (firstprivate) ! { dg-error "Unclassifiable OpenACC directive" } + !$acc end parallel ! { dg-error "Unexpected" } +end program tile diff --git a/gcc/testsuite/gfortran.dg/goacc/default_none.f95 b/gcc/testsuite/gfortran.dg/goacc/default_none.f95 new file mode 100644 index 0000000..5ce66ae --- /dev/null +++ b/gcc/testsuite/gfortran.dg/goacc/default_none.f95 @@ -0,0 +1,59 @@ +! Ensure that the internal array variables, offset, lbound, etc., don't +! trigger errors with default(none). + +! { dg-do compile } + +program main + implicit none + integer i + integer,parameter :: n = 100 + integer,allocatable :: a1(:), a2(:,:) + + allocate (a1 (n)) + allocate (a2 (-n:n,-n:n)) + a1 (:) = -1 + + !$acc parallel loop default(none) copy (a1(1:n)) + do i = 1,n + a1(i) = i + end do + !$acc end parallel loop + + call foo (a1) + call bar (a1, n) + call foobar (a2,n) + +contains + + subroutine foo (da1) + integer :: da1(n) + + !$acc parallel loop default(none) copy (da1(1:n)) + do i = 1,n + da1(i) = i*2 + end do + !$acc end parallel loop + end subroutine foo +end program main + +subroutine bar (da2,n) + integer :: n, da2(n) + integer i + + !$acc parallel loop default(none) copy (da2(1:n)) firstprivate(n) + do i = 1,n + da2(i) = i*3 + end do + !$acc end parallel loop +end subroutine bar + +subroutine foobar (da3,n) + integer :: n, da3(-n:n,-n:n) + integer i + + !$acc parallel loop default(none) copy (da3(-n:n,-n:n)) firstprivate(n) + do i = 1,n + da3(i,0) = i*3 + end do + !$acc end parallel loop +end subroutine foobar diff --git a/gcc/testsuite/gfortran.dg/goacc/firstprivate-1.f95 b/gcc/testsuite/gfortran.dg/goacc/firstprivate-1.f95 new file mode 100644 index 0000000..fb92dee --- /dev/null +++ b/gcc/testsuite/gfortran.dg/goacc/firstprivate-1.f95 @@ -0,0 +1,11 @@ +! { dg-do compile } + +program test + integer a, b(100) + + !$acc parallel firstprivate (a, b) + !$acc end parallel + + !$acc parallel firstprivate (b(10:20)) ! { dg-error "Syntax error in OpenMP variable list" } + !$acc end parallel ! { dg-error "Unexpected !\\\$ACC END PARALLEL statement" } +end program test diff --git a/gcc/testsuite/gfortran.dg/goacc/gang-static.f95 b/gcc/testsuite/gfortran.dg/goacc/gang-static.f95 new file mode 100644 index 0000000..4e46cf3 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/goacc/gang-static.f95 @@ -0,0 +1,68 @@ +! { dg-do compile } +! { dg-additional-options "-fdump-tree-omplower" } + +program main + integer, parameter :: n = 100 + integer i, a(n), b(n) + + do i = 1, n + b(i) = i + end do + + !$acc parallel loop gang (static:*) num_gangs (10) + do i = 1, n + a(i) = b(i) + 0 + end do + !$acc end parallel loop + + call test (a, b, 0, n) + + !$acc parallel loop gang (static:1) num_gangs (10) + do i = 1, n + a(i) = b(i) + 1 + end do + !$acc end parallel loop + + call test (a, b, 1, n) + + !$acc parallel loop gang (static:2) num_gangs (10) + do i = 1, n + a(i) = b(i) + 2 + end do + !$acc end parallel loop + + call test (a, b, 2, n) + + !$acc parallel loop gang (static:5) num_gangs (10) + do i = 1, n + a(i) = b(i) + 5 + end do + !$acc end parallel loop + + call test (a, b, 5, n) + + !$acc parallel loop gang (static:20) num_gangs (10) + do i = 1, n + a(i) = b(i) + 20 + end do + !$acc end parallel loop + + call test (a, b, 20, n) + +end program main + +subroutine test (a, b, sarg, n) + integer n + integer a (n), b(n), sarg + integer i + + do i = 1, n + if (a(i) .ne. b(i) + sarg) call abort () + end do +end subroutine test + +! { dg-final { scan-tree-dump-times "gang\\(static:\\\*\\)" 1 "omplower" } } +! { dg-final { scan-tree-dump-times "gang\\(static:1\\)" 1 "omplower" } } +! { dg-final { scan-tree-dump-times "gang\\(static:2\\)" 1 "omplower" } } +! { dg-final { scan-tree-dump-times "gang\\(static:5\\)" 1 "omplower" } } +! { dg-final { scan-tree-dump-times "gang\\(static:20\\)" 1 "omplower" } } diff --git a/gcc/testsuite/gfortran.dg/goacc/kernels-loop-inner.f95 b/gcc/testsuite/gfortran.dg/goacc/kernels-loop-inner.f95 new file mode 100644 index 0000000..4db3a50 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/goacc/kernels-loop-inner.f95 @@ -0,0 +1,23 @@ +! { dg-additional-options "-O2" } +! { dg-additional-options "-ftree-parallelize-loops=32" } + +program main + implicit none + + integer :: a(100,100), b(100,100) + integer :: i, j, d + + !$acc kernels + do i=1,100 + do j=1,100 + a(i,j) = 1 + b(i,j) = 2 + a(i,j) = a(i,j) + b(i,j) + end do + end do + !$acc end kernels + + d = sum(a) + + print *,d +end program main diff --git a/gcc/testsuite/gfortran.dg/goacc/kernels-loops-adjacent.f95 b/gcc/testsuite/gfortran.dg/goacc/kernels-loops-adjacent.f95 new file mode 100644 index 0000000..fef3d10 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/goacc/kernels-loops-adjacent.f95 @@ -0,0 +1,19 @@ +! { dg-additional-options "-O2" } +! { dg-additional-options "-ftree-parallelize-loops=10" } + +program main + implicit none + + integer :: a(10000), b(10000) + integer :: d + + !$acc kernels + a = 1 + b = 2 + a = a + b + !$acc end kernels + + d = sum(a) + + print *,d +end program main diff --git a/gcc/testsuite/gfortran.dg/goacc/list.f95 b/gcc/testsuite/gfortran.dg/goacc/list.f95 index 94fdadd..a8006bc 100644 --- a/gcc/testsuite/gfortran.dg/goacc/list.f95 +++ b/gcc/testsuite/gfortran.dg/goacc/list.f95 @@ -5,7 +5,7 @@ program test implicit none integer :: i, j, k, l, a(10) - common /b/ j, k + common /b/ k real, pointer :: p1 => NULL() complex :: c, d(10) @@ -108,4 +108,4 @@ program test !$acc host_data use_device(p1) ! { dg-error "POINTER" } !$acc end host_data -end program test
\ No newline at end of file +end program test diff --git a/gcc/testsuite/gfortran.dg/goacc/loop-2.f95 b/gcc/testsuite/gfortran.dg/goacc/loop-2.f95 index f85691e..b5e6368 100644 --- a/gcc/testsuite/gfortran.dg/goacc/loop-2.f95 +++ b/gcc/testsuite/gfortran.dg/goacc/loop-2.f95 @@ -66,7 +66,7 @@ program test !$acc loop seq worker ! { dg-error "conflicts with" } DO i = 1,10 ENDDO - !$acc loop gang worker ! { dg-error "conflicts with" } + !$acc loop gang worker DO i = 1,10 ENDDO @@ -94,10 +94,10 @@ program test !$acc loop seq vector ! { dg-error "conflicts with" } DO i = 1,10 ENDDO - !$acc loop gang vector ! { dg-error "conflicts with" } + !$acc loop gang vector DO i = 1,10 ENDDO - !$acc loop worker vector ! { dg-error "conflicts with" } + !$acc loop worker vector DO i = 1,10 ENDDO @@ -239,7 +239,7 @@ program test !$acc loop seq worker ! { dg-error "conflicts with" } DO i = 1,10 ENDDO - !$acc loop gang worker ! { dg-error "conflicts with" } + !$acc loop gang worker DO i = 1,10 ENDDO @@ -267,10 +267,10 @@ program test !$acc loop seq vector ! { dg-error "conflicts with" } DO i = 1,10 ENDDO - !$acc loop gang vector ! { dg-error "conflicts with" } + !$acc loop gang vector DO i = 1,10 ENDDO - !$acc loop worker vector ! { dg-error "conflicts with" } + !$acc loop worker vector DO i = 1,10 ENDDO @@ -392,7 +392,7 @@ program test !$acc kernels loop seq worker ! { dg-error "conflicts with" } DO i = 1,10 ENDDO - !$acc kernels loop gang worker ! { dg-error "conflicts with" } + !$acc kernels loop gang worker DO i = 1,10 ENDDO @@ -420,10 +420,10 @@ program test !$acc kernels loop seq vector ! { dg-error "conflicts with" } DO i = 1,10 ENDDO - !$acc kernels loop gang vector ! { dg-error "conflicts with" } + !$acc kernels loop gang vector DO i = 1,10 ENDDO - !$acc kernels loop worker vector ! { dg-error "conflicts with" } + !$acc kernels loop worker vector DO i = 1,10 ENDDO @@ -544,7 +544,7 @@ program test !$acc parallel loop seq worker ! { dg-error "conflicts with" } DO i = 1,10 ENDDO - !$acc parallel loop gang worker ! { dg-error "conflicts with" } + !$acc parallel loop gang worker DO i = 1,10 ENDDO @@ -572,10 +572,10 @@ program test !$acc parallel loop seq vector ! { dg-error "conflicts with" } DO i = 1,10 ENDDO - !$acc parallel loop gang vector ! { dg-error "conflicts with" } + !$acc parallel loop gang vector DO i = 1,10 ENDDO - !$acc parallel loop worker vector ! { dg-error "conflicts with" } + !$acc parallel loop worker vector DO i = 1,10 ENDDO @@ -646,4 +646,4 @@ program test !$acc parallel loop gang worker tile(*) DO i = 1,10 ENDDO -end
\ No newline at end of file +end diff --git a/gcc/testsuite/gfortran.dg/goacc/loop-4.f95 b/gcc/testsuite/gfortran.dg/goacc/loop-4.f95 new file mode 100644 index 0000000..7c53c02 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/goacc/loop-4.f95 @@ -0,0 +1,7 @@ +! Ensure that loops not affiliated with acc compute regions cause an error. + +subroutine test1 + !$acc loop gang ! { dg-error "loop directive must be associated with an OpenACC compute region" } + DO i = 1,10 + ENDDO +end subroutine test1 diff --git a/gcc/testsuite/gfortran.dg/goacc/loop-5.f95 b/gcc/testsuite/gfortran.dg/goacc/loop-5.f95 new file mode 100644 index 0000000..5cbd975 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/goacc/loop-5.f95 @@ -0,0 +1,363 @@ +! { dg-do compile } +! { dg-additional-options "-fmax-errors=100" } + +! { dg-prune-output "sorry, unimplemented" } +! { dg-prune-output "Error: work-sharing region" } + +program test + implicit none + integer :: i, j + + !$acc kernels + !$acc loop auto + DO i = 1,10 + ENDDO + !$acc loop gang + DO i = 1,10 + ENDDO + !$acc loop gang(5) + DO i = 1,10 + ENDDO + !$acc loop gang(num:5) + DO i = 1,10 + ENDDO + !$acc loop gang(static:5) + DO i = 1,10 + ENDDO + !$acc loop gang(static:*) + DO i = 1,10 + ENDDO + !$acc loop gang + DO i = 1,10 + !$acc loop vector + DO j = 1,10 + ENDDO + !$acc loop worker + DO j = 1,10 + ENDDO + ENDDO + + !$acc loop worker + DO i = 1,10 + ENDDO + !$acc loop worker(5) + DO i = 1,10 + ENDDO + !$acc loop worker(num:5) + DO i = 1,10 + ENDDO + !$acc loop worker + DO i = 1,10 + !$acc loop vector + DO j = 1,10 + ENDDO + ENDDO + !$acc loop gang worker + DO i = 1,10 + ENDDO + + !$acc loop vector + DO i = 1,10 + ENDDO + !$acc loop vector(5) + DO i = 1,10 + ENDDO + !$acc loop vector(length:5) + DO i = 1,10 + ENDDO + !$acc loop vector + DO i = 1,10 + ENDDO + !$acc loop gang vector + DO i = 1,10 + ENDDO + !$acc loop worker vector + DO i = 1,10 + ENDDO + + !$acc loop auto + DO i = 1,10 + ENDDO + + !$acc loop tile(1) + DO i = 1,10 + ENDDO + !$acc loop tile(2) + DO i = 1,10 + ENDDO + !$acc loop tile(6-2) + DO i = 1,10 + ENDDO + !$acc loop tile(6+2) + DO i = 1,10 + ENDDO + !$acc loop tile(*) + DO i = 1,10 + ENDDO + !$acc loop tile(*, 1) + DO i = 1,10 + 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 + !$acc loop worker tile(*) + DO i = 1,10 + ENDDO + !$acc loop gang tile(*) + DO i = 1,10 + ENDDO + !$acc loop vector gang tile(*) + DO i = 1,10 + ENDDO + !$acc loop vector worker tile(*) + DO i = 1,10 + ENDDO + !$acc loop gang worker tile(*) + DO i = 1,10 + ENDDO + !$acc end kernels + + + !$acc parallel + !$acc loop tile(1) + DO i = 1,10 + ENDDO + !$acc loop tile(*) + DO i = 1,10 + ENDDO + !$acc loop tile(2) + DO i = 1,10 + 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 + !$acc loop worker tile(*) + DO i = 1,10 + ENDDO + !$acc loop gang tile(*) + DO i = 1,10 + ENDDO + !$acc loop vector gang tile(*) + DO i = 1,10 + ENDDO + !$acc loop vector worker tile(*) + DO i = 1,10 + ENDDO + !$acc loop gang worker tile(*) + DO i = 1,10 + ENDDO + !$acc end parallel + + !$acc kernels loop auto + DO i = 1,10 + ENDDO + !$acc kernels loop gang + DO i = 1,10 + ENDDO + !$acc kernels loop gang(5) + DO i = 1,10 + ENDDO + !$acc kernels loop gang(num:5) + DO i = 1,10 + ENDDO + !$acc kernels loop gang(static:5) + DO i = 1,10 + ENDDO + !$acc kernels loop gang(static:*) + DO i = 1,10 + ENDDO + !$acc kernels loop gang + DO i = 1,10 + !$acc kernels loop gang ! { dg-error "OpenACC construct inside of non-OpenACC region" } + DO j = 1,10 + ENDDO + ENDDO + + !$acc kernels loop worker + DO i = 1,10 + ENDDO + !$acc kernels loop worker(5) + DO i = 1,10 + ENDDO + !$acc kernels loop worker(num:5) + DO i = 1,10 + ENDDO + !$acc kernels loop worker + DO i = 1,10 + !$acc kernels loop worker ! { dg-error "OpenACC construct inside of non-OpenACC region" } + DO j = 1,10 + ENDDO + !$acc kernels loop gang ! { dg-error "OpenACC construct inside of non-OpenACC region" } + DO j = 1,10 + ENDDO + ENDDO + !$acc kernels loop gang worker + DO i = 1,10 + ENDDO + + !$acc kernels loop vector + DO i = 1,10 + ENDDO + !$acc kernels loop vector(5) + DO i = 1,10 + ENDDO + !$acc kernels loop vector(length:5) + DO i = 1,10 + ENDDO + !$acc kernels loop vector + DO i = 1,10 + !$acc kernels loop vector ! { dg-error "OpenACC construct inside of non-OpenACC region" } + DO j = 1,10 + ENDDO + !$acc kernels loop worker ! { dg-error "OpenACC construct inside of non-OpenACC region" } + DO j = 1,10 + ENDDO + !$acc kernels loop gang ! { dg-error "OpenACC construct inside of non-OpenACC region" } + DO j = 1,10 + ENDDO + ENDDO + !$acc kernels loop gang vector + DO i = 1,10 + ENDDO + !$acc kernels loop worker vector + DO i = 1,10 + ENDDO + + !$acc kernels loop auto + DO i = 1,10 + ENDDO + + !$acc kernels loop tile(1) + DO i = 1,10 + ENDDO + !$acc kernels loop tile(*) + DO i = 1,10 + ENDDO + !$acc kernels loop tile(*, 1) + DO i = 1,10 + 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 + !$acc kernels loop worker tile(*) + DO i = 1,10 + ENDDO + !$acc kernels loop gang tile(*) + DO i = 1,10 + ENDDO + !$acc kernels loop vector gang tile(*) + DO i = 1,10 + ENDDO + !$acc kernels loop vector worker tile(*) + DO i = 1,10 + ENDDO + !$acc kernels loop gang worker tile(*) + DO i = 1,10 + ENDDO + + !$acc parallel loop auto + DO i = 1,10 + ENDDO + !$acc parallel loop gang + DO i = 1,10 + ENDDO + !$acc parallel loop gang(static:5) + DO i = 1,10 + ENDDO + !$acc parallel loop gang(static:*) + DO i = 1,10 + ENDDO + !$acc parallel loop gang + DO i = 1,10 + !$acc parallel loop gang ! { dg-error "OpenACC construct inside of non-OpenACC region" } + DO j = 1,10 + ENDDO + ENDDO + + !$acc parallel loop worker + DO i = 1,10 + ENDDO + !$acc parallel loop worker + DO i = 1,10 + !$acc parallel loop worker ! { dg-error "OpenACC construct inside of non-OpenACC region" } + DO j = 1,10 + ENDDO + !$acc parallel loop gang ! { dg-error "OpenACC construct inside of non-OpenACC region" } + DO j = 1,10 + ENDDO + ENDDO + !$acc parallel loop gang worker + DO i = 1,10 + ENDDO + + !$acc parallel loop vector + DO i = 1,10 + !$acc parallel loop vector ! { dg-error "OpenACC construct inside of non-OpenACC region" } + DO j = 1,10 + ENDDO + !$acc parallel loop worker ! { dg-error "OpenACC construct inside of non-OpenACC region" } + DO j = 1,10 + ENDDO + !$acc parallel loop gang ! { dg-error "OpenACC construct inside of non-OpenACC region" } + DO j = 1,10 + ENDDO + ENDDO + !$acc parallel loop gang vector + DO i = 1,10 + ENDDO + !$acc parallel loop worker vector + DO i = 1,10 + ENDDO + + !$acc parallel loop auto + DO i = 1,10 + ENDDO + + !$acc parallel loop tile(1) + DO i = 1,10 + ENDDO + !$acc parallel loop tile(*) + DO i = 1,10 + ENDDO + !$acc parallel loop tile(*, 1) + DO i = 1,10 + 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 + !$acc parallel loop worker tile(*) + DO i = 1,10 + ENDDO + !$acc parallel loop gang tile(*) + DO i = 1,10 + ENDDO + !$acc parallel loop vector gang tile(*) + DO i = 1,10 + ENDDO + !$acc parallel loop vector worker tile(*) + DO i = 1,10 + ENDDO + !$acc parallel loop gang worker tile(*) + DO i = 1,10 + ENDDO +end diff --git a/gcc/testsuite/gfortran.dg/goacc/loop-6.f95 b/gcc/testsuite/gfortran.dg/goacc/loop-6.f95 new file mode 100644 index 0000000..e13abc7 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/goacc/loop-6.f95 @@ -0,0 +1,82 @@ +! { dg-do compile } +! { dg-additional-options "-fmax-errors=100" } + +! This error is temporary. Remove when support is added for these clauses +! in the middle end. +! { dg-prune-output "sorry, unimplemented" } +! { dg-prune-output "Error: work-sharing region" } + +program test + implicit none + integer :: i, j + + !$acc parallel + !$acc loop auto + DO i = 1,10 + ENDDO + !$acc loop gang + DO i = 1,10 + ENDDO + !$acc loop gang(static:5) + DO i = 1,10 + ENDDO + !$acc loop gang(static:*) + DO i = 1,10 + ENDDO + !$acc loop gang + DO i = 1,10 + !$acc loop vector + DO j = 1,10 + ENDDO + !$acc loop worker + DO j = 1,10 + ENDDO + ENDDO + + !$acc loop worker + DO i = 1,10 + ENDDO + !$acc loop worker + DO i = 1,10 + !$acc loop vector + DO j = 1,10 + ENDDO + ENDDO + !$acc loop gang worker + DO i = 1,10 + ENDDO + + !$acc loop vector + DO i = 1,10 + ENDDO + !$acc loop vector(5) ! { dg-error "argument not permitted" } + DO i = 1,10 + ENDDO + !$acc loop vector(length:5) ! { dg-error "argument not permitted" } + DO i = 1,10 + ENDDO + !$acc loop vector + DO i = 1,10 + ENDDO + !$acc loop gang vector + DO i = 1,10 + ENDDO + !$acc loop worker vector + DO i = 1,10 + ENDDO + + !$acc loop auto + DO i = 1,10 + ENDDO + !$acc end parallel + + !$acc parallel loop vector + DO i = 1,10 + ENDDO + !$acc parallel loop vector(5) ! { dg-error "argument not permitted" } + DO i = 1,10 + ENDDO + !$acc parallel loop vector(length:5) ! { dg-error "argument not permitted" } + DO i = 1,10 + ENDDO +end diff --git a/gcc/testsuite/gfortran.dg/goacc/loop-tree-1.f90 b/gcc/testsuite/gfortran.dg/goacc/loop-tree-1.f90 index d72bae4..6cfd715 100644 --- a/gcc/testsuite/gfortran.dg/goacc/loop-tree-1.f90 +++ b/gcc/testsuite/gfortran.dg/goacc/loop-tree-1.f90 @@ -3,6 +3,11 @@ ! test for tree-dump-original and spaces-commas +! This error is temporary. Remove when support is added for these clauses +! in the middle end. +! { dg-prune-output "sorry, unimplemented" } +! { dg-prune-output "Error: work-sharing region" } + program test implicit none integer :: i, j, k, m, sum @@ -17,7 +22,7 @@ program test !$acc loop independent gang (3) DO i = 1,10 - !$acc loop worker(3) ! { dg-error "work-sharing region may not be closely nested inside of work-sharing, critical, ordered, master or explicit task region" } + !$acc loop worker(3) DO j = 1,10 !$acc loop vector(5) DO k = 1,10 diff --git a/gcc/testsuite/gfortran.dg/goacc/multi-clause.f90 b/gcc/testsuite/gfortran.dg/goacc/multi-clause.f90 new file mode 100644 index 0000000..2870076 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/goacc/multi-clause.f90 @@ -0,0 +1,13 @@ +! Test if variable appearing in multiple clauses are errors. + +! { dg-compile } + +program combined + implicit none + integer a(100), i, j + + !$acc parallel loop reduction (+:j) copy (j) copyout(j) ! { dg-error "Symbol 'j' present on multiple clauses" } + do i = 1, 100 + end do + !$acc end parallel loop +end program combined diff --git a/gcc/testsuite/gfortran.dg/goacc/parallel-tree.f95 b/gcc/testsuite/gfortran.dg/goacc/parallel-tree.f95 index 4915744..9037f6c 100644 --- a/gcc/testsuite/gfortran.dg/goacc/parallel-tree.f95 +++ b/gcc/testsuite/gfortran.dg/goacc/parallel-tree.f95 @@ -37,4 +37,3 @@ end program test ! { dg-final { scan-tree-dump-times "map\\(force_deviceptr:u\\)" 1 "original" } } ! { dg-final { scan-tree-dump-times "private\\(v\\)" 1 "original" } } -! { dg-final { scan-tree-dump-times "firstprivate\\(w\\)" 1 "original" } } diff --git a/gcc/testsuite/gfortran.dg/goacc/update.f95 b/gcc/testsuite/gfortran.dg/goacc/update.f95 new file mode 100644 index 0000000..d88d20e --- /dev/null +++ b/gcc/testsuite/gfortran.dg/goacc/update.f95 @@ -0,0 +1,5 @@ +! { dg-do compile } + +program foo + !$acc update ! { dg-error "must contain at least one 'device' or 'host' or 'self' clause" } +end program foo |