diff options
author | Chung-Lin Tang <cltang@codesourcery.com> | 2022-04-05 08:31:34 -0700 |
---|---|---|
committer | Chung-Lin Tang <cltang@codesourcery.com> | 2022-04-05 08:38:23 -0700 |
commit | db43489efb81368fa5352d60072090e0ee0e6a04 (patch) | |
tree | ab1413fe6f2a42e7947367296f419a7c4e250ed2 | |
parent | da61dd848c0721cb2366bcd1197104caff92e145 (diff) | |
download | gcc-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.c | 2 | ||||
-rw-r--r-- | libgomp/testsuite/libgomp.fortran/use_device_ptr-4.f90 | 41 |
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 |