This PR refactors bounds offsetting by combining the two differing implementations (one applying to initial derived type member map implementation for descriptors and the other for regular arrays, effectively allocatable array vs regular array in fortran) now that it's a little simpler to do. The PR also moves the utilization of createAlteredByCaptureMap into genMapInfoOp, where it will be correctly applied to all MapInfoData, appropriately offsetting and altering Pointer data set in the kernel argument structure on the host. This primarily means bounds offsets will now correctly apply to enter/exit/update map clauses as opposed to just the Target directive that is currently the case. A few fortran runtime tests have been added to verify this new behavior. This PR depends on: https://github.com/llvm/llvm-project/pull/84328 and is an extraction of the larger derived type member map PR stack (so a requirement for it to land).
40 lines
928 B
Fortran
40 lines
928 B
Fortran
! Offloading test checking interaction of an
|
|
! enter and exit map of an array of scalars
|
|
! REQUIRES: flang, amdgcn-amd-amdhsa
|
|
! UNSUPPORTED: nvptx64-nvidia-cuda
|
|
! UNSUPPORTED: nvptx64-nvidia-cuda-LTO
|
|
! UNSUPPORTED: aarch64-unknown-linux-gnu
|
|
! UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
|
|
! UNSUPPORTED: x86_64-pc-linux-gnu
|
|
! UNSUPPORTED: x86_64-pc-linux-gnu-LTO
|
|
|
|
! RUN: %libomptarget-compile-fortran-run-and-check-generic
|
|
program main
|
|
integer :: array(10)
|
|
|
|
do I = 1, 10
|
|
array(I) = I + I
|
|
end do
|
|
|
|
!$omp target enter data map(to: array)
|
|
|
|
! Shouldn't overwrite data already locked in
|
|
! on target via enter, this will then be
|
|
! overwritten by our exit
|
|
do I = 1, 10
|
|
array(I) = 10
|
|
end do
|
|
|
|
!$omp target
|
|
do i=1,10
|
|
array(i) = array(i) + i
|
|
end do
|
|
!$omp end target
|
|
|
|
!$omp target exit data map(from: array)
|
|
|
|
print*, array
|
|
end program
|
|
|
|
!CHECK: 3 6 9 12 15 18 21 24 27 30
|