blob: f5c7c5e6df9216c60d56f7cef9d062ba3cc4bf8e [file] [edit]
! This checks that attach always forces attachment.
! NOTE: We have to make sure the old default auto attach behaviour is off to
! yield the correct results for this test. Otherwise the second target will
! be treated as if we'd had the attach always specified!
! REQUIRES: flang, amdgpu
! RUN: %libomptarget-compile-fortran-generic
! RUN: env LIBOMPTARGET_TREAT_ATTACH_AUTO_AS_ALWAYS=0 %libomptarget-run-generic 2>&1 | %fcheck-generic
program main
implicit none
integer, pointer :: map_ptr(:)
integer, target :: a(10)
integer, target :: b(10)
integer :: index, n
logical :: correct
n = 10
correct = .true.
do index = 1, n
a(index) = 10
b(index) = 20
end do
map_ptr => a
! This should map a,b and map_ptr to device, and attach map_ptr
! to a (as it is assigned to it above), and as b is already on
! device running through target.
!$omp target enter data map(ref_ptr_ptee, to: map_ptr)
!$omp target enter data map(to: b, a)
!$omp target map(to: index) map(tofrom: correct)
do index = 1, n
if (map_ptr(index) /= 10) then
correct = .false.
endif
end do
!$omp end target
map_ptr => b
! No attach always to force re-attachment, so we should still
! be attached to "a"
!$omp target map(to: index) map(tofrom: correct)
do index = 1, n
if (map_ptr(index) /= 10) then
correct = .false.
endif
end do
!$omp end target
!$omp target map(to: index) map(attach(always): map_ptr) map(tofrom: correct)
do index = 1, n
if (map_ptr(index) /= 20) then
correct = .false.
endif
end do
!$omp end target
if (correct .NEQV. .true.) then
print*, "Failed!"
stop 1
endif
print*, "Passed!"
end program
!CHECK: Passed!