reduction-7.f90 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. ! { dg-do run }
  2. ! { dg-additional-options -Wuninitialized }
  3. !TODO
  4. ! { dg-xfail-run-if TODO { openacc_radeon_accel_selected && { ! __OPTIMIZE__ } } }
  5. ! subroutine reduction with private and firstprivate variables
  6. program reduction
  7. integer, parameter :: n = 100
  8. integer :: i, j, vsum, cs, arr(n)
  9. call redsub_private (cs, n, arr)
  10. call redsub_bogus (cs, n)
  11. call redsub_combined (cs, n, arr)
  12. vsum = 0
  13. ! Verify the results
  14. do i = 1, n
  15. vsum = i
  16. do j = 1, n
  17. vsum = vsum + 1;
  18. end do
  19. if (vsum .ne. arr(i)) STOP 1
  20. end do
  21. end program reduction
  22. ! This subroutine tests a reduction with an explicit private variable.
  23. subroutine redsub_private(sum, n, arr)
  24. integer :: sum, n, arr(n)
  25. integer :: i, j, v
  26. !$acc parallel copyout (arr)
  27. !$acc loop gang private (v)
  28. do j = 1, n
  29. v = j
  30. !$acc loop vector reduction (+:v)
  31. do i = 1, 100
  32. v = v + 1
  33. end do
  34. arr(j) = v
  35. end do
  36. !$acc end parallel
  37. ! verify the results
  38. do i = 1, 10
  39. if (arr(i) .ne. 100+i) STOP 2
  40. end do
  41. end subroutine redsub_private
  42. ! Bogus reduction on a firstprivate variable. The results do
  43. ! survive the parallel region. The goal here is to ensure that gfortran
  44. ! doesn't ICE.
  45. subroutine redsub_bogus(sum, n)
  46. integer :: sum, n, arr(n)
  47. integer :: i
  48. !$acc parallel firstprivate(sum)
  49. !$acc loop gang worker vector reduction (+:sum)
  50. ! { dg-bogus {'sum\.[0-9]+' is used uninitialized} TODO { xfail *-*-* } .-1 }
  51. ! { dg-note {'sum\.[0-9]+' was declared here} {} { target *-*-* } .-2 }
  52. do i = 1, n
  53. sum = sum + 1
  54. end do
  55. !$acc end parallel
  56. end subroutine redsub_bogus
  57. ! This reduction involving a firstprivate variable yields legitimate results.
  58. subroutine redsub_combined(sum, n, arr)
  59. integer :: sum, n, arr(n)
  60. integer :: i, j
  61. !$acc parallel copy (arr) firstprivate(sum)
  62. !$acc loop gang
  63. do i = 1, n
  64. sum = i;
  65. !$acc loop reduction(+:sum)
  66. ! { dg-bogus {'sum\.[0-9]+' may be used uninitialized} TODO { xfail { ! __OPTIMIZE__ } } .-1 }
  67. ! { dg-note {'sum\.[0-9]+' was declared here} {} { target { ! __OPTIMIZE__ } } .-2 }
  68. do j = 1, n
  69. sum = sum + 1
  70. end do
  71. arr(i) = sum
  72. end do
  73. !$acc end parallel
  74. end subroutine redsub_combined