| ! { dg-do run } |
| ! |
| module m |
| implicit none |
| contains |
| pure subroutine add_ps_routine(a, b, c) |
| implicit none |
| !$acc routine seq |
| integer, intent(in) :: a, b |
| integer, intent(out) :: c |
| integer, parameter :: n = 10 |
| integer :: i |
| |
| do i = 1, n |
| if (i .eq. 5) then |
| c = a + b |
| end if |
| end do |
| end subroutine add_ps_routine |
| |
| elemental impure function add_ef(a, b) result(c) |
| implicit none |
| !$acc routine |
| integer, intent(in) :: a, b |
| integer :: c |
| |
| call add_ps_routine(a, b, c) |
| end function add_ef |
| end module m |
| |
| program main |
| use m |
| implicit none |
| integer, parameter :: n = 10 |
| integer, dimension(n) :: a_a |
| integer, dimension(n) :: b_a |
| integer, dimension(n) :: c_a |
| integer :: i |
| |
| a_a = [(3 * i, i = 1, n)] |
| b_a = [(-2 * i, i = 1, n)] |
| !$acc parallel copyin(a_a, b_a) copyout(c_a) |
| !$acc loop gang |
| do i = 1, n |
| if (i .eq. 4) then |
| c_a = add_ef(a_a, b_a) |
| end if |
| end do |
| !$acc end parallel |
| if (any (c_a /= [(i, i=1, 10)])) stop 1 |
| !print *, a |
| end program main |