! { dg-do run } integer, parameter :: N = 256 integer, save :: a(N), b(N / 16, 8, 4), c(N / 32, 8, 8), g(N/16,8,6) integer, save, volatile :: d, e integer(kind=8), save, volatile :: f integer(kind=8) :: i integer :: j, k, l, m integer :: m1, m2, m3, m4, m5, m6, m7, m8 integer :: m9, m10, m11, m12, m13, m14, m15, m16 d = 0 e = 0 f = 0 !$omp parallel private (l) shared(k) !$omp do schedule(guided, 3) ordered(1) do i = 2, N + f, f + 1 !$omp atomic write a(i) = 1 !$omp ordered depend ( sink : i - 1 ) if (i.gt.2) then !$omp atomic read l = a(i - 1) if (l.lt.2) call abort end if !$omp atomic write a(i) = 2 if (i.lt.N) then !$omp atomic read l = a(i + 1) if (l.eq.3) call abort end if !$omp ordered depend(source) !$omp atomic write a(i) = 3 end do !$omp end do nowait !$omp do schedule(guided) ordered ( 3 ) do i = 4, N / 16 - 1 + f, 1 + f do j = 1, 8, d + 2 do k = 2, 4, 1 + d !$omp atomic write b(i, j, k) = 1 !$omp ordered depend(sink:i,j-2,k-1) & !$omp& depend(sink: i - 2, j - 2, k + 1) !$omp ordered depend(sink:i-3,j+2,k-2) if (j.gt.2.and.k.gt.2) then !$omp atomic read l = b(i,j-2,k-1) if (l.lt.2) call abort end if !$omp atomic write b(i,j,k) = 2 if (i.gt.5.and.j.gt.2.and.k.lt.4) then !$omp atomic read l = b(i-2,j-2, k+1) if (l.lt.2) call abort end if if (i.gt.6.and.j.le.N/16-3.and.k.eq.4) then !$omp atomic read l = b( i - 3, j+2, k-2) if (l.lt.2) call abort end if !$omp ordered depend(source) !$omp atomic write b(i, j, k) = 3 end do end do end do !$omp end do nowait !$omp do schedule(guided, 15) collapse(2) ordered(13) do i = 3, N / 32 + f, d + 1 do j = 8, 3, d - 1 do k = 7, 1, d - 2 do m1 = 4, 4, d + 1 do m2 = 4, 4, 1 + d do m3 = 4, 4, d + 1 do m4 = 4, 4, 1 + d do m5 = 4, 4, d + 1 do m6 = 4, 4, 1 + d do m7 = 4, 4, d + 1 do m8 = 4, 4, 1 + d do m9 = 4, 4 do m10 = 4, 4, d + 1 do m11 = 4, 4, 1 + d do m12 = 4, 4, d + 1 do m13 = 4, 4 do m14 = 4, 4, 1 + d do m15 = 4, 4, d + 1 do m16 = 4, 4, 1 + d !$omp atomic write c(i, j, k) = 1 !$omp ordered depend(sink: i, j, k + 2, m1, m2, m3, m4, & !$omp & m5, m6, m7, m8, m9, m10) & !$omp depend(sink: i - 2, j + 1, k - 4, m1,m2,m3,m4,m5, & !$omp & m6,m7,m8,m9,m10) depend ( sink : i-1,j-2,k-2, & !$omp& m1,m2,m3,m4 , m5, m6,m7,m8,m9,m10 ) if (k.le.5) then !$omp atomic read l = c(i, j, k + 2) if (l.lt.2) call abort end if !$omp atomic write c(i, j, k) = 2 if (i.ge.5.and.j.lt.8.and.k.ge.5) then !$omp atomic read l = c(i - 2, j + 1, k - 4) if (l.lt.2) call abort end if if (i.ge.4.and.j.ge.5.and.k.ge.3) then !$omp atomic read l = c(i - 1, j - 2, k - 2) if (l.lt.2) call abort end if !$omp ordered depend ( source ) !$omp atomic write c(i,j,k)=3 end do end do end do end do end do end do end do end do end do end do end do end do end do end do end do end do end do end do end do !$omp do schedule(guided, 5) ordered(3) do j = 1, N / 16 - 1, d + 1 do k = 1, 7, 2 + d do i = 4, 6 + f, f + 1 !$omp atomic write g(j, k, i) = 1 !$omp ordered depend(sink: j, k-2,i-1) & !$omp& depend(sink: j - 2, k - 2, i + 1) !$omp ordered depend(sink:j-3,k+2,i-2) if (k.gt.2.and.i.gt.4) then !$omp atomic read l = g(j,k-2,i-1) if (l.lt.2) call abort end if !$omp atomic write g(j,k,i) = 2 if (j.gt.2.and.k.gt.2.and.i.lt.6) then !$omp atomic read l = g(j-2,k-2, i+1) if (l.lt.2) call abort end if if (j.gt.3.and.k.le.N/16-3.and.i.eq.6) then !$omp atomic read l = g( j - 3, k+2, i-2) if (l.lt.2) call abort end if !$omp ordered depend(source) !$omp atomic write g(j, k, i) = 3 end do end do end do !$omp end do nowait !$omp do collapse(2) ordered(4) lastprivate (i,j,k) do i = 2, f + 2, 1 + f do j = d + 1, 0, d - 1 do k = 0, d - 1, d + 1 do l = 0, d + 1, 1 + d !$omp ordered depend(source) !$omp ordered depend(sink: i-2,j+2,k-2,l) if (e.eq.0) call abort end do end do end do end do !$omp single if (i.ne.3.or.j.ne.-1.or.k.ne.0) call abort i = 8; j = 9; k = 10 !$omp end single !$omp do ordered(4) collapse(2) lastprivate (i, j, k, m) do i = 2, f + 2, 1 + f do j = d + 1, 0, d - 1 do k = 0, d + 1, 1 + d do m = 0, d-1, d+1 !$omp ordered depend(source) !$omp ordered depend(sink: i - 2, j + 2, k - 2, m) call abort end do end do end do end do !$omp single if (i.ne.3.or.j.ne.-1.or.k.ne.2.or.m.ne.0) call abort !$omp end single !$omp do collapse(2) ordered(4) lastprivate (i,j,k) do i = 2, f + 2, 1 + f do j = d, 1, d -1 do k = 0, d + 1, 1 + d do l = 0, d + 3, d + 1 !$omp ordered depend(source) !$omp ordered depend(sink: i-2,j+2,k-2,l) if (e.eq.0) call abort end do end do end do end do !$omp end do nowait !$omp single if (a(1) .ne. 0) call abort !$omp end single nowait !$omp do do i = 2, N if (a(i) .ne. 3) call abort end do !$omp end do nowait !$omp do collapse(2) private(k) do i = 1, N / 16 do j = 1, 8 do k = 1, 4 if (i.ge.4.and.i.lt.N/16.and.iand(j,1).ne.0.and.k.ge.2) then if (b(i,j,k).ne.3) call abort else if (b(i,j,k).ne.0) call abort end if end do end do end do !$omp end do nowait !$omp do collapse(3) do i = 1, N / 32 do j = 1, 8 do k = 1, 4 if (i.ge.3.and.j.ge.3.and.iand(k,1).ne.0) then if (c(i,j,k).ne.3) call abort else if (c(i,j,k).ne.0) call abort end if end do end do end do !$omp end do nowait !$omp do collapse(2) private(k) do i = 1, N / 16 do j = 1, 8 do k = 1, 6 if (i.lt.N/16.and.iand(j,1).ne.0.and.k.ge.4) then if (g(i,j,k).ne.3) call abort else if (g(i,j,k).ne.0) call abort end if end do end do end do !$omp end do nowait !$omp end parallel end