]> gcc.gnu.org Git - gcc.git/commitdiff
libgomp: Fix 'target enter data' with always pointer
authorTobias Burnus <tobias@codesourcery.com>
Wed, 15 Feb 2023 10:40:21 +0000 (11:40 +0100)
committerTobias Burnus <tobias@codesourcery.com>
Wed, 15 Feb 2023 10:40:21 +0000 (11:40 +0100)
As GOMP_MAP_ALWAYS_POINTER operates on the previous map item, ensure that
with 'target enter data' both are passed together to gomp_map_vars_internal.

libgomp/ChangeLog:

* target.c (gomp_map_vars_internal): Add 'i > 0' before doing a
kind check.
(GOMP_target_enter_exit_data): If the next map item is
GOMP_MAP_ALWAYS_POINTER map it together with the current item.
* testsuite/libgomp.fortran/target-enter-data-4.f90: New test.

(cherry picked from commit c7a9655be60cb4f224d1e5906bfe8ae227b5a3a0)
(Testfile added as target-enter-data-4.f90 as ...-3.f90 already existed.)

libgomp/ChangeLog.omp
libgomp/target.c
libgomp/testsuite/libgomp.fortran/target-enter-data-4.f90 [new file with mode: 0644]

index 67065f5992249e209c8d1d31aff4d7ebddd7cb98..6216ea41b2e620cc92e7a9b3f33cb13c64502b28 100644 (file)
@@ -1,3 +1,14 @@
+2023-02-15  Tobias Burnus  <tobias@codesourcery.com>
+
+       Backported from master:
+       2023-02-15  Tobias Burnus  <tobias@codesourcery.com>
+
+       * target.c (gomp_map_vars_internal): Add 'i > 0' before doing a
+       kind check.
+       (GOMP_target_enter_exit_data): If the next map item is
+       GOMP_MAP_ALWAYS_POINTER map it together with the current item.
+       * testsuite/libgomp.fortran/target-enter-data-4.f90: New test.
+
 2023-02-14  Thomas Schwinge  <thomas@codesourcery.com>
 
        * target.c (gomp_target_rev): Address cast to pointer from integer
index 6edfc9214e4e1309bee7abac2ddd1fc1aa512081..ea7a1c3c097254f40ae3481dae37e40674b0ae03 100644 (file)
@@ -1561,8 +1561,9 @@ gomp_map_vars_internal (struct gomp_device_descr *devicep,
                    gomp_mutex_unlock (&devicep->lock);
                    gomp_fatal ("always pointer not mapped");
                  }
-               if ((get_kind (short_mapkind, kinds, i - 1) & typemask)
-                   != GOMP_MAP_ALWAYS_POINTER)
+               if (i > 0
+                   && ((get_kind (short_mapkind, kinds, i - 1) & typemask)
+                       != GOMP_MAP_ALWAYS_POINTER))
                  cur_node.tgt_offset = gomp_map_val (tgt, hostaddrs, i - 1);
                if (cur_node.tgt_offset)
                  cur_node.tgt_offset -= sizes[i];
@@ -4338,7 +4339,10 @@ GOMP_target_enter_exit_data (int device, size_t mapnum, void **hostaddrs,
                         GOMP_MAP_VARS_ENTER_DATA);
          i += j - i - 1;
        }
-      else if (i + 1 < mapnum && (kinds[i + 1] & 0xff) == GOMP_MAP_ATTACH)
+      else if (i + 1 < mapnum
+              && ((kinds[i + 1] & 0xff) == GOMP_MAP_ATTACH
+                  || ((kinds[i + 1] & 0xff) == GOMP_MAP_ALWAYS_POINTER
+                      && (kinds[i] & 0xff) != GOMP_MAP_ALWAYS_POINTER)))
        {
          /* An attach operation must be processed together with the mapped
             base-pointer list item.  */
diff --git a/libgomp/testsuite/libgomp.fortran/target-enter-data-4.f90 b/libgomp/testsuite/libgomp.fortran/target-enter-data-4.f90
new file mode 100644 (file)
index 0000000..5d97566
--- /dev/null
@@ -0,0 +1,22 @@
+implicit none
+type t
+  integer :: dummy
+  integer, pointer :: p1(:), p2(:)
+  integer :: dummy2
+end type t
+type(t) :: var
+integer :: i
+allocate(var%p1(5),var%p2(2:4))
+var%p1 = [22,53,28,6,4]
+var%p2 = [46,679,54]
+
+!$omp target enter data map(to:var%p1, var%p2)
+!$omp target
+  if (.not.associated(var%p1).or.lbound(var%p1,1)/=1.or.ubound(var%p1,1)/=5) stop 1
+  if (.not.associated(var%p2).or.lbound(var%p2,1)/=2.or.ubound(var%p2,1)/=4) stop 2
+  if (any (var%p1 /= [22,53,28,6,4])) stop 3
+  if (any (var%p2 /= [46,679,54])) stop 4
+!$omp end target
+!!$omp target exit data map(from:var%p1, var%p2)
+end
+
This page took 0.060158 seconds and 5 git commands to generate.