[Openmp-commits] [openmp] [Flang][OpenMP] Derived type member map fortran offload runtime tests (PR #82850)
via Openmp-commits
openmp-commits at lists.llvm.org
Fri Mar 22 20:04:07 PDT 2024
https://github.com/agozillon updated https://github.com/llvm/llvm-project/pull/82850
>From d1dcf9e9c2622b06a7a1a9702c67c99f087993c5 Mon Sep 17 00:00:00 2001
From: Andrew Gozillon <Andrew.Gozillon at amd.com>
Date: Fri, 23 Feb 2024 18:45:58 -0600
Subject: [PATCH] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20initia?=
=?UTF-8?q?l=20version?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Created using spr 1.3.4
---
.../target-map-derived-type-full-1.f90 | 45 ++++++++++++++
.../target-map-derived-type-full-2.f90 | 60 ++++++++++++++++++
...arget-map-derived-type-full-implicit-1.f90 | 46 ++++++++++++++
...arget-map-derived-type-full-implicit-2.f90 | 61 +++++++++++++++++++
...pe-arr-bounds-member-enter-exit-update.f90 | 49 +++++++++++++++
...map-dtype-arr-bounds-member-enter-exit.f90 | 49 +++++++++++++++
...dtype-explicit-individual-array-member.f90 | 33 ++++++++++
...-multi-explicit-array-3D-member-bounds.f90 | 45 ++++++++++++++
...ype-multi-explicit-array-member-bounds.f90 | 38 ++++++++++++
...-map-dtype-multi-explicit-array-member.f90 | 39 ++++++++++++
...target-map-dtype-multi-explicit-member.f90 | 33 ++++++++++
.../fortran/target-map-enter-exit-array-2.f90 | 39 ++++++++++++
.../target-map-enter-exit-array-bounds.f90 | 44 +++++++++++++
.../fortran/target-map-enter-exit-scalar.f90 | 33 ++++++++++
...target-map-individual-dtype-member-map.f90 | 33 ++++++++++
.../target-map-two-dtype-explicit-member.f90 | 35 +++++++++++
...type-individual-member-array-1D-bounds.f90 | 39 ++++++++++++
...type-mixed-implicit-explicit-capture-1.f90 | 35 +++++++++++
...type-mixed-implicit-explicit-capture-2.f90 | 41 +++++++++++++
...two-dtype-multi-member-array-1D-bounds.f90 | 51 ++++++++++++++++
20 files changed, 848 insertions(+)
create mode 100644 openmp/libomptarget/test/offloading/fortran/target-map-derived-type-full-1.f90
create mode 100644 openmp/libomptarget/test/offloading/fortran/target-map-derived-type-full-2.f90
create mode 100644 openmp/libomptarget/test/offloading/fortran/target-map-derived-type-full-implicit-1.f90
create mode 100644 openmp/libomptarget/test/offloading/fortran/target-map-derived-type-full-implicit-2.f90
create mode 100644 openmp/libomptarget/test/offloading/fortran/target-map-dtype-arr-bounds-member-enter-exit-update.f90
create mode 100644 openmp/libomptarget/test/offloading/fortran/target-map-dtype-arr-bounds-member-enter-exit.f90
create mode 100644 openmp/libomptarget/test/offloading/fortran/target-map-dtype-explicit-individual-array-member.f90
create mode 100644 openmp/libomptarget/test/offloading/fortran/target-map-dtype-multi-explicit-array-3D-member-bounds.f90
create mode 100644 openmp/libomptarget/test/offloading/fortran/target-map-dtype-multi-explicit-array-member-bounds.f90
create mode 100644 openmp/libomptarget/test/offloading/fortran/target-map-dtype-multi-explicit-array-member.f90
create mode 100644 openmp/libomptarget/test/offloading/fortran/target-map-dtype-multi-explicit-member.f90
create mode 100644 openmp/libomptarget/test/offloading/fortran/target-map-enter-exit-array-2.f90
create mode 100644 openmp/libomptarget/test/offloading/fortran/target-map-enter-exit-array-bounds.f90
create mode 100644 openmp/libomptarget/test/offloading/fortran/target-map-enter-exit-scalar.f90
create mode 100644 openmp/libomptarget/test/offloading/fortran/target-map-individual-dtype-member-map.f90
create mode 100644 openmp/libomptarget/test/offloading/fortran/target-map-two-dtype-explicit-member.f90
create mode 100644 openmp/libomptarget/test/offloading/fortran/target-map-two-dtype-individual-member-array-1D-bounds.f90
create mode 100644 openmp/libomptarget/test/offloading/fortran/target-map-two-dtype-mixed-implicit-explicit-capture-1.f90
create mode 100644 openmp/libomptarget/test/offloading/fortran/target-map-two-dtype-mixed-implicit-explicit-capture-2.f90
create mode 100644 openmp/libomptarget/test/offloading/fortran/target-map-two-dtype-multi-member-array-1D-bounds.f90
diff --git a/openmp/libomptarget/test/offloading/fortran/target-map-derived-type-full-1.f90 b/openmp/libomptarget/test/offloading/fortran/target-map-derived-type-full-1.f90
new file mode 100644
index 00000000000000..cb03708554fed0
--- /dev/null
+++ b/openmp/libomptarget/test/offloading/fortran/target-map-derived-type-full-1.f90
@@ -0,0 +1,45 @@
+! Offloading test checking interaction of an
+! explicit derived type mapping when mapped
+! to target and assinging one derived type
+! to another
+! REQUIRES: flang, amdgcn-amd-amdhsa
+! UNSUPPORTED: nvptx64-nvidia-cuda
+! UNSUPPORTED: nvptx64-nvidia-cuda-LTO
+! UNSUPPORTED: aarch64-unknown-linux-gnu
+! UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
+! UNSUPPORTED: x86_64-pc-linux-gnu
+! UNSUPPORTED: x86_64-pc-linux-gnu-LTO
+
+! RUN: %libomptarget-compile-fortran-run-and-check-generic
+program main
+ type :: scalar
+ integer(4) :: ix = 0
+ real(4) :: rx = 0.0
+ complex(4) :: zx = (0,0)
+ end type scalar
+
+ type(scalar) :: in
+ type(scalar) :: out
+ in%ix = 10
+ in%rx = 2.0
+ in%zx = (2, 10)
+
+ !$omp target map(from:out) map(to:in)
+ out = in
+ !$omp end target
+
+ print*, in%ix
+ print*, in%rx
+ write (*,*) in%zx
+
+ print*, out%ix
+ print*, out%rx
+ write (*,*) out%zx
+end program main
+
+!CHECK: 10
+!CHECK: 2.
+!CHECK: (2.,10.)
+!CHECK: 10
+!CHECK: 2.
+!CHECK: (2.,10.)
diff --git a/openmp/libomptarget/test/offloading/fortran/target-map-derived-type-full-2.f90 b/openmp/libomptarget/test/offloading/fortran/target-map-derived-type-full-2.f90
new file mode 100644
index 00000000000000..0095b0fdf86a66
--- /dev/null
+++ b/openmp/libomptarget/test/offloading/fortran/target-map-derived-type-full-2.f90
@@ -0,0 +1,60 @@
+! Offloading test checking interaction of an
+! explicit derived type mapping when mapped to
+! target and assigning to individual members
+! REQUIRES: flang, amdgcn-amd-amdhsa
+! UNSUPPORTED: nvptx64-nvidia-cuda
+! UNSUPPORTED: nvptx64-nvidia-cuda-LTO
+! UNSUPPORTED: aarch64-unknown-linux-gnu
+! UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
+! UNSUPPORTED: x86_64-pc-linux-gnu
+! UNSUPPORTED: x86_64-pc-linux-gnu-LTO
+
+! RUN: %libomptarget-compile-fortran-run-and-check-generic
+program main
+ type :: scalar
+ integer(4) :: ix = 0
+ real(4) :: rx = 0.0
+ complex(4) :: zx = (0,0)
+ integer(4) :: array(5)
+ end type scalar
+
+ type(scalar) :: out
+ type(scalar) :: in
+
+ in%ix = 10
+ in%rx = 2.0
+ in%zx = (2, 10)
+
+ do i = 1, 5
+ in%array(i) = i
+ end do
+
+ !$omp target map(from:out) map(to:in)
+ out%ix = in%ix
+ out%rx = in%rx
+ out%zx = in%zx
+
+ do i = 1, 5
+ out%array(i) = in%array(i)
+ end do
+ !$omp end target
+
+ print*, in%ix
+ print*, in%rx
+ print*, in%array
+ write (*,*) in%zx
+
+ print*, out%ix
+ print*, out%rx
+ print*, out%array
+ write (*,*) out%zx
+end program main
+
+!CHECK: 10
+!CHECK: 2.
+!CHECK: 1 2 3 4 5
+!CHECK: (2.,10.)
+!CHECK: 10
+!CHECK: 2.
+!CHECK: 1 2 3 4 5
+!CHECK: (2.,10.)
diff --git a/openmp/libomptarget/test/offloading/fortran/target-map-derived-type-full-implicit-1.f90 b/openmp/libomptarget/test/offloading/fortran/target-map-derived-type-full-implicit-1.f90
new file mode 100644
index 00000000000000..f57e2c70d155e9
--- /dev/null
+++ b/openmp/libomptarget/test/offloading/fortran/target-map-derived-type-full-implicit-1.f90
@@ -0,0 +1,46 @@
+! Offloading test checking interaction of an
+! implicit derived type mapping when mapped
+! to target and assinging one derived type
+! to another
+! REQUIRES: flang, amdgcn-amd-amdhsa
+! UNSUPPORTED: nvptx64-nvidia-cuda
+! UNSUPPORTED: nvptx64-nvidia-cuda-LTO
+! UNSUPPORTED: aarch64-unknown-linux-gnu
+! UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
+! UNSUPPORTED: x86_64-pc-linux-gnu
+! UNSUPPORTED: x86_64-pc-linux-gnu-LTO
+
+! RUN: %libomptarget-compile-fortran-run-and-check-generic
+program main
+ type :: scalar
+ integer(4) :: ix = 0
+ real(4) :: rx = 0.0
+ complex(4) :: zx = (0,0)
+ end type scalar
+
+ type(scalar) :: in
+ type(scalar) :: out
+ in%ix = 10
+ in%rx = 2.0
+ in%zx = (2, 10)
+
+ !$omp target map(from:out)
+ out = in
+ !$omp end target
+
+ print*, in%ix
+ print*, in%rx
+ write (*,*) in%zx
+
+ print*, out%ix
+ print*, out%rx
+ write (*,*) out%zx
+ end program main
+
+!CHECK: 10
+!CHECK: 2.
+!CHECK: (2.,10.)
+!CHECK: 10
+!CHECK: 2.
+!CHECK: (2.,10.)
+
\ No newline at end of file
diff --git a/openmp/libomptarget/test/offloading/fortran/target-map-derived-type-full-implicit-2.f90 b/openmp/libomptarget/test/offloading/fortran/target-map-derived-type-full-implicit-2.f90
new file mode 100644
index 00000000000000..92d3454d462a7d
--- /dev/null
+++ b/openmp/libomptarget/test/offloading/fortran/target-map-derived-type-full-implicit-2.f90
@@ -0,0 +1,61 @@
+! Offloading test checking interaction of an
+! explicit derived type mapping when mapped
+! to target and assinging one derived type
+! to another
+! REQUIRES: flang, amdgcn-amd-amdhsa
+! UNSUPPORTED: nvptx64-nvidia-cuda
+! UNSUPPORTED: nvptx64-nvidia-cuda-LTO
+! UNSUPPORTED: aarch64-unknown-linux-gnu
+! UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
+! UNSUPPORTED: x86_64-pc-linux-gnu
+! UNSUPPORTED: x86_64-pc-linux-gnu-LTO
+
+! RUN: %libomptarget-compile-fortran-run-and-check-generic
+program main
+ type :: scalar
+ integer(4) :: ix = 0
+ real(4) :: rx = 0.0
+ complex(4) :: zx = (0,0)
+ integer(4) :: array(5)
+ end type scalar
+
+ type(scalar) :: out
+ type(scalar) :: in
+
+ in%ix = 10
+ in%rx = 2.0
+ in%zx = (2, 10)
+
+ do i = 1, 5
+ in%array(i) = i
+ end do
+
+ !$omp target
+ out%ix = in%ix
+ out%rx = in%rx
+ out%zx = in%zx
+
+ do i = 1, 5
+ out%array(i) = in%array(i)
+ end do
+ !$omp end target
+
+ print*, in%ix
+ print*, in%rx
+ print*, in%array
+ write (*,*) in%zx
+
+ print*, out%ix
+ print*, out%rx
+ print*, out%array
+ write (*,*) out%zx
+end program main
+
+!CHECK: 10
+!CHECK: 2.
+!CHECK: 1 2 3 4 5
+!CHECK: (2.,10.)
+!CHECK: 10
+!CHECK: 2.
+!CHECK: 1 2 3 4 5
+!CHECK: (2.,10.)
diff --git a/openmp/libomptarget/test/offloading/fortran/target-map-dtype-arr-bounds-member-enter-exit-update.f90 b/openmp/libomptarget/test/offloading/fortran/target-map-dtype-arr-bounds-member-enter-exit-update.f90
new file mode 100644
index 00000000000000..3b3ec96b9babfd
--- /dev/null
+++ b/openmp/libomptarget/test/offloading/fortran/target-map-dtype-arr-bounds-member-enter-exit-update.f90
@@ -0,0 +1,49 @@
+! Offloading test checking interaction of an
+! explicit derived type member mapping of
+! an array with bounds when mapped to
+! target using a combination of update,
+! enter and exit directives.
+! REQUIRES: flang, amdgcn-amd-amdhsa
+! UNSUPPORTED: nvptx64-nvidia-cuda
+! UNSUPPORTED: nvptx64-nvidia-cuda-LTO
+! UNSUPPORTED: aarch64-unknown-linux-gnu
+! UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
+! UNSUPPORTED: x86_64-pc-linux-gnu
+! UNSUPPORTED: x86_64-pc-linux-gnu-LTO
+
+! RUN: %libomptarget-compile-fortran-run-and-check-generic
+program main
+ type :: scalar_array
+ integer(4) :: array(10)
+ end type scalar_array
+
+ type(scalar_array) :: scalar_arr
+
+ do I = 1, 10
+ scalar_arr%array(I) = I + I
+ end do
+
+ !$omp target enter data map(to: scalar_arr%array(3:6))
+
+ ! overwrite our target data with an update.
+ do I = 1, 10
+ scalar_arr%array(I) = 10
+ end do
+
+ !$omp target update to(scalar_arr%array(3:6))
+
+ ! The compiler/runtime is less friendly about read/write out of
+ ! bounds when using enter and exit, we have to specifically loop
+ ! over the correct range
+ !$omp target
+ do i=3,6
+ scalar_arr%array(i) = scalar_arr%array(i) + i
+ end do
+ !$omp end target
+
+ !$omp target exit data map(from: scalar_arr%array(3:6))
+
+ print*, scalar_arr%array
+end program
+
+!CHECK: 10 10 13 14 15 16 10 10 10 10
diff --git a/openmp/libomptarget/test/offloading/fortran/target-map-dtype-arr-bounds-member-enter-exit.f90 b/openmp/libomptarget/test/offloading/fortran/target-map-dtype-arr-bounds-member-enter-exit.f90
new file mode 100644
index 00000000000000..5f7e9f94682659
--- /dev/null
+++ b/openmp/libomptarget/test/offloading/fortran/target-map-dtype-arr-bounds-member-enter-exit.f90
@@ -0,0 +1,49 @@
+! Offloading test checking interaction of an
+! explicit derived type member mapping of
+! an array with bounds when mapped to
+! target using a combination of enter and
+! exit directives.
+! REQUIRES: flang, amdgcn-amd-amdhsa
+! UNSUPPORTED: nvptx64-nvidia-cuda
+! UNSUPPORTED: nvptx64-nvidia-cuda-LTO
+! UNSUPPORTED: aarch64-unknown-linux-gnu
+! UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
+! UNSUPPORTED: x86_64-pc-linux-gnu
+! UNSUPPORTED: x86_64-pc-linux-gnu-LTO
+
+! RUN: %libomptarget-compile-fortran-run-and-check-generic
+program main
+ type :: scalar_array
+ integer(4) :: array(10)
+ end type scalar_array
+
+ type(scalar_array) :: scalar_arr
+
+ do I = 1, 10
+ scalar_arr%array(I) = I + I
+ end do
+
+ !$omp target enter data map(to: scalar_arr%array(3:6))
+
+ ! Shouldn't overwrite data already locked in
+ ! on target via enter, which will then be
+ ! overwritten by our exit
+ do I = 1, 10
+ scalar_arr%array(I) = 10
+ end do
+
+ ! The compiler/runtime is less friendly about read/write out of
+ ! bounds when using enter and exit, we have to specifically loop
+ ! over the correct range
+ !$omp target
+ do i=3,6
+ scalar_arr%array(i) = scalar_arr%array(i) + i
+ end do
+ !$omp end target
+
+ !$omp target exit data map(from: scalar_arr%array(3:6))
+
+ print*, scalar_arr%array
+end program
+
+!CHECK: 10 10 9 12 15 18 10 10 10 10
diff --git a/openmp/libomptarget/test/offloading/fortran/target-map-dtype-explicit-individual-array-member.f90 b/openmp/libomptarget/test/offloading/fortran/target-map-dtype-explicit-individual-array-member.f90
new file mode 100644
index 00000000000000..907b16ffedf524
--- /dev/null
+++ b/openmp/libomptarget/test/offloading/fortran/target-map-dtype-explicit-individual-array-member.f90
@@ -0,0 +1,33 @@
+! Offloading test checking interaction of an
+! explicit derived type member mapping of
+! an array when mapped to target
+! REQUIRES: flang, amdgcn-amd-amdhsa
+! UNSUPPORTED: nvptx64-nvidia-cuda
+! UNSUPPORTED: nvptx64-nvidia-cuda-LTO
+! UNSUPPORTED: aarch64-unknown-linux-gnu
+! UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
+! UNSUPPORTED: x86_64-pc-linux-gnu
+! UNSUPPORTED: x86_64-pc-linux-gnu-LTO
+
+! RUN: %libomptarget-compile-fortran-run-and-check-generic
+program main
+type :: scalar_array
+ real(4) :: break_0
+ real(4) :: array_x(10)
+ real(4) :: break_1
+ real(4) :: array_y(10)
+ real(4) :: break_3
+end type scalar_array
+
+ type(scalar_array) :: scalar_arr
+
+ !$omp target map(tofrom:scalar_arr%array_y)
+ do i = 1, 10
+ scalar_arr%array_y(i) = i
+ end do
+ !$omp end target
+
+ print *, scalar_arr%array_y
+end program main
+
+!CHECK: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
diff --git a/openmp/libomptarget/test/offloading/fortran/target-map-dtype-multi-explicit-array-3D-member-bounds.f90 b/openmp/libomptarget/test/offloading/fortran/target-map-dtype-multi-explicit-array-3D-member-bounds.f90
new file mode 100644
index 00000000000000..110fb648980cdc
--- /dev/null
+++ b/openmp/libomptarget/test/offloading/fortran/target-map-dtype-multi-explicit-array-3D-member-bounds.f90
@@ -0,0 +1,45 @@
+! Offloading test checking interaction of an
+! explicit derived type member mapping of
+! two arrays with explicit bounds when
+! mapped to target
+! REQUIRES: flang, amdgcn-amd-amdhsa
+! UNSUPPORTED: nvptx64-nvidia-cuda
+! UNSUPPORTED: nvptx64-nvidia-cuda-LTO
+! UNSUPPORTED: aarch64-unknown-linux-gnu
+! UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
+! UNSUPPORTED: x86_64-pc-linux-gnu
+! UNSUPPORTED: x86_64-pc-linux-gnu-LTO
+
+! RUN: %libomptarget-compile-fortran-run-and-check-generic
+program main
+ type :: scalar_array
+ real(4) :: break_0
+ integer(4) :: array_x(3,3,3)
+ real(4) :: break_1
+ integer(4) :: array_y(3,3,3)
+ real(4) :: break_3
+ end type scalar_array
+
+ type(scalar_array) :: scalar_arr
+
+ do i = 1, 3
+ do j = 1, 3
+ do k = 1, 3
+ scalar_arr%array_x(i, j, k) = 42
+ scalar_arr%array_y(i, j, k) = 0 ! Will get overwritten by garbage values in target
+ end do
+ end do
+ end do
+
+ !$omp target map(tofrom:scalar_arr%array_x(1:3, 1:3, 2:2), scalar_arr%array_y(1:3, 1:3, 1:3))
+ do j = 1, 3
+ do k = 1, 3
+ scalar_arr%array_y(k, j, 2) = scalar_arr%array_x(k, j, 2)
+ end do
+ end do
+ !$omp end target
+
+ print *, scalar_arr%array_y
+end program main
+
+!CHECK: 0 0 0 0 0 0 0 0 0 42 42 42 42 42 42 42 42 42 0 0 0 0 0 0 0 0
diff --git a/openmp/libomptarget/test/offloading/fortran/target-map-dtype-multi-explicit-array-member-bounds.f90 b/openmp/libomptarget/test/offloading/fortran/target-map-dtype-multi-explicit-array-member-bounds.f90
new file mode 100644
index 00000000000000..b7f6e2ddfb3bcb
--- /dev/null
+++ b/openmp/libomptarget/test/offloading/fortran/target-map-dtype-multi-explicit-array-member-bounds.f90
@@ -0,0 +1,38 @@
+! Offloading test checking interaction of an
+! explicit derived type member mapping of
+! two arrays with explicit bounds when
+! mapped to target
+! REQUIRES: flang, amdgcn-amd-amdhsa
+! UNSUPPORTED: nvptx64-nvidia-cuda
+! UNSUPPORTED: nvptx64-nvidia-cuda-LTO
+! UNSUPPORTED: aarch64-unknown-linux-gnu
+! UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
+! UNSUPPORTED: x86_64-pc-linux-gnu
+! UNSUPPORTED: x86_64-pc-linux-gnu-LTO
+
+! RUN: %libomptarget-compile-fortran-run-and-check-generic
+program main
+ type :: scalar_array
+ real(4) :: break_0
+ real(4) :: array_x(10)
+ real(4) :: break_1
+ real(4) :: array_y(10)
+ real(4) :: break_3
+ end type scalar_array
+
+ type(scalar_array) :: scalar_arr
+
+ do i = 1, 10
+ scalar_arr%array_x(i) = i
+ end do
+
+ !$omp target map(tofrom:scalar_arr%array_x(3:6), scalar_arr%array_y(3:6))
+ do i = 1, 10
+ scalar_arr%array_y(i) = scalar_arr%array_x(i)
+ end do
+ !$omp end target
+
+ print*, scalar_arr%array_y
+end program main
+
+!CHECK: 0. 0. 3. 4. 5. 6. 0. 0. 0. 0.
diff --git a/openmp/libomptarget/test/offloading/fortran/target-map-dtype-multi-explicit-array-member.f90 b/openmp/libomptarget/test/offloading/fortran/target-map-dtype-multi-explicit-array-member.f90
new file mode 100644
index 00000000000000..c44a58dbebc8e4
--- /dev/null
+++ b/openmp/libomptarget/test/offloading/fortran/target-map-dtype-multi-explicit-array-member.f90
@@ -0,0 +1,39 @@
+! Offloading test checking interaction of an
+! derived type mapping of two explicit array
+! members to target
+! REQUIRES: flang, amdgcn-amd-amdhsa
+! UNSUPPORTED: nvptx64-nvidia-cuda
+! UNSUPPORTED: nvptx64-nvidia-cuda-LTO
+! UNSUPPORTED: aarch64-unknown-linux-gnu
+! UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
+! UNSUPPORTED: x86_64-pc-linux-gnu
+! UNSUPPORTED: x86_64-pc-linux-gnu-LTO
+
+! RUN: %libomptarget-compile-fortran-run-and-check-generic
+program main
+ type :: scalar_array
+ real(4) :: break_0
+ real(4) :: array_x(10)
+ real(4) :: break_1
+ real(4) :: array_y(10)
+ real(4) :: break_3
+ end type scalar_array
+
+ type(scalar_array) :: scalar_arr
+
+ do i = 1, 10
+ scalar_arr%array_x(i) = i
+ end do
+
+ !$omp target map(tofrom:scalar_arr%array_x, scalar_arr%array_y)
+ do i = 1, 10
+ scalar_arr%array_y(i) = scalar_arr%array_x(i)
+ end do
+ !$omp end target
+
+ print*, scalar_arr%array_x
+ print*, scalar_arr%array_y
+end program main
+
+!CHECK: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
+!CHECK: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
diff --git a/openmp/libomptarget/test/offloading/fortran/target-map-dtype-multi-explicit-member.f90 b/openmp/libomptarget/test/offloading/fortran/target-map-dtype-multi-explicit-member.f90
new file mode 100644
index 00000000000000..a4205bc0179e20
--- /dev/null
+++ b/openmp/libomptarget/test/offloading/fortran/target-map-dtype-multi-explicit-member.f90
@@ -0,0 +1,33 @@
+! Offloading test checking interaction of an
+! derived type mapping of two explicit
+! members to target
+! REQUIRES: flang, amdgcn-amd-amdhsa
+! UNSUPPORTED: nvptx64-nvidia-cuda
+! UNSUPPORTED: nvptx64-nvidia-cuda-LTO
+! UNSUPPORTED: aarch64-unknown-linux-gnu
+! UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
+! UNSUPPORTED: x86_64-pc-linux-gnu
+! UNSUPPORTED: x86_64-pc-linux-gnu-LTO
+
+! RUN: %libomptarget-compile-fortran-run-and-check-generic
+program main
+ type :: scalar
+ integer(4) :: ix = 0
+ real(4) :: rx = 0.0
+ complex(4) :: zx = (0,0)
+ real(4) :: ry = 1.0
+ end type scalar
+
+ type(scalar) :: scalar_struct
+
+ !$omp target map(from:scalar_struct%rx, scalar_struct%ry)
+ scalar_struct%rx = 21.0
+ scalar_struct%ry = 27.0
+ !$omp end target
+
+ print*, scalar_struct%rx
+ print*, scalar_struct%ry
+end program main
+
+!CHECK: 21.
+!CHECK: 27.
diff --git a/openmp/libomptarget/test/offloading/fortran/target-map-enter-exit-array-2.f90 b/openmp/libomptarget/test/offloading/fortran/target-map-enter-exit-array-2.f90
new file mode 100644
index 00000000000000..d4ee3665a1e6a5
--- /dev/null
+++ b/openmp/libomptarget/test/offloading/fortran/target-map-enter-exit-array-2.f90
@@ -0,0 +1,39 @@
+! Offloading test checking interaction of an
+! enter and exit map of an array of scalars
+! REQUIRES: flang, amdgcn-amd-amdhsa
+! UNSUPPORTED: nvptx64-nvidia-cuda
+! UNSUPPORTED: nvptx64-nvidia-cuda-LTO
+! UNSUPPORTED: aarch64-unknown-linux-gnu
+! UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
+! UNSUPPORTED: x86_64-pc-linux-gnu
+! UNSUPPORTED: x86_64-pc-linux-gnu-LTO
+
+! RUN: %libomptarget-compile-fortran-run-and-check-generic
+program main
+ integer :: array(10)
+
+ do I = 1, 10
+ array(I) = I + I
+ end do
+
+ !$omp target enter data map(to: array)
+
+ ! Shouldn't overwrite data already locked in
+ ! on target via enter, this will then be
+ ! overwritten by our exit
+ do I = 1, 10
+ array(I) = 10
+ end do
+
+ !$omp target
+ do i=1,10
+ array(i) = array(i) + i
+ end do
+ !$omp end target
+
+ !$omp target exit data map(from: array)
+
+ print*, array
+end program
+
+!CHECK: 3 6 9 12 15 18 21 24 27 30
diff --git a/openmp/libomptarget/test/offloading/fortran/target-map-enter-exit-array-bounds.f90 b/openmp/libomptarget/test/offloading/fortran/target-map-enter-exit-array-bounds.f90
new file mode 100644
index 00000000000000..93c5189a47afcd
--- /dev/null
+++ b/openmp/libomptarget/test/offloading/fortran/target-map-enter-exit-array-bounds.f90
@@ -0,0 +1,44 @@
+! Offloading test checking interaction of an
+! enter and exit map of an array of scalars
+! with specified bounds
+! REQUIRES: flang, amdgcn-amd-amdhsa
+! UNSUPPORTED: nvptx64-nvidia-cuda
+! UNSUPPORTED: nvptx64-nvidia-cuda-LTO
+! UNSUPPORTED: aarch64-unknown-linux-gnu
+! UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
+! UNSUPPORTED: x86_64-pc-linux-gnu
+! UNSUPPORTED: x86_64-pc-linux-gnu-LTO
+
+! RUN: %libomptarget-compile-fortran-run-and-check-generic
+
+program main
+ integer :: array(10)
+
+ do I = 1, 10
+ array(I) = I + I
+ end do
+
+ !$omp target enter data map(to: array(3:6))
+
+ ! Shouldn't overwrite data already locked in
+ ! on target via enter, which will then be
+ ! overwritten by our exit
+ do I = 1, 10
+ array(I) = 10
+ end do
+
+ ! The compiler/runtime is less lenient about read/write out of
+ ! bounds when using enter and exit, we have to specifically loop
+ ! over the correctly mapped range
+ !$omp target
+ do i=3,6
+ array(i) = array(i) + i
+ end do
+ !$omp end target
+
+ !$omp target exit data map(from: array(3:6))
+
+ print *, array
+end program
+
+!CHECK: 10 10 9 12 15 18 10 10 10 10
diff --git a/openmp/libomptarget/test/offloading/fortran/target-map-enter-exit-scalar.f90 b/openmp/libomptarget/test/offloading/fortran/target-map-enter-exit-scalar.f90
new file mode 100644
index 00000000000000..f3a18614f37122
--- /dev/null
+++ b/openmp/libomptarget/test/offloading/fortran/target-map-enter-exit-scalar.f90
@@ -0,0 +1,33 @@
+! Offloading test checking interaction of an
+! enter and exit map of an scalar
+! REQUIRES: flang, amdgcn-amd-amdhsa
+! UNSUPPORTED: nvptx64-nvidia-cuda
+! UNSUPPORTED: nvptx64-nvidia-cuda-LTO
+! UNSUPPORTED: aarch64-unknown-linux-gnu
+! UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
+! UNSUPPORTED: x86_64-pc-linux-gnu
+! UNSUPPORTED: x86_64-pc-linux-gnu-LTO
+
+! RUN: %libomptarget-compile-fortran-run-and-check-generic
+program main
+ integer :: scalar
+ scalar = 10
+
+ !$omp target enter data map(to: scalar)
+
+ !ignored, as we've already attached
+ scalar = 20
+
+ !$omp target
+ scalar = scalar + 50
+ !$omp end target
+
+ !$omp target exit data map(from: scalar)
+
+ ! not the answer one may expect, but it is the same
+ ! answer Clang gives so we are correctly on par with
+ ! Clang for the moment.
+ print *, scalar
+end program
+
+!CHECK: 10
\ No newline at end of file
diff --git a/openmp/libomptarget/test/offloading/fortran/target-map-individual-dtype-member-map.f90 b/openmp/libomptarget/test/offloading/fortran/target-map-individual-dtype-member-map.f90
new file mode 100644
index 00000000000000..4cdf41db70d43b
--- /dev/null
+++ b/openmp/libomptarget/test/offloading/fortran/target-map-individual-dtype-member-map.f90
@@ -0,0 +1,33 @@
+! Offloading test checking interaction of an
+! single explicit member map from a single
+! derived type.
+! REQUIRES: flang, amdgcn-amd-amdhsa
+! UNSUPPORTED: nvptx64-nvidia-cuda
+! UNSUPPORTED: nvptx64-nvidia-cuda-LTO
+! UNSUPPORTED: aarch64-unknown-linux-gnu
+! UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
+! UNSUPPORTED: x86_64-pc-linux-gnu
+! UNSUPPORTED: x86_64-pc-linux-gnu-LTO
+
+! RUN: %libomptarget-compile-fortran-run-and-check-generic
+program main
+ real :: test
+ type :: scalar
+ integer(4) :: ix = 0
+ real(4) :: rx = 0.0
+ complex(4) :: zx = (0,0)
+ real(4) :: ry = 1.0
+ end type scalar
+
+ type(scalar) :: scalar_struct
+ scalar_struct%rx = 2.0
+ test = 21.0
+
+ !$omp target map(from:scalar_struct%rx)
+ scalar_struct%rx = test
+ !$omp end target
+
+ print *, scalar_struct%rx
+end program main
+
+!CHECK: 21.
diff --git a/openmp/libomptarget/test/offloading/fortran/target-map-two-dtype-explicit-member.f90 b/openmp/libomptarget/test/offloading/fortran/target-map-two-dtype-explicit-member.f90
new file mode 100644
index 00000000000000..b080b437e381b5
--- /dev/null
+++ b/openmp/libomptarget/test/offloading/fortran/target-map-two-dtype-explicit-member.f90
@@ -0,0 +1,35 @@
+! Offloading test checking interaction of two
+! derived type's with one explicit member
+! each being mapped with bounds to target
+! REQUIRES: flang, amdgcn-amd-amdhsa
+! UNSUPPORTED: nvptx64-nvidia-cuda
+! UNSUPPORTED: nvptx64-nvidia-cuda-LTO
+! UNSUPPORTED: aarch64-unknown-linux-gnu
+! UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
+! UNSUPPORTED: x86_64-pc-linux-gnu
+! UNSUPPORTED: x86_64-pc-linux-gnu-LTO
+
+! RUN: %libomptarget-compile-fortran-run-and-check-generic
+program main
+ type :: scalar_array
+ real(4) :: break_0
+ real(4) :: array_x(10)
+ real(4) :: break_1
+ real(4) :: array_y(10)
+ real(4) :: break_3
+ end type scalar_array
+
+ type(scalar_array) :: scalar_arr1
+ type(scalar_array) :: scalar_arr2
+
+ !$omp target map(tofrom:scalar_arr1%break_1, scalar_arr2%break_3)
+ scalar_arr2%break_3 = 10
+ scalar_arr1%break_1 = 15
+ !$omp end target
+
+ print*, scalar_arr1%break_1
+ print*, scalar_arr2%break_3
+end program main
+
+!CHECK: 15.
+!CHECK: 10.
diff --git a/openmp/libomptarget/test/offloading/fortran/target-map-two-dtype-individual-member-array-1D-bounds.f90 b/openmp/libomptarget/test/offloading/fortran/target-map-two-dtype-individual-member-array-1D-bounds.f90
new file mode 100644
index 00000000000000..1e96207c2baaff
--- /dev/null
+++ b/openmp/libomptarget/test/offloading/fortran/target-map-two-dtype-individual-member-array-1D-bounds.f90
@@ -0,0 +1,39 @@
+! Offloading test checking interaction of two
+! derived type's with a single explicit array
+! member each being mapped with bounds to
+! target
+! REQUIRES: flang, amdgcn-amd-amdhsa
+! UNSUPPORTED: nvptx64-nvidia-cuda
+! UNSUPPORTED: nvptx64-nvidia-cuda-LTO
+! UNSUPPORTED: aarch64-unknown-linux-gnu
+! UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
+! UNSUPPORTED: x86_64-pc-linux-gnu
+! UNSUPPORTED: x86_64-pc-linux-gnu-LTO
+
+! RUN: %libomptarget-compile-fortran-run-and-check-generic
+program main
+ type :: scalar_array
+ real(4) :: break_0
+ real(4) :: array_x(10)
+ real(4) :: break_1
+ real(4) :: array_y(10)
+ real(4) :: break_3
+ end type scalar_array
+
+ type(scalar_array) :: scalar_arr1
+ type(scalar_array) :: scalar_arr2
+
+
+ !$omp target map(tofrom:scalar_arr1%array_x(3:6), scalar_arr2%array_x(3:6))
+ do i = 1, 10
+ scalar_arr2%array_x(i) = i
+ scalar_arr1%array_x(i) = i
+ end do
+ !$omp end target
+
+ print*, scalar_arr1%array_x
+ print*, scalar_arr2%array_x
+end program main
+
+!CHECK: 0. 0. 3. 4. 5. 6. 0. 0. 0. 0.
+!CHECK: 0. 0. 3. 4. 5. 6. 0. 0. 0. 0.
diff --git a/openmp/libomptarget/test/offloading/fortran/target-map-two-dtype-mixed-implicit-explicit-capture-1.f90 b/openmp/libomptarget/test/offloading/fortran/target-map-two-dtype-mixed-implicit-explicit-capture-1.f90
new file mode 100644
index 00000000000000..fbe6b305464a64
--- /dev/null
+++ b/openmp/libomptarget/test/offloading/fortran/target-map-two-dtype-mixed-implicit-explicit-capture-1.f90
@@ -0,0 +1,35 @@
+! Offloading test checking interaction of two
+! derived type's with a mix of explicit and
+! implicit member mapping to target
+! REQUIRES: flang, amdgcn-amd-amdhsa
+! UNSUPPORTED: nvptx64-nvidia-cuda
+! UNSUPPORTED: nvptx64-nvidia-cuda-LTO
+! UNSUPPORTED: aarch64-unknown-linux-gnu
+! UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
+! UNSUPPORTED: x86_64-pc-linux-gnu
+! UNSUPPORTED: x86_64-pc-linux-gnu-LTO
+
+! RUN: %libomptarget-compile-fortran-run-and-check-generic
+program main
+ type :: scalar_array
+ real(4) :: break_0
+ real(4) :: array_x(10)
+ real(4) :: break_1
+ real(4) :: array_y(10)
+ real(4) :: break_3
+ end type scalar_array
+
+ type(scalar_array) :: scalar_arr1
+ type(scalar_array) :: scalar_arr2
+
+ !$omp target map(tofrom:scalar_arr1%break_1)
+ scalar_arr2%break_3 = 10
+ scalar_arr1%break_1 = 15
+ !$omp end target
+
+ print*, scalar_arr1%break_1
+ print*, scalar_arr2%break_3
+end program main
+
+!CHECK: 15.
+!CHECK: 10.
diff --git a/openmp/libomptarget/test/offloading/fortran/target-map-two-dtype-mixed-implicit-explicit-capture-2.f90 b/openmp/libomptarget/test/offloading/fortran/target-map-two-dtype-mixed-implicit-explicit-capture-2.f90
new file mode 100644
index 00000000000000..d01fd1e595118a
--- /dev/null
+++ b/openmp/libomptarget/test/offloading/fortran/target-map-two-dtype-mixed-implicit-explicit-capture-2.f90
@@ -0,0 +1,41 @@
+! Offloading test checking interaction of two
+! derived type's with a mix of explicit and
+! implicit member mapping of arrays to target
+! one with bounds.
+! REQUIRES: flang, amdgcn-amd-amdhsa
+! UNSUPPORTED: nvptx64-nvidia-cuda
+! UNSUPPORTED: nvptx64-nvidia-cuda-LTO
+! UNSUPPORTED: aarch64-unknown-linux-gnu
+! UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
+! UNSUPPORTED: x86_64-pc-linux-gnu
+! UNSUPPORTED: x86_64-pc-linux-gnu-LTO
+
+! RUN: %libomptarget-compile-fortran-run-and-check-generic
+program main
+ type :: scalar_array
+ real(4) :: break_0
+ real(4) :: array_x(10)
+ real(4) :: break_1
+ real(4) :: array_y(10)
+ real(4) :: break_3
+ end type scalar_array
+
+ type(scalar_array) :: scalar_arr1
+ type(scalar_array) :: scalar_arr2
+
+ do i = 1, 10
+ scalar_arr1%array_x(i) = i
+ end do
+
+ !$omp target map(tofrom:scalar_arr2%array_x(3:6))
+ do i = 1, 10
+ scalar_arr2%array_x(i) = scalar_arr1%array_x(i)
+ end do
+ !$omp end target
+
+ print*, scalar_arr1%array_x
+ print*, scalar_arr2%array_x
+end program main
+
+!CHECK: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
+!CHECK: 0. 0. 3. 4. 5. 6. 0. 0. 0. 0.
diff --git a/openmp/libomptarget/test/offloading/fortran/target-map-two-dtype-multi-member-array-1D-bounds.f90 b/openmp/libomptarget/test/offloading/fortran/target-map-two-dtype-multi-member-array-1D-bounds.f90
new file mode 100644
index 00000000000000..ed350c54dcb259
--- /dev/null
+++ b/openmp/libomptarget/test/offloading/fortran/target-map-two-dtype-multi-member-array-1D-bounds.f90
@@ -0,0 +1,51 @@
+! Offloading test checking interaction of two
+! derived type's with two explicit array
+! members each being mapped with bounds to
+! target
+! REQUIRES: flang, amdgcn-amd-amdhsa
+! UNSUPPORTED: nvptx64-nvidia-cuda
+! UNSUPPORTED: nvptx64-nvidia-cuda-LTO
+! UNSUPPORTED: aarch64-unknown-linux-gnu
+! UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
+! UNSUPPORTED: x86_64-pc-linux-gnu
+! UNSUPPORTED: x86_64-pc-linux-gnu-LTO
+
+! RUN: %libomptarget-compile-fortran-run-and-check-generic
+program main
+ type :: scalar_array
+ real(4) :: break_0
+ real(4) :: array_x(10)
+ real(4) :: break_1
+ real(4) :: array_y(10)
+ real(4) :: break_3
+ end type scalar_array
+
+ type(scalar_array) :: scalar_arr1
+ type(scalar_array) :: scalar_arr2
+
+ do i = 1, 10
+ scalar_arr1%array_x(i) = i
+ scalar_arr2%array_x(i) = i
+ end do
+
+ !$omp target map(tofrom:scalar_arr1%array_x(3:6), scalar_arr1%array_y(3:6), scalar_arr2%array_x(3:6), scalar_arr2%array_y(3:6))
+ do i = 1, 10
+ scalar_arr2%array_y(i) = scalar_arr1%array_x(i)
+ end do
+
+ do i = 1, 10
+ scalar_arr1%array_y(i) = scalar_arr2%array_x(i)
+ end do
+ !$omp end target
+
+ print*, scalar_arr1%array_x
+ print*, scalar_arr2%array_y
+
+ print*, scalar_arr2%array_x
+ print*, scalar_arr1%array_y
+end program main
+
+!CHECK: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
+!CHECK: 0. 0. 3. 4. 5. 6. 0. 0. 0. 0.
+!CHECK: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
+!CHECK: 0. 0. 3. 4. 5. 6. 0. 0. 0. 0.
More information about the Openmp-commits
mailing list