1! { dg-do run }
2
3program collapse3
4  call test1
5  call test2 (2, 6, -2, 4, 13, 18)
6  call test3 (2, 6, -2, 4, 13, 18, 1, 1, 1)
7  call test4
8  call test5 (2, 6, -2, 4, 13, 18)
9  call test6 (2, 6, -2, 4, 13, 18, 1, 1, 1)
10contains
11  subroutine test1
12    integer :: i, j, k, a(1:7, -3:5, 12:19), m
13    logical :: l
14    l = .false.
15    a(:, :, :) = 0
16    !$omp parallel do collapse (3) lastprivate (i, j, k, m) reduction (.or.:l)
17      do i = 2, 6
18        do j = -2, 4
19          do k = 13, 18
20            l = l.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
21            l = l.or.k.lt.13.or.k.gt.18
22            if (.not.l) a(i, j, k) = a(i, j, k) + 1
23            m = i * 100 + j * 10 + k
24          end do
25        end do
26      end do
27    if (i.ne.7.or.j.ne.5.or.k.ne.19) stop 1
28    if (m.ne.(600+40+18)) stop 2
29    do i = 1, 7
30      do j = -3, 5
31        do k = 12, 19
32          if (i.eq.1.or.i.eq.7.or.j.eq.-3.or.j.eq.5.or.k.eq.12.or.k.eq.19) then
33            if (a(i, j, k).ne.0) print *, i, j, k
34          else
35            if (a(i, j, k).ne.1) print *, 'kk', i, j, k, a(i, j, k)
36          end if
37        end do
38      end do
39    end do
40  end subroutine test1
41
42  subroutine test2(v1, v2, v3, v4, v5, v6)
43    integer :: i, j, k, a(1:7, -3:5, 12:19), m
44    integer :: v1, v2, v3, v4, v5, v6
45    logical :: l
46    l = .false.
47    a(:, :, :) = 0
48    !$omp parallel do collapse (3) lastprivate (i, j, k, m) reduction (.or.:l)
49      do i = v1, v2
50        do j = v3, v4
51          do k = v5, v6
52            l = l.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
53            l = l.or.k.lt.13.or.k.gt.18
54            if (.not.l) a(i, j, k) = a(i, j, k) + 1
55            m = i * 100 + j * 10 + k
56          end do
57        end do
58      end do
59    if (i.ne.7.or.j.ne.5.or.k.ne.19) stop 3
60    if (m.ne.(600+40+18)) stop 4
61    do i = 1, 7
62      do j = -3, 5
63        do k = 12, 19
64          if (i.eq.1.or.i.eq.7.or.j.eq.-3.or.j.eq.5.or.k.eq.12.or.k.eq.19) then
65            if (a(i, j, k).ne.0) print *, i, j, k
66          else
67            if (a(i, j, k).ne.1) print *, 'kk', i, j, k, a(i, j, k)
68          end if
69        end do
70      end do
71    end do
72  end subroutine test2
73
74  subroutine test3(v1, v2, v3, v4, v5, v6, v7, v8, v9)
75    integer :: i, j, k, a(1:7, -3:5, 12:19), m
76    integer :: v1, v2, v3, v4, v5, v6, v7, v8, v9
77    logical :: l
78    l = .false.
79    a(:, :, :) = 0
80    !$omp parallel do collapse (3) lastprivate (i, j, k, m) reduction (.or.:l)
81      do i = v1, v2, v7
82        do j = v3, v4, v8
83          do k = v5, v6, v9
84            l = l.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
85            l = l.or.k.lt.13.or.k.gt.18
86            if (.not.l) a(i, j, k) = a(i, j, k) + 1
87            m = i * 100 + j * 10 + k
88          end do
89        end do
90      end do
91    if (i.ne.7.or.j.ne.5.or.k.ne.19) stop 5
92    if (m.ne.(600+40+18)) stop 6
93    do i = 1, 7
94      do j = -3, 5
95        do k = 12, 19
96          if (i.eq.1.or.i.eq.7.or.j.eq.-3.or.j.eq.5.or.k.eq.12.or.k.eq.19) then
97            if (a(i, j, k).ne.0) print *, i, j, k
98          else
99            if (a(i, j, k).ne.1) print *, 'kk', i, j, k, a(i, j, k)
100          end if
101        end do
102      end do
103    end do
104  end subroutine test3
105
106  subroutine test4
107    integer :: i, j, k, a(1:7, -3:5, 12:19), m
108    logical :: l
109    l = .false.
110    a(:, :, :) = 0
111    !$omp parallel do collapse (3) lastprivate (i, j, k, m) reduction (.or.:l) &
112    !$omp& schedule (dynamic, 5)
113      do i = 2, 6
114        do j = -2, 4
115          do k = 13, 18
116            l = l.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
117            l = l.or.k.lt.13.or.k.gt.18
118            if (.not.l) a(i, j, k) = a(i, j, k) + 1
119            m = i * 100 + j * 10 + k
120          end do
121        end do
122      end do
123    if (i.ne.7.or.j.ne.5.or.k.ne.19) stop 7
124    if (m.ne.(600+40+18)) stop 8
125    do i = 1, 7
126      do j = -3, 5
127        do k = 12, 19
128          if (i.eq.1.or.i.eq.7.or.j.eq.-3.or.j.eq.5.or.k.eq.12.or.k.eq.19) then
129            if (a(i, j, k).ne.0) print *, i, j, k
130          else
131            if (a(i, j, k).ne.1) print *, 'kk', i, j, k, a(i, j, k)
132          end if
133        end do
134      end do
135    end do
136  end subroutine test4
137
138  subroutine test5(v1, v2, v3, v4, v5, v6)
139    integer :: i, j, k, a(1:7, -3:5, 12:19), m
140    integer :: v1, v2, v3, v4, v5, v6
141    logical :: l
142    l = .false.
143    a(:, :, :) = 0
144    !$omp parallel do collapse (3) lastprivate (i, j, k, m) reduction (.or.:l) &
145    !$omp & schedule (guided)
146      do i = v1, v2
147        do j = v3, v4
148          do k = v5, v6
149            l = l.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
150            l = l.or.k.lt.13.or.k.gt.18
151            if (.not.l) a(i, j, k) = a(i, j, k) + 1
152            m = i * 100 + j * 10 + k
153          end do
154        end do
155      end do
156    if (i.ne.7.or.j.ne.5.or.k.ne.19) stop 9
157    if (m.ne.(600+40+18)) stop 10
158    do i = 1, 7
159      do j = -3, 5
160        do k = 12, 19
161          if (i.eq.1.or.i.eq.7.or.j.eq.-3.or.j.eq.5.or.k.eq.12.or.k.eq.19) then
162            if (a(i, j, k).ne.0) print *, i, j, k
163          else
164            if (a(i, j, k).ne.1) print *, 'kk', i, j, k, a(i, j, k)
165          end if
166        end do
167      end do
168    end do
169  end subroutine test5
170
171  subroutine test6(v1, v2, v3, v4, v5, v6, v7, v8, v9)
172    integer :: i, j, k, a(1:7, -3:5, 12:19), m
173    integer :: v1, v2, v3, v4, v5, v6, v7, v8, v9
174    logical :: l
175    l = .false.
176    a(:, :, :) = 0
177    !$omp parallel do collapse (3) lastprivate (i, j, k, m) reduction (.or.:l) &
178    !$omp & schedule (dynamic)
179      do i = v1, v2, v7
180        do j = v3, v4, v8
181          do k = v5, v6, v9
182            l = l.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
183            l = l.or.k.lt.13.or.k.gt.18
184            if (.not.l) a(i, j, k) = a(i, j, k) + 1
185            m = i * 100 + j * 10 + k
186          end do
187        end do
188      end do
189    if (i.ne.7.or.j.ne.5.or.k.ne.19) stop 11
190    if (m.ne.(600+40+18)) stop 12
191    do i = 1, 7
192      do j = -3, 5
193        do k = 12, 19
194          if (i.eq.1.or.i.eq.7.or.j.eq.-3.or.j.eq.5.or.k.eq.12.or.k.eq.19) then
195            if (a(i, j, k).ne.0) print *, i, j, k
196          else
197            if (a(i, j, k).ne.1) print *, 'kk', i, j, k, a(i, j, k)
198          end if
199        end do
200      end do
201    end do
202  end subroutine test6
203
204end program collapse3
205