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)
5  integer, save, volatile :: d, e
6  integer :: i, j, k, l, m
7  integer :: m1, m2, m3, m4, m5, m6, m7, m8
8  integer :: m9, m10, m11, m12, m13, m14, m15, m16
9  d = 0
10  e = 0
11  !$omp parallel private (l) shared(k)
12    !$omp do schedule(static, 1) ordered(1)
13    do i = 1, N
14      !$omp atomic write
15      a(i) = 1
16      !$omp ordered depend ( sink : i - 1 )
17      if (i.gt.1) then
18        !$omp atomic read
19        l = a(i - 1)
20        if (l.lt.2) stop 1
21      end if
22      !$omp atomic write
23      a(i) = 2
24      if (i.lt.N) then
25        !$omp atomic read
26        l = a(i + 1)
27        if (l.eq.3) stop 2
28      end if
29      !$omp ordered depend(source)
30      !$omp atomic write
31      a(i) = 3
32    end do
33    !$omp end do nowait
34    !$omp do schedule(static) ordered ( 3 )
35    do i = 3, N / 16 - 1
36      do j = 1, 8, 2
37        do k = 2, 4
38          !$omp atomic write
39          b(i, j, k) = 1
40          !$omp ordered depend(sink:i,j-2,k-1) &
41          !$omp& depend(sink: i - 2, j - 2, k + 1)
42          !$omp ordered depend(sink:i-3,j+2,k-2)
43          if (j.gt.2.and.k.gt.2) then
44            !$omp atomic read
45            l = b(i,j-2,k-1)
46            if (l.lt.2) stop 3
47          end if
48          !$omp atomic write
49          b(i,j,k) = 2
50          if (i.gt.4.and.j.gt.2.and.k.lt.4) then
51            !$omp atomic read
52            l = b(i-2,j-2, k+1)
53            if (l.lt.2) stop 4
54          end if
55          if (i.gt.5.and.j.le.N/16-3.and.k.eq.4) then
56            !$omp atomic read
57            l = b( i - 3, j+2, k-2)
58            if (l.lt.2) stop 5
59          end if
60          !$omp ordered depend(source)
61          !$omp atomic write
62          b(i, j, k) = 3
63        end do
64      end do
65    end do
66    !$omp end do nowait
67    !$omp do schedule(dynamic, 15) collapse(2) ordered(13)
68    do i = 1, N / 32
69      do j = 8, 3, -1
70        do k = 7, 1, -2
71          do m1 = 4, 4
72          do m2 = 4, 4
73          do m3 = 4, 4
74          do m4 = 4, 4
75          do m5 = 4, 4
76          do m6 = 4, 4
77          do m7 = 4, 4
78          do m8 = 4, 4
79          do m9 = 4, 4
80          do m10 = 4, 4
81          do m11 = 4, 4
82          do m12 = 4, 4
83          do m13 = 4, 4
84          do m14 = 4, 4
85          do m15 = 4, 4
86          do m16 = 4, 4
87            !$omp atomic write
88            c(i, j, k) = 1
89            !$omp ordered depend(sink: i, j, k + 2, m1, m2, m3, m4, &
90            !$omp & m5, m6, m7, m8, m9, m10) &
91            !$omp depend(sink: i - 2, j + 1, k - 4, m1,m2,m3,m4,m5, &
92            !$omp & m6,m7,m8,m9,m10) depend ( sink : i-1,j-2,k-2, &
93            !$omp& m1,m2,m3,m4 , m5, m6,m7,m8,m9,m10 )
94            if (k.le.5) then
95              !$omp atomic read
96              l = c(i, j, k + 2)
97              if (l.lt.2) stop 6
98            end if
99            !$omp atomic write
100            c(i, j, k) = 2
101            if (i.ge.3.and.j.lt.8.and.k.ge.5) then
102              !$omp atomic read
103              l = c(i - 2, j + 1, k - 4)
104              if (l.lt.2) stop 7
105            end if
106            if (i.ge.2.and.j.ge.5.and.k.ge.3) then
107              !$omp atomic read
108              l = c(i - 1, j - 2, k - 2)
109              if (l.lt.2) stop 8
110            end if
111            !$omp ordered depend ( source )
112            !$omp atomic write
113            c(i,j,k)=3
114          end do
115          end do
116          end do
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    !$omp do collapse(2) ordered(4) lastprivate (i,j,k)
134    do i = 0, d
135      do j = d + 1, 0, -1
136        do k = 0, d - 1
137          do l = 0, d + 1
138            !$omp ordered depend(source)
139            !$omp ordered depend(sink: i-2,j+2,k-2,l)
140            if (e.eq.0) stop 9
141          end do
142        end do
143      end do
144    end do
145    !$omp single
146    if (i.ne.1.or.j.ne.-1.or.k.ne.0) stop 10
147    i = 8; j = 9; k = 10
148    !$omp end single
149    !$omp do ordered(4) collapse(2) lastprivate (i, j, k, m)
150    do i = 0, d
151      do j = d + 1, 0, -1
152        do k = 0, d + 1
153          do m = 0, d-1
154            !$omp ordered depend(source)
155            !$omp ordered depend(sink: i - 2, j + 2, k - 2, m)
156            stop 11
157          end do
158        end do
159      end do
160    end do
161    !$omp single
162    if (i.ne.1.or.j.ne.-1.or.k.ne.2.or.m.ne.0) stop 12
163    !$omp end single
164    !$omp do collapse(2) ordered(4) lastprivate (i,j,k)
165    do i = 0, d
166      do j = d, 1, -1
167        do k = 0, d + 1
168          do l = 0, d + 3
169            !$omp ordered depend(source)
170            !$omp ordered depend(sink: i-2,j+2,k-2,l)
171            if (e.eq.0) stop 13
172          end do
173        end do
174      end do
175    end do
176    !$omp end do nowait
177    !$omp do
178    do i = 1, N
179      if (a(i) .ne. 3) stop 14
180    end do
181    !$omp end do nowait
182    !$omp do collapse(2) private(k)
183    do i = 1, N / 16
184      do j = 1, 8
185        do k = 1, 4
186          if (i.ge.3.and.i.lt.N/16.and.iand(j,1).ne.0.and.k.ge.2) then
187            if (b(i,j,k).ne.3) stop 15
188          else
189            if (b(i,j,k).ne.0) stop 16
190          end if
191        end do
192      end do
193    end do
194    !$omp end do nowait
195    !$omp do collapse(3)
196    do i = 1, N / 32
197      do j = 1, 8
198        do k = 1, 4
199          if (j.ge.3.and.iand(k,1).ne.0) then
200            if (c(i,j,k).ne.3) stop 17
201          else
202            if (c(i,j,k).ne.0) stop 18
203          end if
204        end do
205      end do
206    end do
207    !$omp end do nowait
208  !$omp end parallel
209end
210