! { dg-do run } ! { dg-additional-options -Wuninitialized } !TODO ! { dg-xfail-run-if TODO { openacc_radeon_accel_selected && { ! __OPTIMIZE__ } } } ! subroutine reduction with private and firstprivate variables program reduction integer, parameter :: n = 100 integer :: i, j, vsum, cs, arr(n) call redsub_private (cs, n, arr) call redsub_bogus (cs, n) call redsub_combined (cs, n, arr) vsum = 0 ! Verify the results do i = 1, n vsum = i do j = 1, n vsum = vsum + 1; end do if (vsum .ne. arr(i)) STOP 1 end do end program reduction ! This subroutine tests a reduction with an explicit private variable. subroutine redsub_private(sum, n, arr) integer :: sum, n, arr(n) integer :: i, j, v !$acc parallel copyout (arr) !$acc loop gang private (v) do j = 1, n v = j !$acc loop vector reduction (+:v) do i = 1, 100 v = v + 1 end do arr(j) = v end do !$acc end parallel ! verify the results do i = 1, 10 if (arr(i) .ne. 100+i) STOP 2 end do end subroutine redsub_private ! Bogus reduction on a firstprivate variable. The results do ! survive the parallel region. The goal here is to ensure that gfortran ! doesn't ICE. subroutine redsub_bogus(sum, n) integer :: sum, n, arr(n) integer :: i !$acc parallel firstprivate(sum) !$acc loop gang worker vector reduction (+:sum) ! { dg-bogus {'sum\.[0-9]+' is used uninitialized} TODO { xfail *-*-* } .-1 } ! { dg-note {'sum\.[0-9]+' was declared here} {} { target *-*-* } .-2 } do i = 1, n sum = sum + 1 end do !$acc end parallel end subroutine redsub_bogus ! This reduction involving a firstprivate variable yields legitimate results. subroutine redsub_combined(sum, n, arr) integer :: sum, n, arr(n) integer :: i, j !$acc parallel copy (arr) firstprivate(sum) !$acc loop gang do i = 1, n sum = i; !$acc loop reduction(+:sum) ! { dg-bogus {'sum\.[0-9]+' may be used uninitialized} TODO { xfail { ! __OPTIMIZE__ } } .-1 } ! { dg-note {'sum\.[0-9]+' was declared here} {} { target { ! __OPTIMIZE__ } } .-2 } do j = 1, n sum = sum + 1 end do arr(i) = sum end do !$acc end parallel end subroutine redsub_combined