[OpenMP] Fix 'omp exit data' for Fortran arrays (PR 94635)
authorTobias Burnus <tobias@codesourcery.com>
Fri, 17 Apr 2020 17:08:55 +0000 (19:08 +0200)
committerTobias Burnus <tobias@codesourcery.com>
Fri, 17 Apr 2020 17:08:55 +0000 (19:08 +0200)
PR middle-end/94635
* gimplify.c (gimplify_scan_omp_clauses): Turn MAP_TO_PSET to
MAP_DELETE.

PR middle-end/94635
* testsuite/libgomp.fortran/target-enter-data-2.F90: New.

gcc/ChangeLog
gcc/gimplify.c
libgomp/ChangeLog
libgomp/testsuite/libgomp.fortran/target-enter-data-2.F90 [new file with mode: 0644]

index 75540e89b69e8e4538ef5ee8fc932816e734dc34..93badc209ae17760e6a5f0b8a17aad6adde38360 100644 (file)
@@ -1,3 +1,9 @@
+2020-04-17  Tobias Burnus  <tobias@codesourcery.com>
+
+       PR middle-end/94635
+       * gimplify.c (gimplify_scan_omp_clauses): Turn MAP_TO_PSET to
+       MAP_DELETE.
+
 2020-04-17  Richard Sandiford  <richard.sandiford@arm.com>
 
        * config/aarch64/aarch64.c (aarch64_advsimd_ldp_stp_p): New function.
index 8cdfae26510710b238f9be4536b0d90f22937911..2f2c51b2d894e8070e4e62e014acf438e4be12cb 100644 (file)
@@ -8785,10 +8785,14 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_seq *pre_p,
             '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))
+            directives.  However, for 'exit data', the array descriptor needs
+            to be delete; hence, we turn the MAP_TO_PSET into a MAP_DELETE.  */
+         if (code == OMP_TARGET_EXIT_DATA
+             && OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_TO_PSET)
+           OMP_CLAUSE_SET_MAP_KIND (c, GOMP_MAP_DELETE);
+         else 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)
index 8f351f61f33c008fd92fc35ab2d0aa514d2b983a..ce71ac6e78320bf5b0cf2acb95432eabd9d57ec6 100644 (file)
@@ -1,3 +1,8 @@
+2020-04-17  Tobias Burnus  <tobias@codesourcery.com>
+
+       PR middle-end/94635
+       * testsuite/libgomp.fortran/target-enter-data-2.F90: New.
+
 2020-04-13  Thomas Schwinge  <thomas@codesourcery.com>
 
        PR libgomp/92843
diff --git a/libgomp/testsuite/libgomp.fortran/target-enter-data-2.F90 b/libgomp/testsuite/libgomp.fortran/target-enter-data-2.F90
new file mode 100644 (file)
index 0000000..320d8bf
--- /dev/null
@@ -0,0 +1,40 @@
+! { dg-additional-options "-DMEM_SHARED" { target offload_device_shared_as } }
+!
+! PR middle-end/94635
+  implicit none
+  integer, parameter :: N = 20
+  integer, allocatable, dimension(:) :: my1DPtr
+  integer, dimension(N) :: my1DArr
+  integer :: i
+
+  allocate(my1DPtr(N))
+  my1DPtr = 43
+
+  !$omp target enter data map(alloc: my1DPtr)
+    !$omp target
+      my1DPtr = [(i , i = 1, N)]
+    !$omp end target
+
+    !$omp target map(from: my1DArr) 
+      my1DArr = my1DPtr
+    !$omp end target
+  !$omp target exit data map(delete: my1DPtr)
+
+  if (any (my1DArr /= [(i, i = 1, N)])) stop 1
+#if MEM_SHARED
+  if (any (my1DArr /= my1DPtr)) stop 2
+#else
+  if (any (43 /= my1DPtr)) stop 3
+#endif
+
+  my1DPtr = [(2*N-i, i = 1, N)]
+  my1DArr = 42
+  !$omp target map(tofrom: my1DArr) map(tofrom: my1DPtr(:))
+    my1DArr = my1DPtr
+    my1DPtr = 20
+  !$omp end target
+
+  if (any (my1DArr /= [(2*N-i, i = 1, N)])) stop 4
+  if (any (20 /= my1DPtr)) stop 6
+end