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.
This commit is contained in:
parent
e68f5c90ba
commit
b0af8e3a50
2 changed files with 42 additions and 1 deletions
|
@ -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)
|
||||
|
|
41
libgomp/testsuite/libgomp.fortran/use_device_ptr-4.f90
Normal file
41
libgomp/testsuite/libgomp.fortran/use_device_ptr-4.f90
Normal file
|
@ -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
|
Loading…
Add table
Reference in a new issue