| ! Offloading test checking interaction of pointers |
| ! with target in different scopes |
| ! 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 |
| module test |
| contains |
| subroutine func_arg(arg_alloc) |
| integer, pointer, intent (inout) :: arg_alloc(:) |
| |
| !$omp target enter data map(alloc: arg_alloc) |
| |
| !$omp target |
| do index = 1, 10 |
| arg_alloc(index) = arg_alloc(index) + index |
| end do |
| !$omp end target |
| |
| !$omp target exit data map(from: arg_alloc) |
| |
| !$omp target exit data map(delete: arg_alloc) |
| |
| print *, arg_alloc |
| end subroutine func_arg |
| end module |
| |
| subroutine func |
| integer, pointer :: local_alloc(:) |
| allocate(local_alloc(10)) |
| |
| !$omp target enter data map(alloc: local_alloc) |
| |
| !$omp target |
| do index = 1, 10 |
| local_alloc(index) = index |
| end do |
| !$omp end target |
| |
| !$omp target exit data map(from: local_alloc) |
| |
| !$omp target exit data map(delete: local_alloc) |
| |
| print *, local_alloc |
| |
| deallocate(local_alloc) |
| end subroutine func |
| |
| |
| program main |
| use test |
| integer, pointer :: map_ptr(:) |
| allocate(map_ptr(10)) |
| |
| !$omp target enter data map(alloc: map_ptr) |
| |
| !$omp target |
| do index = 1, 10 |
| map_ptr(index) = index |
| end do |
| !$omp end target |
| |
| !$omp target exit data map(from: map_ptr) |
| |
| !$omp target exit data map(delete: map_ptr) |
| |
| call func |
| |
| print *, map_ptr |
| |
| call func_arg(map_ptr) |
| |
| deallocate(map_ptr) |
| end program |
| |
| ! CHECK: 1 2 3 4 5 6 7 8 9 10 |
| ! CHECK: 1 2 3 4 5 6 7 8 9 10 |
| ! CHECK: 2 4 6 8 10 12 14 16 18 20 |