From: Chung-Lin Tang Date: Tue, 5 Apr 2022 15:31:34 +0000 (-0700) Subject: OpenMP: Fix nested use_device_ptr X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=db43489efb81368fa5352d60072090e0ee0e6a04;p=thirdparty%2Fgcc.git 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 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) --- diff --git a/gcc/omp-low.c b/gcc/omp-low.c index 4e73a7a4085d..4653370aa418 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 000000000000..8c361d1e3cd9 --- /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