[PR90743] Fortran 'allocatable' with OpenACC data/OpenMP 'target' 'map' clauses
authorThomas Schwinge <thomas@codesourcery.com>
Tue, 18 Jun 2019 22:14:24 +0000 (00:14 +0200)
committerThomas Schwinge <tschwinge@gcc.gnu.org>
Tue, 18 Jun 2019 22:14:24 +0000 (00:14 +0200)
Test what OpenMP 5.0 has to say on this topic.  And, do the same for OpenACC.

libgomp/
PR fortran/90743
* oacc-parallel.c (GOACC_parallel_keyed): Handle NULL mapping
case.
* testsuite/libgomp.fortran/target-allocatable-1-1.f90: New file.
* testsuite/libgomp.fortran/target-allocatable-1-2.f90: Likewise.
* testsuite/libgomp.oacc-fortran/allocatable-1-1.f90: Likewise.
* testsuite/libgomp.oacc-fortran/allocatable-1-2.f90: Likewise.

From-SVN: r272447

libgomp/ChangeLog
libgomp/oacc-parallel.c
libgomp/testsuite/libgomp.fortran/target-allocatable-1-1.f90 [new file with mode: 0644]
libgomp/testsuite/libgomp.fortran/target-allocatable-1-2.f90 [new file with mode: 0644]
libgomp/testsuite/libgomp.oacc-fortran/allocatable-1-1.f90 [new file with mode: 0644]
libgomp/testsuite/libgomp.oacc-fortran/allocatable-1-2.f90 [new file with mode: 0644]

index 1a0d363e4ba24227b3916c5cf0aad46df5660db7..62c45828a009386eefa65cd0602694913643b772 100644 (file)
@@ -1,5 +1,13 @@
 2019-06-18  Thomas Schwinge  <thomas@codesourcery.com>
 
+       PR fortran/90743
+       * oacc-parallel.c (GOACC_parallel_keyed): Handle NULL mapping
+       case.
+       * testsuite/libgomp.fortran/target-allocatable-1-1.f90: New file.
+       * testsuite/libgomp.fortran/target-allocatable-1-2.f90: Likewise.
+       * testsuite/libgomp.oacc-fortran/allocatable-1-1.f90: Likewise.
+       * testsuite/libgomp.oacc-fortran/allocatable-1-2.f90: Likewise.
+
        PR testsuite/90861
        * testsuite/libgomp.oacc-c-c++-common/declare-vla.c: Update.
 
index e56330f6226b35391898a7f10cfe2fd6ff1240d4..0c2cfa05a438afc28cfb981e5de70b6be6c2e8cd 100644 (file)
@@ -325,9 +325,12 @@ GOACC_parallel_keyed (int flags_m, void (*fn) (void *),
   
   devaddrs = gomp_alloca (sizeof (void *) * mapnum);
   for (i = 0; i < mapnum; i++)
-    devaddrs[i] = (void *) (tgt->list[i].key->tgt->tgt_start
-                           + tgt->list[i].key->tgt_offset
-                           + tgt->list[i].offset);
+    if (tgt->list[i].key != NULL)
+      devaddrs[i] = (void *) (tgt->list[i].key->tgt->tgt_start
+                             + tgt->list[i].key->tgt_offset
+                             + tgt->list[i].offset);
+    else
+      devaddrs[i] = NULL;
   if (aq == NULL)
     acc_dev->openacc.exec_func (tgt_fn, mapnum, hostaddrs, devaddrs, dims,
                                tgt);
diff --git a/libgomp/testsuite/libgomp.fortran/target-allocatable-1-1.f90 b/libgomp/testsuite/libgomp.fortran/target-allocatable-1-1.f90
new file mode 100644 (file)
index 0000000..429a855
--- /dev/null
@@ -0,0 +1,69 @@
+! Test 'allocatable' with OpenMP 'target' 'map' clauses.
+
+! See also '../libgomp.oacc-fortran/allocatable-1-1.f90'.
+
+! { dg-do run }
+! { dg-additional-options "-cpp" }
+! { dg-additional-options "-DMEM_SHARED" { target offload_device_shared_as } }
+
+program main
+  implicit none
+  integer, allocatable :: a, b, c, d, e
+
+  allocate (a)
+  a = 11
+
+  b = 25 ! Implicit allocation.
+
+  c = 52 ! Implicit allocation.
+
+  !No 'allocate (d)' here.
+
+  !No 'allocate (e)' here.
+
+  !$omp target map(to: a) map(tofrom: b, c, d) map(from: e)
+
+  if (.not. allocated (a)) stop 1
+  if (a .ne. 11) stop 2
+  a = 33
+
+  if (.not. allocated (b)) stop 3
+  if (b .ne. 25) stop 4
+
+  if (.not. allocated (c)) stop 5
+  if (c .ne. 52) stop 6
+  c = 10
+
+  if (allocated (d)) stop 7
+  d = 42 ! Implicit allocation, but on device only.
+  if (.not. allocated (d)) stop 8
+  deallocate (d) ! OpenMP requires must be "unallocated upon exit from the region".
+
+  if (allocated (e)) stop 9
+  e = 24 ! Implicit allocation, but on device only.
+  if (.not. allocated (e)) stop 10
+  deallocate (e) ! OpenMP requires must be "unallocated upon exit from the region".
+
+  !$omp end target
+
+  if (.not. allocated (a)) stop 20
+#ifdef MEM_SHARED
+  if (a .ne. 33) stop 21
+#else
+  if (a .ne. 11) stop 22
+#endif
+  deallocate (a)
+
+  if (.not. allocated (b)) stop 23
+  if (b .ne. 25) stop 24
+  deallocate (b)
+
+  if (.not. allocated (c)) stop 25
+  if (c .ne. 10) stop 26
+  deallocate (c)
+
+  if (allocated (d)) stop 27
+
+  if (allocated (e)) stop 28
+
+end program main
diff --git a/libgomp/testsuite/libgomp.fortran/target-allocatable-1-2.f90 b/libgomp/testsuite/libgomp.fortran/target-allocatable-1-2.f90
new file mode 100644 (file)
index 0000000..5301c8e
--- /dev/null
@@ -0,0 +1,82 @@
+! Test 'allocatable' with OpenMP 'target' 'map' clauses, subroutine in module,
+! pass by reference.
+
+! See also '../libgomp.oacc-fortran/allocatable-1-2.f90'.
+
+! { dg-do run }
+! { dg-additional-options "-cpp" }
+! { dg-additional-options "-DMEM_SHARED" { target offload_device_shared_as } }
+
+module m
+contains
+  subroutine r (a, b, c, d, e)
+    implicit none
+    integer, allocatable :: a, b, c, d, e
+
+    !$omp target map(to: a) map(tofrom: b, c, d) map(from: e)
+
+    if (.not. allocated (a)) stop 1
+    if (a .ne. 11) stop 2
+    a = 33
+
+    if (.not. allocated (b)) stop 3
+    if (b .ne. 25) stop 4
+
+    if (.not. allocated (c)) stop 5
+    if (c .ne. 52) stop 6
+    c = 10
+
+    if (allocated (d)) stop 7
+    d = 42 ! Implicit allocation, but on device only.
+    if (.not. allocated (d)) stop 8
+    deallocate (d) ! OpenMP requires must be "unallocated upon exit from the region".
+
+    if (allocated (e)) stop 9
+    e = 24 ! Implicit allocation, but on device only.
+    if (.not. allocated (e)) stop 10
+    deallocate (e) ! OpenMP requires must be "unallocated upon exit from the region".
+
+    !$omp end target
+
+  end subroutine r
+end module m
+
+program main
+  use m
+  implicit none
+  integer, allocatable :: a, b, c, d, e
+
+  allocate (a)
+  a = 11
+
+  b = 25 ! Implicit allocation.
+
+  c = 52 ! Implicit allocation.
+
+  !No 'allocate (d)' here.
+
+  !No 'allocate (e)' here.
+
+  call r(a, b, c, d, e)
+
+  if (.not. allocated (a)) stop 20
+#ifdef MEM_SHARED
+  if (a .ne. 33) stop 21
+#else
+  if (a .ne. 11) stop 22
+#endif
+  deallocate (a)
+
+  if (.not. allocated (b)) stop 23
+  if (b .ne. 25) stop 24
+  deallocate (b)
+
+  if (.not. allocated (c)) stop 25
+  if (c .ne. 10) stop 26
+  deallocate (c)
+
+  if (allocated (d)) stop 27
+
+  if (allocated (e)) stop 28
+
+end program main
diff --git a/libgomp/testsuite/libgomp.oacc-fortran/allocatable-1-1.f90 b/libgomp/testsuite/libgomp.oacc-fortran/allocatable-1-1.f90
new file mode 100644 (file)
index 0000000..e598131
--- /dev/null
@@ -0,0 +1,68 @@
+! Test 'allocatable' with OpenACC data clauses.
+
+! See also '../libgomp.fortran/target-allocatable-1-1.f90'.
+
+! { dg-do run }
+! { dg-additional-options "-cpp" }
+
+program main
+  implicit none
+  integer, allocatable :: a, b, c, d, e
+
+  allocate (a)
+  a = 11
+
+  b = 25 ! Implicit allocation.
+
+  c = 52 ! Implicit allocation.
+
+  !No 'allocate (d)' here.
+
+  !No 'allocate (e)' here.
+
+  !$acc parallel copyin(a) copy(b, c, d) copyout(e)
+
+  if (.not. allocated (a)) stop 1
+  if (a .ne. 11) stop 2
+  a = 33
+
+  if (.not. allocated (b)) stop 3
+  if (b .ne. 25) stop 4
+
+  if (.not. allocated (c)) stop 5
+  if (c .ne. 52) stop 6
+  c = 10
+
+  if (allocated (d)) stop 7
+  d = 42 ! Implicit allocation, but on device only.
+  if (.not. allocated (d)) stop 8
+  deallocate (d) ! OpenMP requires must be "unallocated upon exit from the region".
+
+  if (allocated (e)) stop 9
+  e = 24 ! Implicit allocation, but on device only.
+  if (.not. allocated (e)) stop 10
+  deallocate (e) ! OpenMP requires must be "unallocated upon exit from the region".
+
+  !$acc end parallel
+
+  if (.not. allocated (a)) stop 20
+#if ACC_MEM_SHARED
+  if (a .ne. 33) stop 21
+#else
+  if (a .ne. 11) stop 22
+#endif
+  deallocate (a)
+
+  if (.not. allocated (b)) stop 23
+  if (b .ne. 25) stop 24
+  deallocate (b)
+
+  if (.not. allocated (c)) stop 25
+  if (c .ne. 10) stop 26
+  deallocate (c)
+
+  if (allocated (d)) stop 27
+
+  if (allocated (e)) stop 28
+
+end program main
diff --git a/libgomp/testsuite/libgomp.oacc-fortran/allocatable-1-2.f90 b/libgomp/testsuite/libgomp.oacc-fortran/allocatable-1-2.f90
new file mode 100644 (file)
index 0000000..2faf0f8
--- /dev/null
@@ -0,0 +1,81 @@
+! Test 'allocatable' with OpenACC data clauses, subroutine in module, pass by
+! reference.
+
+! See also '../libgomp.fortran/target-allocatable-1-2.f90'.
+
+! { dg-do run }
+! { dg-additional-options "-cpp" }
+
+module m
+contains
+  subroutine r (a, b, c, d, e)
+    implicit none
+    integer, allocatable :: a, b, c, d, e
+
+    !$acc parallel copyin(a) copy(b, c, d) copyout(e)
+
+    if (.not. allocated (a)) stop 1
+    if (a .ne. 11) stop 2
+    a = 33
+
+    if (.not. allocated (b)) stop 3
+    if (b .ne. 25) stop 4
+
+    if (.not. allocated (c)) stop 5
+    if (c .ne. 52) stop 6
+    c = 10
+
+    if (allocated (d)) stop 7
+    d = 42 ! Implicit allocation, but on device only.
+    if (.not. allocated (d)) stop 8
+    deallocate (d) ! OpenMP requires must be "unallocated upon exit from the region".
+
+    if (allocated (e)) stop 9
+    e = 24 ! Implicit allocation, but on device only.
+    if (.not. allocated (e)) stop 10
+    deallocate (e) ! OpenMP requires must be "unallocated upon exit from the region".
+
+    !$acc end parallel
+
+  end subroutine r
+end module m
+
+program main
+  use m
+  implicit none
+  integer, allocatable :: a, b, c, d, e
+
+  allocate (a)
+  a = 11
+
+  b = 25 ! Implicit allocation.
+
+  c = 52 ! Implicit allocation.
+
+  !No 'allocate (d)' here.
+
+  !No 'allocate (e)' here.
+
+  call r(a, b, c, d, e)
+
+  if (.not. allocated (a)) stop 20
+#if ACC_MEM_SHARED
+  if (a .ne. 33) stop 21
+#else
+  if (a .ne. 11) stop 22
+#endif
+  deallocate (a)
+
+  if (.not. allocated (b)) stop 23
+  if (b .ne. 25) stop 24
+  deallocate (b)
+
+  if (.not. allocated (c)) stop 25
+  if (c .ne. 10) stop 26
+  deallocate (c)
+
+  if (allocated (d)) stop 27
+
+  if (allocated (e)) stop 28
+
+end program main