diff mbox

[16/16] Add libgomp.oacc-fortran/kernels-*.f95

Message ID 5640FE14.40408@mentor.com
State New
Headers show

Commit Message

Tom de Vries Nov. 9, 2015, 8:12 p.m. UTC
On 09/11/15 16:35, Tom de Vries wrote:
> Hi,
>
> this patch series for stage1 trunk adds support to:
> - parallelize oacc kernels regions using parloops, and
> - map the loops onto the oacc gang dimension.
>
> The patch series contains these patches:
>
>       1    Insert new exit block only when needed in
>          transform_to_exit_first_loop_alt
>       2    Make create_parallel_loop return void
>       3    Ignore reduction clause on kernels directive
>       4    Implement -foffload-alias
>       5    Add in_oacc_kernels_region in struct loop
>       6    Add pass_oacc_kernels
>       7    Add pass_dominator_oacc_kernels
>       8    Add pass_ch_oacc_kernels
>       9    Add pass_parallelize_loops_oacc_kernels
>      10    Add pass_oacc_kernels pass group in passes.def
>      11    Update testcases after adding kernels pass group
>      12    Handle acc loop directive
>      13    Add c-c++-common/goacc/kernels-*.c
>      14    Add gfortran.dg/goacc/kernels-*.f95
>      15    Add libgomp.oacc-c-c++-common/kernels-*.c
>      16    Add libgomp.oacc-fortran/kernels-*.f95
>
> The first 9 patches are more or less independent, but patches 10-16 are
> intended to be committed at the same time.
>
> Bootstrapped and reg-tested on x86_64.
>
> Build and reg-tested with nvidia accelerator, in combination with a
> patch that enables accelerator testing (which is submitted at
> https://gcc.gnu.org/ml/gcc-patches/2015-10/msg01771.html ).
>
> I'll post the individual patches in reply to this message.

This patch adds Fortran oacc kernels execution tests.

Thanks,
- Tom

Comments

Tom de Vries March 9, 2016, 9:19 a.m. UTC | #1
On 09/11/15 21:12, Tom de Vries wrote:
> On 09/11/15 16:35, Tom de Vries wrote:
>> Hi,
>>
>> this patch series for stage1 trunk adds support to:
>> - parallelize oacc kernels regions using parloops, and
>> - map the loops onto the oacc gang dimension.
>>
>> The patch series contains these patches:
>>
>>       1    Insert new exit block only when needed in
>>          transform_to_exit_first_loop_alt
>>       2    Make create_parallel_loop return void
>>       3    Ignore reduction clause on kernels directive
>>       4    Implement -foffload-alias
>>       5    Add in_oacc_kernels_region in struct loop
>>       6    Add pass_oacc_kernels
>>       7    Add pass_dominator_oacc_kernels
>>       8    Add pass_ch_oacc_kernels
>>       9    Add pass_parallelize_loops_oacc_kernels
>>      10    Add pass_oacc_kernels pass group in passes.def
>>      11    Update testcases after adding kernels pass group
>>      12    Handle acc loop directive
>>      13    Add c-c++-common/goacc/kernels-*.c
>>      14    Add gfortran.dg/goacc/kernels-*.f95
>>      15    Add libgomp.oacc-c-c++-common/kernels-*.c
>>      16    Add libgomp.oacc-fortran/kernels-*.f95
>>
>> The first 9 patches are more or less independent, but patches 10-16 are
>> intended to be committed at the same time.
>>
>> Bootstrapped and reg-tested on x86_64.
>>
>> Build and reg-tested with nvidia accelerator, in combination with a
>> patch that enables accelerator testing (which is submitted at
>> https://gcc.gnu.org/ml/gcc-patches/2015-10/msg01771.html ).
>>
>> I'll post the individual patches in reply to this message.
>
> This patch adds Fortran oacc kernels execution tests.

Retested on current trunk.

Committed, minus the kernels-parallel-loop-data-enter-exit.f95 test.

Thanks,
- Tom

> 0016-Add-libgomp.oacc-fortran-kernels-.f95.patch
>
>
> Add libgomp.oacc-fortran/kernels-*.f95
>
> 2015-11-09  Tom de Vries  <tom@codesourcery.com>
>
> 	* testsuite/libgomp.oacc-fortran/kernels-loop-2.f95: New test.
> 	* testsuite/libgomp.oacc-fortran/kernels-loop-data-2.f95: Same.
> 	* testsuite/libgomp.oacc-fortran/kernels-loop-data-enter-exit-2.f95:
> 	Same.
> 	* testsuite/libgomp.oacc-fortran/kernels-loop-data-enter-exit.f95: Same.
> 	* testsuite/libgomp.oacc-fortran/kernels-loop-data-update.f95: Same.
> 	* testsuite/libgomp.oacc-fortran/kernels-loop-data.f95: Same.
> 	* testsuite/libgomp.oacc-fortran/kernels-loop.f95: Same.
> 	* testsuite/libgomp.oacc-fortran/kernels-parallel-loop-data-enter-exit.f95:
> 	Same.
> ---
>   .../libgomp.oacc-fortran/kernels-loop-2.f95        | 32 ++++++++++++++++++
>   .../libgomp.oacc-fortran/kernels-loop-data-2.f95   | 38 ++++++++++++++++++++++
>   .../kernels-loop-data-enter-exit-2.f95             | 38 ++++++++++++++++++++++
>   .../kernels-loop-data-enter-exit.f95               | 36 ++++++++++++++++++++
>   .../kernels-loop-data-update.f95                   | 36 ++++++++++++++++++++
>   .../libgomp.oacc-fortran/kernels-loop-data.f95     | 36 ++++++++++++++++++++
>   .../libgomp.oacc-fortran/kernels-loop.f95          | 28 ++++++++++++++++
>   .../kernels-parallel-loop-data-enter-exit.f95      | 37 +++++++++++++++++++++
>   8 files changed, 281 insertions(+)
>   create mode 100644 libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-2.f95
>   create mode 100644 libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data-2.f95
>   create mode 100644 libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data-enter-exit-2.f95
>   create mode 100644 libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data-enter-exit.f95
>   create mode 100644 libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data-update.f95
>   create mode 100644 libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data.f95
>   create mode 100644 libgomp/testsuite/libgomp.oacc-fortran/kernels-loop.f95
>   create mode 100644 libgomp/testsuite/libgomp.oacc-fortran/kernels-parallel-loop-data-enter-exit.f95
>
> diff --git a/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-2.f95 b/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-2.f95
> new file mode 100644
> index 0000000..1fb40ee
> --- /dev/null
> +++ b/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-2.f95
> @@ -0,0 +1,32 @@
> +! { dg-do run }
> +! { dg-options "-ftree-parallelize-loops=32" }
> +
> +program main
> +  implicit none
> +  integer, parameter         :: n = 1024
> +  integer, dimension (0:n-1) :: a, b, c
> +  integer                    :: i, ii
> +
> +  !$acc kernels copyout (a(0:n-1))
> +  do i = 0, n - 1
> +     a(i) = i * 2
> +  end do
> +  !$acc end kernels
> +
> +  !$acc kernels copyout (b(0:n-1))
> +  do i = 0, n -1
> +     b(i) = i * 4
> +  end do
> +  !$acc end kernels
> +
> +  !$acc kernels copyin (a(0:n-1), b(0:n-1)) copyout (c(0:n-1))
> +  do ii = 0, n - 1
> +     c(ii) = a(ii) + b(ii)
> +  end do
> +  !$acc end kernels
> +
> +  do i = 0, n - 1
> +     if (c(i) .ne. a(i) + b(i)) call abort
> +  end do
> +
> +end program main
> diff --git a/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data-2.f95 b/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data-2.f95
> new file mode 100644
> index 0000000..7b52253
> --- /dev/null
> +++ b/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data-2.f95
> @@ -0,0 +1,38 @@
> +! { dg-do run }
> +! { dg-options "-ftree-parallelize-loops=32" }
> +
> +program main
> +  implicit none
> +  integer, parameter         :: n = 1024
> +  integer, dimension (0:n-1) :: a, b, c
> +  integer                    :: i, ii
> +
> +  !$acc data copyout (a(0:n-1))
> +  !$acc kernels present (a(0:n-1))
> +  do i = 0, n - 1
> +     a(i) = i * 2
> +  end do
> +  !$acc end kernels
> +  !$acc end data
> +
> +  !$acc data copyout (b(0:n-1))
> +  !$acc kernels present (b(0:n-1))
> +  do i = 0, n -1
> +     b(i) = i * 4
> +  end do
> +  !$acc end kernels
> +  !$acc end data
> +
> +  !$acc data copyin (a(0:n-1), b(0:n-1)) copyout (c(0:n-1))
> +  !$acc kernels present (a(0:n-1), b(0:n-1), c(0:n-1))
> +  do ii = 0, n - 1
> +     c(ii) = a(ii) + b(ii)
> +  end do
> +  !$acc end kernels
> +  !$acc end data
> +
> +  do i = 0, n - 1
> +     if (c(i) .ne. a(i) + b(i)) call abort
> +  end do
> +
> +end program main
> diff --git a/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data-enter-exit-2.f95 b/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data-enter-exit-2.f95
> new file mode 100644
> index 0000000..af98efa
> --- /dev/null
> +++ b/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data-enter-exit-2.f95
> @@ -0,0 +1,38 @@
> +! { dg-do run }
> +! { dg-options "-ftree-parallelize-loops=32" }
> +
> +program main
> +  implicit none
> +  integer, parameter         :: n = 1024
> +  integer, dimension (0:n-1) :: a, b, c
> +  integer                    :: i, ii
> +
> +  !$acc enter data create (a(0:n-1))
> +  !$acc kernels present (a(0:n-1))
> +  do i = 0, n - 1
> +     a(i) = i * 2
> +  end do
> +  !$acc end kernels
> +  !$acc exit data copyout (a(0:n-1))
> +
> +  !$acc enter data create (b(0:n-1))
> +  !$acc kernels present (b(0:n-1))
> +  do i = 0, n -1
> +     b(i) = i * 4
> +  end do
> +  !$acc end kernels
> +  !$acc exit data copyout (b(0:n-1))
> +
> +  !$acc enter data copyin (a(0:n-1), b(0:n-1)) create (c(0:n-1))
> +  !$acc kernels present (a(0:n-1), b(0:n-1), c(0:n-1))
> +  do ii = 0, n - 1
> +     c(ii) = a(ii) + b(ii)
> +  end do
> +  !$acc end kernels
> +  !$acc exit data copyout (c(0:n-1))
> +
> +  do i = 0, n - 1
> +     if (c(i) .ne. a(i) + b(i)) call abort
> +  end do
> +
> +end program main
> diff --git a/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data-enter-exit.f95 b/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data-enter-exit.f95
> new file mode 100644
> index 0000000..bb6f8dc
> --- /dev/null
> +++ b/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data-enter-exit.f95
> @@ -0,0 +1,36 @@
> +! { dg-do run }
> +! { dg-options "-ftree-parallelize-loops=32" }
> +
> +program main
> +  implicit none
> +  integer, parameter         :: n = 1024
> +  integer, dimension (0:n-1) :: a, b, c
> +  integer                    :: i, ii
> +
> +  !$acc enter data create (a(0:n-1), b(0:n-1), c(0:n-1))
> +
> +  !$acc kernels present (a(0:n-1))
> +  do i = 0, n - 1
> +     a(i) = i * 2
> +  end do
> +  !$acc end kernels
> +
> +  !$acc kernels present (b(0:n-1))
> +  do i = 0, n -1
> +     b(i) = i * 4
> +  end do
> +  !$acc end kernels
> +
> +  !$acc kernels present (a(0:n-1), b(0:n-1), c(0:n-1))
> +  do ii = 0, n - 1
> +     c(ii) = a(ii) + b(ii)
> +  end do
> +  !$acc end kernels
> +
> +  !$acc exit data copyout (a(0:n-1), b(0:n-1), c(0:n-1))
> +
> +  do i = 0, n - 1
> +     if (c(i) .ne. a(i) + b(i)) call abort
> +  end do
> +
> +end program main
> diff --git a/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data-update.f95 b/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data-update.f95
> new file mode 100644
> index 0000000..cab1f2c
> --- /dev/null
> +++ b/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data-update.f95
> @@ -0,0 +1,36 @@
> +! { dg-do run }
> +! { dg-options "-ftree-parallelize-loops=32" }
> +
> +program main
> +  implicit none
> +  integer, parameter         :: n = 1024
> +  integer, dimension (0:n-1) :: a, b, c
> +  integer                    :: i, ii
> +
> +  !$acc enter data create (a(0:n-1), b(0:n-1), c(0:n-1))
> +
> +  !$acc kernels present (a(0:n-1))
> +  do i = 0, n - 1
> +     a(i) = i * 2
> +  end do
> +  !$acc end kernels
> +
> +  do i = 0, n -1
> +     b(i) = i * 4
> +  end do
> +
> +  !$acc update device (b(0:n-1))
> +
> +  !$acc kernels present (a(0:n-1), b(0:n-1), c(0:n-1))
> +  do ii = 0, n - 1
> +     c(ii) = a(ii) + b(ii)
> +  end do
> +  !$acc end kernels
> +
> +  !$acc exit data copyout (a(0:n-1), c(0:n-1))
> +
> +  do i = 0, n - 1
> +     if (c(i) .ne. a(i) + b(i)) call abort
> +  end do
> +
> +end program main
> diff --git a/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data.f95 b/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data.f95
> new file mode 100644
> index 0000000..f26671d
> --- /dev/null
> +++ b/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data.f95
> @@ -0,0 +1,36 @@
> +! { dg-do run }
> +! { dg-options "-ftree-parallelize-loops=32" }
> +
> +program main
> +  implicit none
> +  integer, parameter         :: n = 1024
> +  integer, dimension (0:n-1) :: a, b, c
> +  integer                    :: i, ii
> +
> +  !$acc data copyout (a(0:n-1), b(0:n-1), c(0:n-1))
> +
> +  !$acc kernels present (a(0:n-1))
> +  do i = 0, n - 1
> +     a(i) = i * 2
> +  end do
> +  !$acc end kernels
> +
> +  !$acc kernels present (b(0:n-1))
> +  do i = 0, n -1
> +     b(i) = i * 4
> +  end do
> +  !$acc end kernels
> +
> +  !$acc kernels present (a(0:n-1), b(0:n-1), c(0:n-1))
> +  do ii = 0, n - 1
> +     c(ii) = a(ii) + b(ii)
> +  end do
> +  !$acc end kernels
> +
> +  !$acc end data
> +
> +  do i = 0, n - 1
> +     if (c(i) .ne. a(i) + b(i)) call abort
> +  end do
> +
> +end program main
> diff --git a/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop.f95 b/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop.f95
> new file mode 100644
> index 0000000..b02dd57
> --- /dev/null
> +++ b/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop.f95
> @@ -0,0 +1,28 @@
> +! { dg-do run }
> +! { dg-options "-ftree-parallelize-loops=32" }
> +
> +program main
> +  implicit none
> +  integer, parameter         :: n = 1024
> +  integer, dimension (0:n-1) :: a, b, c
> +  integer                    :: i, ii
> +
> +  do i = 0, n - 1
> +     a(i) = i * 2
> +  end do
> +
> +  do i = 0, n -1
> +     b(i) = i * 4
> +  end do
> +
> +  !$acc kernels copyin (a(0:n-1), b(0:n-1)) copyout (c(0:n-1))
> +  do ii = 0, n - 1
> +     c(ii) = a(ii) + b(ii)
> +  end do
> +  !$acc end kernels
> +
> +  do i = 0, n - 1
> +     if (c(i) .ne. a(i) + b(i)) call abort
> +  end do
> +
> +end program main
> diff --git a/libgomp/testsuite/libgomp.oacc-fortran/kernels-parallel-loop-data-enter-exit.f95 b/libgomp/testsuite/libgomp.oacc-fortran/kernels-parallel-loop-data-enter-exit.f95
> new file mode 100644
> index 0000000..2322152
> --- /dev/null
> +++ b/libgomp/testsuite/libgomp.oacc-fortran/kernels-parallel-loop-data-enter-exit.f95
> @@ -0,0 +1,37 @@
> +! { dg-do run }
> +! { dg-options "-ftree-parallelize-loops=32" }
> +
> +program main
> +  implicit none
> +  integer, parameter         :: n = 1024
> +  integer, dimension (0:n-1) :: a, b, c
> +  integer                    :: i, ii
> +
> +  !$acc enter data create (a(0:n-1), b(0:n-1), c(0:n-1))
> +
> +  !$acc kernels present (a(0:n-1))
> +  do i = 0, n - 1
> +     a(i) = i * 2
> +  end do
> +  !$acc end kernels
> +
> +  !$acc parallel present (b(0:n-1))
> +  !$acc loop
> +  do i = 0, n -1
> +     b(i) = i * 4
> +  end do
> +  !$acc end parallel
> +
> +  !$acc kernels present (a(0:n-1), b(0:n-1), c(0:n-1))
> +  do ii = 0, n - 1
> +     c(ii) = a(ii) + b(ii)
> +  end do
> +  !$acc end kernels
> +
> +  !$acc exit data copyout (a(0:n-1), b(0:n-1), c(0:n-1))
> +
> +  do i = 0, n - 1
> +     if (c(i) .ne. a(i) + b(i)) call abort
> +  end do
> +
> +end program main
>
diff mbox

Patch

Add libgomp.oacc-fortran/kernels-*.f95

2015-11-09  Tom de Vries  <tom@codesourcery.com>

	* testsuite/libgomp.oacc-fortran/kernels-loop-2.f95: New test.
	* testsuite/libgomp.oacc-fortran/kernels-loop-data-2.f95: Same.
	* testsuite/libgomp.oacc-fortran/kernels-loop-data-enter-exit-2.f95:
	Same.
	* testsuite/libgomp.oacc-fortran/kernels-loop-data-enter-exit.f95: Same.
	* testsuite/libgomp.oacc-fortran/kernels-loop-data-update.f95: Same.
	* testsuite/libgomp.oacc-fortran/kernels-loop-data.f95: Same.
	* testsuite/libgomp.oacc-fortran/kernels-loop.f95: Same.
	* testsuite/libgomp.oacc-fortran/kernels-parallel-loop-data-enter-exit.f95:
	Same.
---
 .../libgomp.oacc-fortran/kernels-loop-2.f95        | 32 ++++++++++++++++++
 .../libgomp.oacc-fortran/kernels-loop-data-2.f95   | 38 ++++++++++++++++++++++
 .../kernels-loop-data-enter-exit-2.f95             | 38 ++++++++++++++++++++++
 .../kernels-loop-data-enter-exit.f95               | 36 ++++++++++++++++++++
 .../kernels-loop-data-update.f95                   | 36 ++++++++++++++++++++
 .../libgomp.oacc-fortran/kernels-loop-data.f95     | 36 ++++++++++++++++++++
 .../libgomp.oacc-fortran/kernels-loop.f95          | 28 ++++++++++++++++
 .../kernels-parallel-loop-data-enter-exit.f95      | 37 +++++++++++++++++++++
 8 files changed, 281 insertions(+)
 create mode 100644 libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-2.f95
 create mode 100644 libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data-2.f95
 create mode 100644 libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data-enter-exit-2.f95
 create mode 100644 libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data-enter-exit.f95
 create mode 100644 libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data-update.f95
 create mode 100644 libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data.f95
 create mode 100644 libgomp/testsuite/libgomp.oacc-fortran/kernels-loop.f95
 create mode 100644 libgomp/testsuite/libgomp.oacc-fortran/kernels-parallel-loop-data-enter-exit.f95

diff --git a/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-2.f95 b/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-2.f95
new file mode 100644
index 0000000..1fb40ee
--- /dev/null
+++ b/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-2.f95
@@ -0,0 +1,32 @@ 
+! { dg-do run }
+! { dg-options "-ftree-parallelize-loops=32" }
+
+program main
+  implicit none
+  integer, parameter         :: n = 1024
+  integer, dimension (0:n-1) :: a, b, c
+  integer                    :: i, ii
+
+  !$acc kernels copyout (a(0:n-1))
+  do i = 0, n - 1
+     a(i) = i * 2
+  end do
+  !$acc end kernels
+
+  !$acc kernels copyout (b(0:n-1))
+  do i = 0, n -1
+     b(i) = i * 4
+  end do
+  !$acc end kernels
+
+  !$acc kernels copyin (a(0:n-1), b(0:n-1)) copyout (c(0:n-1))
+  do ii = 0, n - 1
+     c(ii) = a(ii) + b(ii)
+  end do
+  !$acc end kernels
+
+  do i = 0, n - 1
+     if (c(i) .ne. a(i) + b(i)) call abort
+  end do
+
+end program main
diff --git a/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data-2.f95 b/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data-2.f95
new file mode 100644
index 0000000..7b52253
--- /dev/null
+++ b/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data-2.f95
@@ -0,0 +1,38 @@ 
+! { dg-do run }
+! { dg-options "-ftree-parallelize-loops=32" }
+
+program main
+  implicit none
+  integer, parameter         :: n = 1024
+  integer, dimension (0:n-1) :: a, b, c
+  integer                    :: i, ii
+
+  !$acc data copyout (a(0:n-1))
+  !$acc kernels present (a(0:n-1))
+  do i = 0, n - 1
+     a(i) = i * 2
+  end do
+  !$acc end kernels
+  !$acc end data
+
+  !$acc data copyout (b(0:n-1))
+  !$acc kernels present (b(0:n-1))
+  do i = 0, n -1
+     b(i) = i * 4
+  end do
+  !$acc end kernels
+  !$acc end data
+
+  !$acc data copyin (a(0:n-1), b(0:n-1)) copyout (c(0:n-1))
+  !$acc kernels present (a(0:n-1), b(0:n-1), c(0:n-1))
+  do ii = 0, n - 1
+     c(ii) = a(ii) + b(ii)
+  end do
+  !$acc end kernels
+  !$acc end data
+
+  do i = 0, n - 1
+     if (c(i) .ne. a(i) + b(i)) call abort
+  end do
+
+end program main
diff --git a/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data-enter-exit-2.f95 b/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data-enter-exit-2.f95
new file mode 100644
index 0000000..af98efa
--- /dev/null
+++ b/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data-enter-exit-2.f95
@@ -0,0 +1,38 @@ 
+! { dg-do run }
+! { dg-options "-ftree-parallelize-loops=32" }
+
+program main
+  implicit none
+  integer, parameter         :: n = 1024
+  integer, dimension (0:n-1) :: a, b, c
+  integer                    :: i, ii
+
+  !$acc enter data create (a(0:n-1))
+  !$acc kernels present (a(0:n-1))
+  do i = 0, n - 1
+     a(i) = i * 2
+  end do
+  !$acc end kernels
+  !$acc exit data copyout (a(0:n-1))
+
+  !$acc enter data create (b(0:n-1))
+  !$acc kernels present (b(0:n-1))
+  do i = 0, n -1
+     b(i) = i * 4
+  end do
+  !$acc end kernels
+  !$acc exit data copyout (b(0:n-1))
+
+  !$acc enter data copyin (a(0:n-1), b(0:n-1)) create (c(0:n-1))
+  !$acc kernels present (a(0:n-1), b(0:n-1), c(0:n-1))
+  do ii = 0, n - 1
+     c(ii) = a(ii) + b(ii)
+  end do
+  !$acc end kernels
+  !$acc exit data copyout (c(0:n-1))
+
+  do i = 0, n - 1
+     if (c(i) .ne. a(i) + b(i)) call abort
+  end do
+
+end program main
diff --git a/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data-enter-exit.f95 b/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data-enter-exit.f95
new file mode 100644
index 0000000..bb6f8dc
--- /dev/null
+++ b/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data-enter-exit.f95
@@ -0,0 +1,36 @@ 
+! { dg-do run }
+! { dg-options "-ftree-parallelize-loops=32" }
+
+program main
+  implicit none
+  integer, parameter         :: n = 1024
+  integer, dimension (0:n-1) :: a, b, c
+  integer                    :: i, ii
+
+  !$acc enter data create (a(0:n-1), b(0:n-1), c(0:n-1))
+
+  !$acc kernels present (a(0:n-1))
+  do i = 0, n - 1
+     a(i) = i * 2
+  end do
+  !$acc end kernels
+
+  !$acc kernels present (b(0:n-1))
+  do i = 0, n -1
+     b(i) = i * 4
+  end do
+  !$acc end kernels
+
+  !$acc kernels present (a(0:n-1), b(0:n-1), c(0:n-1))
+  do ii = 0, n - 1
+     c(ii) = a(ii) + b(ii)
+  end do
+  !$acc end kernels
+
+  !$acc exit data copyout (a(0:n-1), b(0:n-1), c(0:n-1))
+
+  do i = 0, n - 1
+     if (c(i) .ne. a(i) + b(i)) call abort
+  end do
+
+end program main
diff --git a/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data-update.f95 b/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data-update.f95
new file mode 100644
index 0000000..cab1f2c
--- /dev/null
+++ b/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data-update.f95
@@ -0,0 +1,36 @@ 
+! { dg-do run }
+! { dg-options "-ftree-parallelize-loops=32" }
+
+program main
+  implicit none
+  integer, parameter         :: n = 1024
+  integer, dimension (0:n-1) :: a, b, c
+  integer                    :: i, ii
+
+  !$acc enter data create (a(0:n-1), b(0:n-1), c(0:n-1))
+
+  !$acc kernels present (a(0:n-1))
+  do i = 0, n - 1
+     a(i) = i * 2
+  end do
+  !$acc end kernels
+
+  do i = 0, n -1
+     b(i) = i * 4
+  end do
+
+  !$acc update device (b(0:n-1))
+
+  !$acc kernels present (a(0:n-1), b(0:n-1), c(0:n-1))
+  do ii = 0, n - 1
+     c(ii) = a(ii) + b(ii)
+  end do
+  !$acc end kernels
+
+  !$acc exit data copyout (a(0:n-1), c(0:n-1))
+
+  do i = 0, n - 1
+     if (c(i) .ne. a(i) + b(i)) call abort
+  end do
+
+end program main
diff --git a/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data.f95 b/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data.f95
new file mode 100644
index 0000000..f26671d
--- /dev/null
+++ b/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop-data.f95
@@ -0,0 +1,36 @@ 
+! { dg-do run }
+! { dg-options "-ftree-parallelize-loops=32" }
+
+program main
+  implicit none
+  integer, parameter         :: n = 1024
+  integer, dimension (0:n-1) :: a, b, c
+  integer                    :: i, ii
+
+  !$acc data copyout (a(0:n-1), b(0:n-1), c(0:n-1))
+
+  !$acc kernels present (a(0:n-1))
+  do i = 0, n - 1
+     a(i) = i * 2
+  end do
+  !$acc end kernels
+
+  !$acc kernels present (b(0:n-1))
+  do i = 0, n -1
+     b(i) = i * 4
+  end do
+  !$acc end kernels
+
+  !$acc kernels present (a(0:n-1), b(0:n-1), c(0:n-1))
+  do ii = 0, n - 1
+     c(ii) = a(ii) + b(ii)
+  end do
+  !$acc end kernels
+
+  !$acc end data
+
+  do i = 0, n - 1
+     if (c(i) .ne. a(i) + b(i)) call abort
+  end do
+
+end program main
diff --git a/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop.f95 b/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop.f95
new file mode 100644
index 0000000..b02dd57
--- /dev/null
+++ b/libgomp/testsuite/libgomp.oacc-fortran/kernels-loop.f95
@@ -0,0 +1,28 @@ 
+! { dg-do run }
+! { dg-options "-ftree-parallelize-loops=32" }
+
+program main
+  implicit none
+  integer, parameter         :: n = 1024
+  integer, dimension (0:n-1) :: a, b, c
+  integer                    :: i, ii
+
+  do i = 0, n - 1
+     a(i) = i * 2
+  end do
+
+  do i = 0, n -1
+     b(i) = i * 4
+  end do
+
+  !$acc kernels copyin (a(0:n-1), b(0:n-1)) copyout (c(0:n-1))
+  do ii = 0, n - 1
+     c(ii) = a(ii) + b(ii)
+  end do
+  !$acc end kernels
+
+  do i = 0, n - 1
+     if (c(i) .ne. a(i) + b(i)) call abort
+  end do
+
+end program main
diff --git a/libgomp/testsuite/libgomp.oacc-fortran/kernels-parallel-loop-data-enter-exit.f95 b/libgomp/testsuite/libgomp.oacc-fortran/kernels-parallel-loop-data-enter-exit.f95
new file mode 100644
index 0000000..2322152
--- /dev/null
+++ b/libgomp/testsuite/libgomp.oacc-fortran/kernels-parallel-loop-data-enter-exit.f95
@@ -0,0 +1,37 @@ 
+! { dg-do run }
+! { dg-options "-ftree-parallelize-loops=32" }
+
+program main
+  implicit none
+  integer, parameter         :: n = 1024
+  integer, dimension (0:n-1) :: a, b, c
+  integer                    :: i, ii
+
+  !$acc enter data create (a(0:n-1), b(0:n-1), c(0:n-1))
+
+  !$acc kernels present (a(0:n-1))
+  do i = 0, n - 1
+     a(i) = i * 2
+  end do
+  !$acc end kernels
+
+  !$acc parallel present (b(0:n-1))
+  !$acc loop
+  do i = 0, n -1
+     b(i) = i * 4
+  end do
+  !$acc end parallel
+
+  !$acc kernels present (a(0:n-1), b(0:n-1), c(0:n-1))
+  do ii = 0, n - 1
+     c(ii) = a(ii) + b(ii)
+  end do
+  !$acc end kernels
+
+  !$acc exit data copyout (a(0:n-1), b(0:n-1), c(0:n-1))
+
+  do i = 0, n - 1
+     if (c(i) .ne. a(i) + b(i)) call abort
+  end do
+
+end program main
-- 
1.9.1