! Small regression test that checks that we do not cause
! a runtime map error in cases where we are required to
! allocate a local variable for the fortran descriptor
! to store into and then load from it, done so by
! re-using the temporary local variable across all
! maps related to the mapped variable and associated
! local variable to make sure that each map does as
! it's intended to do with the original data. This
! prevents blobs of local descriptor data remaining
! attatched on device long after it's supposed to,
! which can cause weird map issues later in susbequent
! function invocations. However, it doesn't avoid a user
! shooting themselves in the foot by mapping data via enter
! and then not providing a corresponding exit.
! REQUIRES: flang, amdgpu
! RUN: %libomptarget-compile-fortran-run-and-check-generic
subroutine launchOne(n1, n2, ret)
implicit none
real, intent(out) :: ret
real(4), dimension(n1,n2) :: sbuf31
integer :: n1,n2
!$omp target enter data map(alloc:sbuf31)
!$omp target
sbuf31(2, 2) = 10
!$omp end target
!$omp target update from(sbuf31)
ret = sbuf31(2, 2)
!$omp target exit data map(delete:sbuf31)
end subroutine launchOne
subroutine launchTwo(N, ret)
implicit none
real, intent(inout) :: ret
integer :: N
real(4), dimension(N) :: p
!$omp target enter data map(to:p)
!$omp target
p(8) = 20
!$omp end target
!$omp target update from(p)
ret = ret + p(8)
! intentional non-deletion, can trigger an illegal map
! issue in cases where the local map we store and load
! from for the variable is different across all maps.
! Not too sure why this is the thing that triggers the
! problem in general. It seems like it would be an issue
! made apparent with and without this statement commented,
! especially as the issue occurs with the enter and not the
! corresponding exit (from the runtime trace at least).
!!$omp target exit data map(delete:p)
end subroutine launchTwo
program reproducer
implicit none
integer :: N = 10
integer :: nr = 10, nt = 10
real :: output = 0
call launchOne(nr, nt, output)
call launchTwo(N, output)
print *, output
end program reproducer
! CHECK: 30