diff mbox series

libgomp.fortran/defaultmap-8.f90: Fix non-shared memory handling

Message ID 09158a64-bd30-6845-9f55-5e8bf61822a4@codesourcery.com
State New
Headers show
Series libgomp.fortran/defaultmap-8.f90: Fix non-shared memory handling | expand

Commit Message

Tobias Burnus June 28, 2021, 5:13 p.m. UTC
The following runs into the problem that the pointer
is privatized but not the pointer target (in the C
sense, i.e. it affects both allocatables and pointers
in Fortran). Thus, when running it with non-shared
memory offloading, the pointer shows to an invalid
address.

I think the fix is obvious (albeit unfortunate).

(Tested on x86-64 with -foffload=nvptx-none and
-foffload=disable.)

Tobias

-----------------
Mentor Graphics (Deutschland) GmbH, Arnulfstrasse 201, 80634 München Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Frank Thürauf
diff mbox series

Patch

libgomp.fortran/defaultmap-8.f90: Fix non-shared memory handling

Disable some more parts of the test as firstprivate does not work yet
due to PR fortran/90742.

libgomp/
	* testsuite/libgomp.fortran/defaultmap-8.f90 (bar): Determine whether
	target has shared memory and disable some scalar pointer/allocatable
	checks if not as firstprivate does not work.

diff --git a/libgomp/testsuite/libgomp.fortran/defaultmap-8.f90 b/libgomp/testsuite/libgomp.fortran/defaultmap-8.f90
index ddf5057..54f4b2e 100644
--- a/libgomp/testsuite/libgomp.fortran/defaultmap-8.f90
+++ b/libgomp/testsuite/libgomp.fortran/defaultmap-8.f90
@@ -205,6 +205,7 @@  subroutine bar (ea1, ea2, ep1, ep2, eat1, eat2, et1, et2, ei1, ei2)
   pointer :: ep1, ep2, ep3
   target :: eat1, eat2, eat3, et1, et2, et3
   optional :: ea1, ep1, eat1, et1, ei1
+  logical :: shared_memory
 
   allocate(ea3, eat3, ep3)
 
@@ -212,19 +213,28 @@  subroutine bar (ea1, ea2, ep1, ep2, eat1, eat2, et1, et2, ei1, ei2)
   eat1 = 2; eat2 = 2; eat3 = 2; et1 = 2; et2 = 2; et3 = 2
   ei1 = 2; ei2 = 2; ei3 = 2
 
+  shared_memory = .false.
+  !$omp target map(to: shared_memory)
+    shared_memory = .true.
+  !$omp end target
+
   ! While here 'scalar' implies nonallocatable/nonpointer and
   ! the target attribute plays no role.
   !$omp target defaultmap(tofrom:scalar) defaultmap(firstprivate:allocatable) &
-  !$omp&       defaultmap(none:aggregate) defaultmap(firstprivate:pointer)
-    if (ea1 /= 2) stop 91
-    if (ea2 /= 2) stop 92
-    if (ea3 /= 2) stop 93
-    if (ep1 /= 2) stop 94
-    if (ep2 /= 2) stop 95
-    if (ep3 /= 2) stop 96
-    if (eat1 /= 2) stop 97
-    if (eat2 /= 2) stop 98
-    if (eat3 /= 2) stop 99
+  !$omp&       defaultmap(none:aggregate) defaultmap(firstprivate:pointer) &
+  !$omp&       map(always, to: shared_memory)
+    if (shared_memory) then
+      ! Due to fortran/90742 this fails when doing non-shared memory offloading
+      if (ea1 /= 2) stop 91
+      if (ea2 /= 2) stop 92
+      if (ea3 /= 2) stop 93
+      if (ep1 /= 2) stop 94
+      if (ep2 /= 2) stop 95
+      if (ep3 /= 2) stop 96
+      if (eat1 /= 2) stop 97
+      if (eat2 /= 2) stop 98
+      if (eat3 /= 2) stop 99
+    end if
     if (et1 /= 2) stop 100
     if (et2 /= 2) stop 101
     if (et3 /= 2) stop 102
@@ -232,8 +242,11 @@  subroutine bar (ea1, ea2, ep1, ep2, eat1, eat2, et1, et2, ei1, ei2)
     if (ei2 /= 2) stop 104
     if (ei3 /= 2) stop 105
     ep1 => null(); ep2 => null(); ep3 => null()
-    ea1 = 1; ea2 = 1; ea3 = 1
-    eat1 = 1; eat2 = 1; eat3 = 1
+    if (shared_memory) then
+      ! Due to fortran/90742 this fails when doing non-shared memory offloading
+      ea1 = 1; ea2 = 1; ea3 = 1
+      eat1 = 1; eat2 = 1; eat3 = 1
+    end if
     et1 = 1; et2 = 1; et3 = 1
     ei1 = 1; ei2 = 1; ei3 = 1
   !$omp end target