blob: de68011f8f7f52e3966032383be1b43da30fdddc [file] [log] [blame]
! { 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