| ! { dg-do run } |
| ! { dg-additional-options "-foffload-options=nvptx-none=-misa=sm_35" { target { offload_target_nvptx } } } |
| ! { dg-additional-sources reverse-offload-1-aux.f90 } |
| |
| ! Check that reverse offload works in particular: |
| ! - no code is generated on the device side (i.e. no |
| ! implicit declare target of called functions and no |
| ! code gen for the target-region body) |
| ! -> would otherwise fail due to 'add_3' symbol |
| ! - Plus the usual (compiles, runs, produces correct result) |
| |
| ! Note: Running also the non-reverse-offload target regions |
| ! on the host (host fallback) is valid and will pass. |
| |
| module m |
| interface |
| integer function add_3 (x) |
| implicit none |
| integer, value :: x |
| end function |
| end interface |
| integer :: global_var = 5 |
| end module m |
| |
| module m2 |
| use m |
| !$omp requires reverse_offload |
| implicit none (type, external) |
| contains |
| subroutine check_offload (x, y) |
| integer :: x, y |
| x = add_3(x) |
| y = add_3(y) |
| end subroutine check_offload |
| subroutine m2_tg_fn(x, y) |
| integer :: x, y |
| !$omp declare target |
| if (x /= 2 .or. y /= 3) stop 1 |
| x = x + 2 |
| y = y + 7 |
| !$omp target device(ancestor : 1) map(tofrom: x) |
| call check_offload(x, y) |
| !$omp end target |
| if (x /= 2+2+3 .or. y /= 3 + 7) stop 2 |
| end subroutine |
| end module m2 |
| |
| program main |
| use m |
| !$omp requires reverse_offload |
| implicit none (type, external) |
| |
| integer :: prog_var = 99 |
| |
| !$omp target |
| block |
| use m2 |
| integer :: x, y |
| x = 2; y = 3 |
| call m2_tg_fn (x, y) |
| end block |
| |
| !$omp target |
| block |
| use m2 |
| integer :: x, y |
| x = -2; y = -1 |
| !$omp target device ( ancestor:1 ) firstprivate(y) map(tofrom:x) |
| if (x /= -2 .or. y /= -1) stop 3 |
| call my_func (x, y) |
| if (x /= 2*(3-2) .or. y /= 3*(3-1)) stop 5 |
| !$omp end target |
| if (x /= 2*(3-2) .or. y /= -1) stop 6 |
| end block |
| |
| if (prog_var /= 41 .or. global_var /= 242) stop 7 |
| |
| contains |
| |
| subroutine my_func(x, y) |
| integer :: x, y |
| if (prog_var /= 99) stop 8 |
| if (global_var /= 5) stop 9 |
| prog_var = 41 |
| global_var = 242 |
| x = 2*add_3(x) |
| y = 3*add_3(y) |
| end subroutine my_func |
| end |