aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChung-Lin Tang <cltang@codesourcery.com>2022-04-05 08:31:34 -0700
committerChung-Lin Tang <cltang@codesourcery.com>2022-04-05 08:38:23 -0700
commitdb43489efb81368fa5352d60072090e0ee0e6a04 (patch)
treeab1413fe6f2a42e7947367296f419a7c4e250ed2
parentda61dd848c0721cb2366bcd1197104caff92e145 (diff)
downloadgcc-db43489efb81368fa5352d60072090e0ee0e6a04.zip
gcc-db43489efb81368fa5352d60072090e0ee0e6a04.tar.gz
gcc-db43489efb81368fa5352d60072090e0ee0e6a04.tar.bz2
OpenMP: Fix nested use_device_ptr
This patch fixes a bug in lower_omp_target, where for Fortran arrays, the expanded sender assignment is wrongly using the variable in the current ctx, instead of the one looked-up outside, which is causing use_device_ptr/addr to fail to work when used inside an omp-parallel (where the omp child_fn is split away from the original). The fix is inside omp-low.cc, though because the omp_array_data langhook is used only by Fortran, this is essentially Fortran-specific. 2022-04-05 Chung-Lin Tang <cltang@codesourcery.com> gcc/ChangeLog: * omp-low.cc (lower_omp_target): Use outer context looked-up 'var' as argument to lang_hooks.decls.omp_array_data, instead of 'ovar' from current clause. libgomp/ChangeLog: * testsuite/libgomp.fortran/use_device_ptr-4.f90: New testcase. (cherry picked from commit b0af8e3a502a64a0e0a04cc54ef055e5d942240f)
-rw-r--r--gcc/omp-low.c2
-rw-r--r--libgomp/testsuite/libgomp.fortran/use_device_ptr-4.f9041
2 files changed, 42 insertions, 1 deletions
diff --git a/gcc/omp-low.c b/gcc/omp-low.c
index 4e73a7a..4653370 100644
--- a/gcc/omp-low.c
+++ b/gcc/omp-low.c
@@ -14261,7 +14261,7 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
type = TREE_TYPE (ovar);
if (lang_hooks.decls.omp_array_data (ovar, true))
- var = lang_hooks.decls.omp_array_data (ovar, false);
+ var = lang_hooks.decls.omp_array_data (var, false);
else if ((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_USE_DEVICE_ADDR
&& !omp_is_reference (ovar)
&& !omp_is_allocatable_or_ptr (ovar))
diff --git a/libgomp/testsuite/libgomp.fortran/use_device_ptr-4.f90 b/libgomp/testsuite/libgomp.fortran/use_device_ptr-4.f90
new file mode 100644
index 0000000..8c361d1
--- /dev/null
+++ b/libgomp/testsuite/libgomp.fortran/use_device_ptr-4.f90
@@ -0,0 +1,41 @@
+! { dg-do run }
+!
+! Test user_device_ptr nested within another parallel
+! construct
+!
+program test_nested_use_device_ptr
+ use iso_c_binding, only: c_loc, c_ptr
+ implicit none
+ real, allocatable, target :: arr(:,:)
+ integer :: width = 1024, height = 1024, i
+ type(c_ptr) :: devptr
+
+ allocate(arr(width,height))
+
+ !$omp target enter data map(alloc: arr)
+
+ !$omp target data use_device_ptr(arr)
+ devptr = c_loc(arr(1,1))
+ !$omp end target data
+
+ !$omp parallel default(none) shared(arr, devptr)
+ !$omp single
+
+ !$omp target data use_device_ptr(arr)
+ call thing(c_loc(arr), devptr)
+ !$omp end target data
+
+ !$omp end single
+ !$omp end parallel
+ !$omp target exit data map(delete: arr)
+
+contains
+
+ subroutine thing(myarr, devptr)
+ use iso_c_binding, only: c_ptr, c_associated
+ implicit none
+ type(c_ptr) :: myarr, devptr
+ if (.not.c_associated(myarr, devptr)) stop 1
+ end subroutine thing
+
+end program