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:
Chung-Lin Tang 2022-04-05 08:31:34 -07:00
parent e68f5c90ba
commit b0af8e3a50
2 changed files with 42 additions and 1 deletions

View File

@ -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)

View 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