1! { dg-do run }
2
3  integer, parameter :: N = 256
4  integer, save :: a(N), b(N / 16, 8, 4), c(N / 32, 8, 8), g(N/16,8,6)
5  integer, save, volatile :: d, e
6  integer(kind=8), save, volatile :: f
7  integer(kind=8) :: i
8  integer :: j, k, l, m
9  integer :: m1, m2, m3, m4, m5, m6, m7, m8
10  integer :: m9, m10, m11, m12, m13, m14, m15, m16
11  d = 0
12  e = 0
13  f = 0
14  !$omp parallel private (l) shared(k)
15    !$omp do schedule(static, 1) ordered(1)
16    do i = 2, N + f
17      !$omp atomic write
18      a(i) = 1
19      !$omp ordered depend ( sink : i - 1 )
20      if (i.gt.2) then
21        !$omp atomic read
22        l = a(i - 1)
23        if (l.lt.2) STOP 1
24      end if
25      !$omp atomic write
26      a(i) = 2
27      if (i.lt.N) then
28        !$omp atomic read
29        l = a(i + 1)
30        if (l.eq.3) STOP 2
31      end if
32      !$omp ordered depend(source)
33      !$omp atomic write
34      a(i) = 3
35    end do
36    !$omp end do nowait
37    !$omp do schedule(static) ordered ( 3 )
38    do i = 4, N / 16 - 1 + f
39      do j = 1, 8, 2
40        do k = 2, 4
41          !$omp atomic write
42          b(i, j, k) = 1
43          !$omp ordered depend(sink:i,j-2,k-1) &
44          !$omp& depend(sink: i - 2, j - 2, k + 1)
45          !$omp ordered depend(sink:i-3,j+2,k-2)
46          if (j.gt.2.and.k.gt.2) then
47            !$omp atomic read
48            l = b(i,j-2,k-1)
49            if (l.lt.2) STOP 3
50          end if
51          !$omp atomic write
52          b(i,j,k) = 2
53          if (i.gt.5.and.j.gt.2.and.k.lt.4) then
54            !$omp atomic read
55            l = b(i-2,j-2, k+1)
56            if (l.lt.2) STOP 4
57          end if
58          if (i.gt.6.and.j.le.N/16-3.and.k.eq.4) then
59            !$omp atomic read
60            l = b( i - 3, j+2, k-2)
61            if (l.lt.2) STOP 5
62          end if
63          !$omp ordered depend(source)
64          !$omp atomic write
65          b(i, j, k) = 3
66        end do
67      end do
68    end do
69    !$omp end do nowait
70    !$omp do schedule(dynamic, 15) collapse(2) ordered(13)
71    do i = 3, N / 32 + f
72      do j = 8, 3, -1
73        do k = 7, 1, -2
74          do m1 = 4, 4
75          do m2 = 4, 4
76          do m3 = 4, 4
77          do m4 = 4, 4
78          do m5 = 4, 4
79          do m6 = 4, 4
80          do m7 = 4, 4
81          do m8 = 4, 4
82          do m9 = 4, 4
83          do m10 = 4, 4
84          do m11 = 4, 4
85          do m12 = 4, 4
86          do m13 = 4, 4
87          do m14 = 4, 4
88          do m15 = 4, 4
89          do m16 = 4, 4
90            !$omp atomic write
91            c(i, j, k) = 1
92            !$omp ordered depend(sink: i, j, k + 2, m1, m2, m3, m4, &
93            !$omp & m5, m6, m7, m8, m9, m10) &
94            !$omp depend(sink: i - 2, j + 1, k - 4, m1,m2,m3,m4,m5, &
95            !$omp & m6,m7,m8,m9,m10) depend ( sink : i-1,j-2,k-2, &
96            !$omp& m1,m2,m3,m4 , m5, m6,m7,m8,m9,m10 )
97            if (k.le.5) then
98              !$omp atomic read
99              l = c(i, j, k + 2)
100              if (l.lt.2) STOP 6
101            end if
102            !$omp atomic write
103            c(i, j, k) = 2
104            if (i.ge.5.and.j.lt.8.and.k.ge.5) then
105              !$omp atomic read
106              l = c(i - 2, j + 1, k - 4)
107              if (l.lt.2) STOP 7
108            end if
109            if (i.ge.4.and.j.ge.5.and.k.ge.3) then
110              !$omp atomic read
111              l = c(i - 1, j - 2, k - 2)
112              if (l.lt.2) STOP 8
113            end if
114            !$omp ordered depend ( source )
115            !$omp atomic write
116            c(i,j,k)=3
117          end do
118          end do
119          end do
120          end do
121          end do
122          end do
123          end do
124          end do
125          end do
126          end do
127          end do
128          end do
129          end do
130          end do
131          end do
132          end do
133        end do
134      end do
135    end do
136    !$omp do schedule(static) ordered(3)
137    do j = 1, N / 16 - 1
138      do k = 1, 7, 2
139        do i = 4, 6 + f
140          !$omp atomic write
141          g(j, k, i) = 1
142          !$omp ordered depend(sink: j, k-2,i-1) &
143          !$omp& depend(sink: j - 2, k - 2, i + 1)
144          !$omp ordered depend(sink:j-3,k+2,i-2)
145          if (k.gt.2.and.i.gt.4) then
146            !$omp atomic read
147            l = g(j,k-2,i-1)
148            if (l.lt.2) STOP 9
149          end if
150          !$omp atomic write
151          g(j,k,i) = 2
152          if (j.gt.2.and.k.gt.2.and.i.lt.6) then
153            !$omp atomic read
154            l = g(j-2,k-2, i+1)
155            if (l.lt.2) STOP 10
156          end if
157          if (j.gt.3.and.k.le.N/16-3.and.i.eq.6) then
158            !$omp atomic read
159            l = g( j - 3, k+2, i-2)
160            if (l.lt.2) STOP 11
161          end if
162          !$omp ordered depend(source)
163          !$omp atomic write
164          g(j, k, i) = 3
165        end do
166      end do
167    end do
168    !$omp end do nowait
169    !$omp do collapse(2) ordered(4) lastprivate (i,j,k)
170    do i = 2, f + 2
171      do j = d + 1, 0, -1
172        do k = 0, d - 1
173          do l = 0, d + 1
174            !$omp ordered depend(source)
175            !$omp ordered depend(sink: i-2,j+2,k-2,l)
176            if (e.eq.0) STOP 12
177          end do
178        end do
179      end do
180    end do
181    !$omp single
182    if (i.ne.3.or.j.ne.-1.or.k.ne.0) STOP 13
183    i = 8; j = 9; k = 10
184    !$omp end single
185    !$omp do ordered(4) collapse(2) lastprivate (i, j, k, m)
186    do i = 2, f + 2
187      do j = d + 1, 0, -1
188        do k = 0, d + 1
189          do m = 0, d-1
190            !$omp ordered depend(source)
191            !$omp ordered depend(sink: i - 2, j + 2, k - 2, m)
192            STOP 14
193          end do
194        end do
195      end do
196    end do
197    !$omp single
198    if (i.ne.3.or.j.ne.-1.or.k.ne.2.or.m.ne.0) STOP 15
199    !$omp end single
200    !$omp do collapse(2) ordered(4) lastprivate (i,j,k)
201    do i = 2, f + 2
202      do j = d, 1, -1
203        do k = 0, d + 1
204          do l = 0, d + 3
205            !$omp ordered depend(source)
206            !$omp ordered depend(sink: i-2,j+2,k-2,l)
207            if (e.eq.0) STOP 16
208          end do
209        end do
210      end do
211    end do
212    !$omp end do nowait
213    !$omp single
214    if (a(1) .ne. 0) STOP 17
215    !$omp end single nowait
216    !$omp do
217    do i = 2, N
218      if (a(i) .ne. 3) STOP 18
219    end do
220    !$omp end do nowait
221    !$omp do collapse(2) private(k)
222    do i = 1, N / 16
223      do j = 1, 8
224        do k = 1, 4
225          if (i.ge.4.and.i.lt.N/16.and.iand(j,1).ne.0.and.k.ge.2) then
226            if (b(i,j,k).ne.3) STOP 19
227          else
228            if (b(i,j,k).ne.0) STOP 20
229          end if
230        end do
231      end do
232    end do
233    !$omp end do nowait
234    !$omp do collapse(3)
235    do i = 1, N / 32
236      do j = 1, 8
237        do k = 1, 4
238          if (i.ge.3.and.j.ge.3.and.iand(k,1).ne.0) then
239            if (c(i,j,k).ne.3) STOP 21
240          else
241            if (c(i,j,k).ne.0) STOP 22
242          end if
243        end do
244      end do
245    end do
246    !$omp end do nowait
247    !$omp do collapse(2) private(k)
248    do i = 1, N / 16
249      do j = 1, 8
250        do k = 1, 6
251          if (i.lt.N/16.and.iand(j,1).ne.0.and.k.ge.4) then
252            if (g(i,j,k).ne.3) STOP 23
253          else
254            if (g(i,j,k).ne.0) STOP 24
255          end if
256        end do
257      end do
258    end do
259    !$omp end do nowait
260  !$omp end parallel
261end
262