! { dg-do run } program main integer, parameter :: N = 32 integer igot, iexp, itmp integer, dimension (0:N) :: iarr real fgot, fexp, ftmp real, dimension (0:N) :: farr logical lgot, lexp, ltmp igot = 0 iexp = N * 2 !$acc parallel copy (igot, itmp) do i = 1, N !$acc atomic capture itmp = igot igot = i + i !$acc end atomic end do !$acc end parallel if (igot /= iexp) STOP 1 if (itmp /= iexp - 2) STOP 2 fgot = 1234.0 fexp = 1266.0 !$acc parallel loop copy (fgot, ftmp) do i = 1, N !$acc atomic capture farr(i) = fgot fgot = fgot + 1.0 !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. & (1234.0 <= farr(i) .and. farr(i) < fexp & .and. aint (farr(i)) == farr(i))) STOP 3 end do if (fgot /= fexp) STOP 4 fgot = 1.0 fexp = 2.0**32 !$acc parallel loop copy (fgot, ftmp) do i = 1, N !$acc atomic capture farr(i) = fgot fgot = fgot * 2.0 !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. & (1.0 <= farr(i) .and. farr(i) < fexp & .and. aint (farr(i)) == farr(i))) STOP 5 end do if (fgot /= fexp) STOP 6 fgot = 32.0 fexp = fgot - N !$acc parallel loop copy (fgot, ftmp) do i = 1, N !$acc atomic capture farr(i) = fgot fgot = fgot - 1.0 !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. & (fexp < farr(i) .and. farr(i) <= 32.0 & .and. aint (farr(i)) == farr(i))) STOP 7 end do if (fgot /= fexp) STOP 8 fgot = 2**32.0 fexp = 1.0 !$acc parallel loop copy (fgot, ftmp) do i = 1, N !$acc atomic capture farr(i) = fgot fgot = fgot / 2.0 !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. & (fexp < farr(i) .and. farr(i) <= 2**32.0 & .and. aint (farr(i)) == farr(i))) STOP 9 end do if (fgot /= fexp) STOP 10 lgot = .TRUE. lexp = .FALSE. !$acc parallel copy (lgot, ltmp) !$acc atomic capture ltmp = lgot lgot = lgot .and. .FALSE. !$acc end atomic !$acc end parallel if (ltmp .neqv. .not. lexp) STOP 11 if (lgot .neqv. lexp) STOP 12 lgot = .FALSE. lexp = .FALSE. !$acc parallel copy (lgot, ltmp) !$acc atomic capture ltmp = lgot lgot = lgot .or. .FALSE. !$acc end atomic !$acc end parallel if (ltmp .neqv. lexp) STOP 13 if (lgot .neqv. lexp) STOP 14 lgot = .FALSE. lexp = .FALSE. !$acc parallel copy (lgot, ltmp) !$acc atomic capture ltmp = lgot lgot = lgot .eqv. .TRUE. !$acc end atomic !$acc end parallel if (ltmp .neqv. lexp) STOP 15 if (lgot .neqv. lexp) STOP 16 lgot = .FALSE. lexp = .TRUE. !$acc parallel copy (lgot, ltmp) !$acc atomic capture ltmp = lgot lgot = lgot .neqv. .TRUE. !$acc end atomic !$acc end parallel if (ltmp .neqv. .not. lexp) STOP 17 if (lgot .neqv. lexp) STOP 18 fgot = 1234.0 fexp = 1266.0 !$acc parallel loop copy (fgot, ftmp) do i = 1, N !$acc atomic capture farr(i) = fgot fgot = 1.0 + fgot !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. & (1234.0 <= farr(i) .and. farr(i) < fexp & .and. aint (farr(i)) == farr(i))) STOP 19 end do if (fgot /= fexp) STOP 20 fgot = 1.0 fexp = 2.0**32 !$acc parallel loop copy (fgot, ftmp) do i = 1, N !$acc atomic capture farr(i) = fgot fgot = 2.0 * fgot !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. & (1.0 <= farr(i) .and. farr(i) < fexp & .and. aint (farr(i)) == farr(i))) STOP 21 end do if (fgot /= fexp) STOP 22 fgot = 32.0 fexp = 32.0 !$acc parallel loop copy (fgot, ftmp) do i = 1, N !$acc atomic capture farr(i) = fgot fgot = 2.0 - fgot !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. (farr(i) == fexp .or. farr(i) == -30.0)) STOP 23 end do if (fgot /= fexp) STOP 24 fgot = 2.0**16 fexp = 2.0**16 !$acc parallel loop copy (fgot, ftmp) do i = 1, N !$acc atomic capture farr(i) = fgot fgot = 2.0 / fgot !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. (farr(i) == fexp .or. farr(i) == 1.0 / 2.0**15)) STOP 25 end do if (fgot /= fexp) STOP 26 lgot = .TRUE. lexp = .FALSE. !$acc parallel copy (lgot, ltmp) !$acc atomic capture ltmp = lgot lgot = .FALSE. .and. lgot !$acc end atomic !$acc end parallel if (ltmp .neqv. .not. lexp) STOP 27 if (lgot .neqv. lexp) STOP 28 lgot = .FALSE. lexp = .FALSE. !$acc parallel copy (lgot, ltmp) !$acc atomic capture ltmp = lgot lgot = .FALSE. .or. lgot !$acc end atomic !$acc end parallel if (ltmp .neqv. lexp) STOP 29 if (lgot .neqv. lexp) STOP 30 lgot = .FALSE. lexp = .FALSE. !$acc parallel copy (lgot, ltmp) !$acc atomic capture ltmp = lgot lgot = .TRUE. .eqv. lgot !$acc end atomic !$acc end parallel if (ltmp .neqv. lexp) STOP 31 if (lgot .neqv. lexp) STOP 32 lgot = .FALSE. lexp = .TRUE. !$acc parallel copy (lgot, ltmp) !$acc atomic capture ltmp = lgot lgot = .TRUE. .neqv. lgot !$acc end atomic !$acc end parallel if (ltmp .neqv. .not. lexp) STOP 33 if (lgot .neqv. lexp) STOP 34 igot = 0 iexp = N iarr = -42 !$acc parallel loop copy (igot, itmp) do i = 1, N !$acc atomic capture iarr(i) = igot igot = max (igot, i) !$acc end atomic end do !$acc end parallel loop if (igot /= N) stop 107 itmp = 0 do i = 1, N if (iarr(i) == 0) then itmp = i exit end if end do ! At most one iarr element can be 0. do i = 1, N if ((iarr(i) == 0 .and. i /= itmp) & .or. iarr(i) < 0 .or. iarr(i) > N) STOP 35 end do if (igot /= iexp) STOP 36 igot = N + 1 iexp = 1 iarr = -42 !$acc parallel loop copy (igot, itmp) do i = 1, N !$acc atomic capture iarr(i) = igot igot = min (igot, i) !$acc end atomic end do !$acc end parallel loop if (igot /= 1) stop 108 itmp = N + 1 ! At most one iarr element can be N+1. do i = 1, N if (iarr(i) == N + 1) then itmp = i exit end if end do do i = 1, N if ((iarr(i) == N + 1 .and. i /= itmp) & .or. iarr(i) <= 0 .or. iarr(i) > N + 1) STOP 37 end do if (igot /= iexp) STOP 38 igot = -1 iexp = 0 !$acc parallel loop copy (igot, itmp) do i = 0, N - 1 iexpr = ibclr (-1, i) !$acc atomic capture iarr(i) = igot igot = iand (igot, iexpr) !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. (popcnt(iarr(i - 1)) > 0)) STOP 39 end do if (igot /= iexp) STOP 40 igot = 0 iexp = -1 !$acc parallel loop copy (igot, itmp) do i = 0, N - 1 iexpr = lshift (1, i) !$acc atomic capture iarr(i) = igot igot = ior (igot, iexpr) !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. (popcnt(iarr(i - 1)) < 32)) STOP 41 end do if (igot /= iexp) STOP 42 igot = -1 iexp = 0 !$acc parallel loop copy (igot, itmp) do i = 0, N - 1 iexpr = lshift (1, i) !$acc atomic capture iarr(i) = igot igot = ieor (igot, iexpr) !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. (popcnt(iarr(i - 1)) > 0)) STOP 43 end do if (igot /= iexp) STOP 44 igot = 1 iexp = N !$acc parallel loop copy (igot, itmp) do i = 1, N !$acc atomic capture iarr(i) = igot igot = max (i, igot) !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. (1 <= iarr(i) .and. iarr(i) <= iexp)) STOP 45 end do if (igot /= iexp) STOP 46 igot = N iexp = 1 !$acc parallel loop copy (igot, itmp) do i = 1, N !$acc atomic capture iarr(i) = igot igot = min (i, igot) !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. (iarr(i) >= 1 .or. iarr(i) <= N)) STOP 47 end do if (igot /= iexp) STOP 48 igot = -1 iexp = 0 !$acc parallel loop copy (igot, itmp) do i = 0, N - 1 iexpr = ibclr (-1, i) !$acc atomic capture iarr(i) = igot igot = iand (iexpr, igot) !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. (popcnt(iarr(i - 1)) > 0)) STOP 49 end do if (igot /= iexp) STOP 50 igot = 0 iexp = -1 !! !$acc parallel loop copy (igot, itmp) do i = 0, N - 1 iexpr = lshift (1, i) !$acc atomic capture iarr(i) = igot igot = ior (iexpr, igot) !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. (popcnt(iarr(i - 1)) < 32)) STOP 51 end do if (igot /= iexp) STOP 52 igot = -1 iexp = 0 !$acc parallel loop copy (igot, itmp) do i = 0, N - 1 iexpr = lshift (1, i) !$acc atomic capture iarr(i) = igot igot = ieor (iexpr, igot) !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. (popcnt(iarr(i - 1)) > 0)) STOP 53 end do if (igot /= iexp) STOP 54 fgot = 1234.0 fexp = 1266.0 !$acc parallel loop copy (fgot, ftmp) do i = 1, N !$acc atomic capture fgot = fgot + 1.0 farr(i) = fgot !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. & (1234.0 < farr(i) .and. farr(i) <= fexp & .and. aint (farr(i)) == farr(i))) STOP 55 end do if (fgot /= fexp) STOP 56 fgot = 1.0 fexp = 2.0**32 !$acc parallel loop copy (fgot, ftmp) do i = 1, N !$acc atomic capture fgot = fgot * 2.0 farr(i) = fgot !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. & (1.0 < farr(i) .and. farr(i) <= fexp & .and. aint (farr(i)) == farr(i))) STOP 57 end do if (fgot /= fexp) STOP 58 fgot = 32.0 fexp = fgot - N !$acc parallel loop copy (fgot, ftmp) do i = 1, N !$acc atomic capture fgot = fgot - 1.0 farr(i) = fgot !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. & (fexp <= farr(i) .and. farr(i) < 32.0 & .and. aint (farr(i)) == farr(i))) STOP 59 end do if (fgot /= fexp) STOP 60 fgot = 2**32.0 fexp = 1.0 !$acc parallel loop copy (fgot, ftmp) do i = 1, N !$acc atomic capture fgot = fgot / 2.0 farr(i) = fgot !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. & (fexp <= farr(i) .and. farr(i) < 2**32.0 & .and. aint (farr(i)) == farr(i))) STOP 61 end do if (fgot /= fexp) STOP 62 lgot = .TRUE. lexp = .FALSE. !$acc parallel copy (lgot, ltmp) !$acc atomic capture lgot = lgot .and. .FALSE. ltmp = lgot !$acc end atomic !$acc end parallel if (ltmp .neqv. lexp) STOP 63 if (lgot .neqv. lexp) STOP 64 lgot = .FALSE. lexp = .FALSE. !$acc parallel copy (lgot, ltmp) !$acc atomic capture lgot = lgot .or. .FALSE. ltmp = lgot !$acc end atomic !$acc end parallel if (ltmp .neqv. lexp) STOP 65 if (lgot .neqv. lexp) STOP 66 lgot = .FALSE. lexp = .FALSE. !$acc parallel copy (lgot, ltmp) !$acc atomic capture lgot = lgot .eqv. .TRUE. ltmp = lgot !$acc end atomic !$acc end parallel if (ltmp .neqv. lexp) STOP 67 if (lgot .neqv. lexp) STOP 68 lgot = .FALSE. lexp = .TRUE. !$acc parallel copy (lgot, ltmp) !$acc atomic capture lgot = lgot .neqv. .TRUE. ltmp = lgot !$acc end atomic !$acc end parallel if (ltmp .neqv. lexp) STOP 69 if (lgot .neqv. lexp) STOP 70 fgot = 1234.0 fexp = 1266.0 !$acc parallel loop copy (fgot, ftmp) do i = 1, N !$acc atomic capture fgot = 1.0 + fgot farr(i) = fgot !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. & (1234.0 < farr(i) .and. farr(i) <= fexp & .and. aint (farr(i)) == farr(i))) STOP 71 end do if (fgot /= fexp) STOP 72 fgot = 1.0 fexp = 2.0**32 !$acc parallel loop copy (fgot, ftmp) do i = 1, N !$acc atomic capture fgot = 2.0 * fgot farr(i) = fgot !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. & (1.0 < farr(i) .and. farr(i) <= 2**32.0 & .and. aint (farr(i)) == farr(i))) STOP 73 end do if (fgot /= fexp) STOP 74 fgot = 32.0 fexp = 32.0 !$acc parallel loop copy (fgot, ftmp) do i = 1, N !$acc atomic capture fgot = 2.0 - fgot farr(i) = fgot !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. (farr(i) == fexp .or. farr(i) == 2.0 - fexp)) STOP 75 end do if (fgot /= fexp) STOP 76 fgot = 2.0**16 fexp = 2.0**16 !$acc parallel loop copy (fgot, ftmp) do i = 1, N !$acc atomic capture fgot = 2.0 / fgot farr(i) = fgot !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. (farr(i) == fexp .or. farr(i) == 2.0 / fexp)) STOP 77 end do if (fgot /= fexp) STOP 78 lgot = .TRUE. lexp = .FALSE. !$acc parallel copy (lgot, ltmp) !$acc atomic capture lgot = .FALSE. .and. lgot ltmp = lgot !$acc end atomic !$acc end parallel if (ltmp .neqv. lexp) STOP 79 if (lgot .neqv. lexp) STOP 80 lgot = .FALSE. lexp = .FALSE. !$acc parallel copy (lgot, ltmp) !$acc atomic capture lgot = .FALSE. .or. lgot ltmp = lgot !$acc end atomic !$acc end parallel if (ltmp .neqv. lexp) STOP 81 if (lgot .neqv. lexp) STOP 82 lgot = .FALSE. lexp = .FALSE. !$acc parallel copy (lgot, ltmp) !$acc atomic capture lgot = .TRUE. .eqv. lgot ltmp = lgot !$acc end atomic !$acc end parallel if (ltmp .neqv. lexp) STOP 83 if (lgot .neqv. lexp) STOP 84 lgot = .FALSE. lexp = .TRUE. !$acc parallel copy (lgot, ltmp) !$acc atomic capture lgot = .TRUE. .neqv. lgot ltmp = lgot !$acc end atomic !$acc end parallel if (ltmp .neqv. lexp) STOP 85 if (lgot .neqv. lexp) STOP 86 igot = 1 iexp = N !$acc parallel loop copy (igot, itmp) do i = 1, N !$acc atomic capture igot = max (igot, i) iarr(i) = igot !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. (1 <= iarr(i) .and. iarr(i) <= N)) STOP 87 end do if (igot /= iexp) STOP 88 igot = N iexp = 1 !$acc parallel loop copy (igot, itmp) do i = 1, N !$acc atomic capture igot = min (igot, i) iarr(i) = igot !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. (iarr(i) <= i)) STOP 89 end do if (igot /= iexp) STOP 90 igot = -1 iexp = 0 !$acc parallel loop copy (igot, itmp) do i = 0, N - 1 iexpr = ibclr (-2, i) !$acc atomic capture igot = iand (igot, iexpr) iarr(i) = igot !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. (popcnt(iarr(i - 1)) < 32)) STOP 91 end do if (igot /= iexp) STOP 92 igot = 0 iexp = -1 !$acc parallel loop copy (igot, itmp) do i = 0, N - 1 iexpr = lshift (1, i) !$acc atomic capture igot = ior (igot, iexpr) iarr(i) = igot !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. (popcnt(iarr(i - 1)) > 0)) STOP 93 end do if (igot /= iexp) STOP 94 igot = -1 iexp = 0 !$acc parallel loop copy (igot, itmp) do i = 0, N - 1 iexpr = lshift (1, i) !$acc atomic capture igot = ieor (igot, iexpr) iarr(i) = igot !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. (popcnt(iarr(i - 1)) < 32)) STOP 95 end do if (igot /= iexp) STOP 96 igot = 1 iexp = N !$acc parallel loop copy (igot, itmp) do i = 1, N !$acc atomic capture igot = max (i, igot) iarr(i) = igot !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. (1 <= iarr(i) .and. iarr(i) <= iexp)) STOP 97 end do if (igot /= iexp) STOP 98 igot = N iexp = 1 !$acc parallel loop copy (igot, itmp) do i = 1, N !$acc atomic capture igot = min (i, igot) iarr(i) = igot !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. (iarr(i) <= i)) STOP 99 end do if (igot /= iexp) STOP 100 igot = -1 iexp = 0 !$acc parallel loop copy (igot, itmp) do i = 0, N - 1 iexpr = ibclr (-2, i) !$acc atomic capture igot = iand (iexpr, igot) iarr(i) = igot !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. (popcnt(iarr(i - 1)) < 32)) STOP 101 end do if (igot /= iexp) STOP 102 igot = 0 iexp = -1 !$acc parallel loop copy (igot, itmp) do i = 0, N - 1 iexpr = lshift (1, i) !$acc atomic capture igot = ior (iexpr, igot) iarr(i) = igot !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. (popcnt(iarr(i - 1)) > 0)) STOP 103 end do if (igot /= iexp) STOP 104 igot = -1 iexp = 0 !$acc parallel loop copy (igot, itmp) do i = 0, N - 1 iexpr = lshift (1, i) !$acc atomic capture igot = ieor (iexpr, igot) iarr(i) = igot !$acc end atomic end do !$acc end parallel loop do i = 1, N if (.not. (popcnt(iarr(i - 1)) < 32)) STOP 105 end do if (igot /= iexp) STOP 106 end program