Fortran/OpenMP] Don't create "alloc:" for 'target exit data'
authorTobias Burnus <tobias@codesourcery.com>
Wed, 30 Oct 2019 16:32:38 +0000 (16:32 +0000)
committerTobias Burnus <burnus@gcc.gnu.org>
Wed, 30 Oct 2019 16:32:38 +0000 (17:32 +0100)
        gcc/
        * gimplify.c (gimplify_scan_omp_clauses): Remove FE-generated
        GOMP_MAP_TO_PSET and GOMP_MAP_POINTER mapping for 'target update'
        and 'target exit data'.

        libgomp/
        * testsuite/libgomp.fortran/target9.f90: New.

From-SVN: r277631

gcc/ChangeLog
gcc/gimplify.c
libgomp/ChangeLog
libgomp/testsuite/libgomp.fortran/target9.f90 [new file with mode: 0644]

index 0be5eb33de7d4e5f7f7bd78a33e6ed74c0c81683..d1110fced48f99de1d024c6200fa25f6ac4ac858 100644 (file)
@@ -1,3 +1,9 @@
+2019-10-30  Tobias Burnus  <tobias@codesourcery.com>
+
+       * gimplify.c (gimplify_scan_omp_clauses): Remove FE-generated
+       GOMP_MAP_TO_PSET and GOMP_MAP_POINTER mapping for 'target update'
+       and 'target exit data'.
+
 2019-10-30  Martin Jambor  <mjambor@suse.cz>
 
        ipa/92278
index fdf6b695003f17dc589862fb406b066f59347d73..12ed3f8eb2129f2a68a054347d23e6f3eae2197a 100644 (file)
@@ -8590,6 +8590,17 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq *pre_p,
            default:
              break;
            }
+         /* For Fortran, not only the pointer to the data is mapped but also
+            the address of the pointer, the array descriptor etc.; for
+            'exit data' - and in particular for 'delete:' - having an 'alloc:'
+            does not make sense.  Likewise, for 'update' only transferring the
+            data itself is needed as the rest has been handled in previous
+            directives.  */
+         if ((code == OMP_TARGET_EXIT_DATA || code == OMP_TARGET_UPDATE)
+             && (OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_POINTER
+                 || OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_TO_PSET))
+           remove = true;
+
          if (remove)
            break;
          if (DECL_P (decl) && outer_ctx && (region_type & ORT_ACC))
index f8e4515ed2b49af8b32fa3c17e8a2d8eec51aebc..03ce2fb4f20c80582941a051ec6e058c6cf964d1 100644 (file)
@@ -1,3 +1,7 @@
+2019-10-30  Tobias Burnus  <tobias@codesourcery.com>
+
+       * testsuite/libgomp.fortran/target9.f90: New.
+
 2019-10-30  Tobias Burnus  <tobias@codesourcery.com>
 
        * testsuite/libgomp.fortran/aligned1.f03: Replace 'STOP' by 'stop'.
diff --git a/libgomp/testsuite/libgomp.fortran/target9.f90 b/libgomp/testsuite/libgomp.fortran/target9.f90
new file mode 100644 (file)
index 0000000..91d60a3
--- /dev/null
@@ -0,0 +1,123 @@
+! { dg-require-effective-target offload_device_nonshared_as } */
+
+module target_test
+  implicit none (type, external)
+  integer, parameter :: N = 40
+  integer :: sum
+  integer :: var1 = 1
+  integer :: var2 = 2
+
+  !$omp declare target to(D)
+  integer :: D(N) = 0
+contains
+  subroutine enter_data (X)
+    integer :: X(:)
+    !$omp target enter data map(to: var1, var2, X) map(alloc: sum)
+  end subroutine enter_data
+
+  subroutine exit_data_0 (D)
+    integer :: D(N)
+    !$omp target exit data map(delete: D)
+  end subroutine exit_data_0
+
+  subroutine exit_data_1 ()
+    !$omp target exit data map(from: var1)
+  end subroutine exit_data_1
+
+  subroutine exit_data_2 (X)
+    integer :: X(N)
+    !$omp target exit data map(from: var2) map(release: X, sum)
+  end subroutine exit_data_2
+
+  subroutine exit_data_3 (p, idx)
+    integer :: p(:)
+    integer, value :: idx
+    !$omp target exit data map(from: p(idx))
+  end subroutine exit_data_3
+
+  subroutine test_nested ()
+    integer :: X, Y, Z
+    X = 0
+    Y = 0
+    Z = 0
+
+    !$omp target data map(from: X, Y, Z)
+      !$omp target data map(from: X, Y, Z)
+        !$omp target map(from: X, Y, Z)
+          X = 1337
+          Y = 1337
+          Z = 1337
+        !$omp end target
+        if (X /= 0) stop 11
+        if (Y /= 0) stop 12
+        if (Z /= 0) stop 13
+
+        !$omp target exit data map(from: X) map(release: Y)
+        if (X /= 0) stop 14
+        if (Y /= 0) stop 15
+
+        !$omp target exit data map(release: Y) map(delete: Z)
+        if (Y /= 0) stop 16
+        if (Z /= 0) stop 17
+      !$omp end target data
+      if (X /= 1337) stop 18
+      if (Y /= 0) stop 19
+      if (Z /= 0) stop 20
+
+      !$omp target map(from: X)
+        X = 2448
+      !$omp end target
+      if (X /= 2448) stop 21
+      if (Y /= 0) stop 22
+      if (Z /= 0) stop 23
+
+      X = 4896
+    !$omp end target data
+    if (X /= 4896) stop 24
+    if (Y /= 0) stop 25
+    if (Z /= 0) stop 26
+  end subroutine test_nested
+end module target_test
+
+program main
+  use target_test
+  implicit none (type, external)
+
+  integer, allocatable :: X(:)
+  integer, pointer, contiguous :: Y(:)
+
+
+  allocate(X(N), Y(N))
+  X(10) = 10
+  Y(20) = 20
+  call enter_data (X)
+
+  call exit_data_0 (D)  ! This should have no effect on D.
+
+  !$omp target map(alloc: var1, var2, X) map(to: Y) map(always, from: sum)
+    var1 = var1 + X(10)
+    var2 = var2 + Y(20)
+    sum = var1 + var2
+    D(sum) = D(sum) + 1
+  !$omp end target
+
+  if (var1 /= 1) stop 1
+  if (var2 /= 2) stop 2
+  if (sum /= 33) stop 3
+
+  call exit_data_1 ()
+  if (var1 /= 11) stop 4
+  if (var2 /= 2) stop 5
+
+  ! Increase refcount of already mapped X(1:N).
+  !$omp target enter data map(alloc: X(16:17))
+
+  call exit_data_2 (X)
+  if (var2 /= 22) stop 6
+
+  call exit_data_3 (X, 5) ! Unmap X(1:N).
+
+  deallocate (X, Y)
+
+  call test_nested ()
+end program main