libgomp: Fix 'target enter data' with always pointer
As GOMP_MAP_ALWAYS_POINTER operates on the previous map item, ensure that with 'target enter data' both are passed together to gomp_map_vars_internal. libgomp/ChangeLog: * target.c (gomp_map_vars_internal): Add 'i > 0' before doing a kind check. (GOMP_target_enter_exit_data): If the next map item is GOMP_MAP_ALWAYS_POINTER map it together with the current item. * testsuite/libgomp.fortran/target-enter-data-3.f90: New test.
This commit is contained in:
parent
3f71b82596
commit
c7a9655be6
2 changed files with 29 additions and 3 deletions
|
@ -1480,8 +1480,9 @@ gomp_map_vars_internal (struct gomp_device_descr *devicep,
|
|||
gomp_mutex_unlock (&devicep->lock);
|
||||
gomp_fatal ("always pointer not mapped");
|
||||
}
|
||||
if ((get_kind (short_mapkind, kinds, i - 1) & typemask)
|
||||
!= GOMP_MAP_ALWAYS_POINTER)
|
||||
if (i > 0
|
||||
&& ((get_kind (short_mapkind, kinds, i - 1) & typemask)
|
||||
!= GOMP_MAP_ALWAYS_POINTER))
|
||||
cur_node.tgt_offset = gomp_map_val (tgt, hostaddrs, i - 1);
|
||||
if (cur_node.tgt_offset)
|
||||
cur_node.tgt_offset -= sizes[i];
|
||||
|
@ -4085,7 +4086,10 @@ GOMP_target_enter_exit_data (int device, size_t mapnum, void **hostaddrs,
|
|||
GOMP_MAP_VARS_ENTER_DATA);
|
||||
i += j - i - 1;
|
||||
}
|
||||
else if (i + 1 < mapnum && (kinds[i + 1] & 0xff) == GOMP_MAP_ATTACH)
|
||||
else if (i + 1 < mapnum
|
||||
&& ((kinds[i + 1] & 0xff) == GOMP_MAP_ATTACH
|
||||
|| ((kinds[i + 1] & 0xff) == GOMP_MAP_ALWAYS_POINTER
|
||||
&& (kinds[i] & 0xff) != GOMP_MAP_ALWAYS_POINTER)))
|
||||
{
|
||||
/* An attach operation must be processed together with the mapped
|
||||
base-pointer list item. */
|
||||
|
|
22
libgomp/testsuite/libgomp.fortran/target-enter-data-3.f90
Normal file
22
libgomp/testsuite/libgomp.fortran/target-enter-data-3.f90
Normal file
|
@ -0,0 +1,22 @@
|
|||
implicit none
|
||||
type t
|
||||
integer :: dummy
|
||||
integer, pointer :: p1(:), p2(:)
|
||||
integer :: dummy2
|
||||
end type t
|
||||
type(t) :: var
|
||||
integer :: i
|
||||
allocate(var%p1(5),var%p2(2:4))
|
||||
var%p1 = [22,53,28,6,4]
|
||||
var%p2 = [46,679,54]
|
||||
|
||||
!$omp target enter data map(to:var%p1, var%p2)
|
||||
!$omp target
|
||||
if (.not.associated(var%p1).or.lbound(var%p1,1)/=1.or.ubound(var%p1,1)/=5) stop 1
|
||||
if (.not.associated(var%p2).or.lbound(var%p2,1)/=2.or.ubound(var%p2,1)/=4) stop 2
|
||||
if (any (var%p1 /= [22,53,28,6,4])) stop 3
|
||||
if (any (var%p2 /= [46,679,54])) stop 4
|
||||
!$omp end target
|
||||
!!$omp target exit data map(from:var%p1, var%p2)
|
||||
end
|
||||
|
Loading…
Add table
Reference in a new issue