From: Chung-Lin Tang Date: Tue, 5 Apr 2022 15:31:34 +0000 (-0700) Subject: OpenMP: Fix nested use_device_ptr X-Git-Tag: upstream/12.2.0~702 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b0af8e3a502a64a0e0a04cc54ef055e5d942240f;p=platform%2Fupstream%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. --- diff --git a/gcc/omp-low.cc b/gcc/omp-low.cc index 392bb18..bf5779b 100644 --- a/gcc/omp-low.cc +++ b/gcc/omp-low.cc @@ -13405,7 +13405,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_CLAUSE_CODE (c) == OMP_CLAUSE_HAS_DEVICE_ADDR) && !omp_privatize_by_reference (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