1! Exercise nested function decomposition, gcc/tree-nested.c.
2
3! { dg-do run }
4
5program sub_collapse_3
6  call test1
7  call test2 (2, 6, -2, 4, 13, 18)
8  call test3 (2, 6, -2, 4, 13, 18, 1, 1, 1)
9  call test4
10  call test5 (2, 6, -2, 4, 13, 18)
11  call test6 (2, 6, -2, 4, 13, 18, 1, 1, 1)
12contains
13  subroutine test1
14    integer :: a(3,3,3), k, kk, kkk, l, ll, lll
15    !$acc parallel
16    !$acc loop collapse(3)
17      do 115 k=1,3
18dokk:   do kk=1,3
19          do kkk=1,3
20            a(k,kk,kkk) = 1
21          enddo
22        enddo dokk
23115   continue
24    !$acc end parallel
25    if (any(a(1:3,1:3,1:3).ne.1)) STOP 1
26    !$acc parallel
27    !$acc loop collapse(3)
28dol:  do 120 l=1,3
29doll:   do ll=1,3
30          do lll=1,3
31            a(l,ll,lll) = 2
32          enddo
33        enddo doll
34120   end do dol
35    !$acc end parallel
36    if (any(a(1:3,1:3,1:3).ne.2)) STOP 2
37  end subroutine test1
38
39  subroutine test2(v1, v2, v3, v4, v5, v6)
40    integer :: i, j, k, a(1:7, -3:5, 12:19), b(1:7, -3:5, 12:19)
41    integer :: v1, v2, v3, v4, v5, v6
42    logical :: l, r
43    l = .false.
44    r = .false.
45    a(:, :, :) = 0
46    b(:, :, :) = 0
47    !$acc parallel pcopyin (v1, v2, v3, v4, v5, v6) reduction (.or.:l)
48    !$acc loop reduction (.or.:l) collapse (3)
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          end do
56        end do
57      end do
58    !$acc end parallel
59    do i = v1, v2
60      do j = v3, v4
61        do k = v5, v6
62          r = r.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
63          r = r.or.k.lt.13.or.k.gt.18
64          if (.not.l) b(i, j, k) = b(i, j, k) + 1
65        end do
66      end do
67    end do
68    if (l .neqv. r) STOP 3
69    do i = v1, v2
70      do j = v3, v4
71        do k = v5, v6
72           if (a(i, j, k) .ne. b(i, j, k)) STOP 4
73        end do
74      end do
75    end do
76  end subroutine test2
77
78  subroutine test3(v1, v2, v3, v4, v5, v6, v7, v8, v9)
79    integer :: i, j, k, a(1:7, -3:5, 12:19), b(1:7, -3:5, 12:19)
80    integer :: v1, v2, v3, v4, v5, v6, v7, v8, v9
81    logical :: l, r
82    l = .false.
83    r = .false.
84    a(:, :, :) = 0
85    b(:, :, :) = 0
86    !$acc parallel pcopyin (v1, v2, v3, v4, v5, v6, v7, v8, v9) reduction (.or.:l)
87    !$acc loop reduction (.or.:l) collapse (3)
88      do i = v1, v2, v7
89        do j = v3, v4, v8
90          do k = v5, v6, v9
91            l = l.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
92            l = l.or.k.lt.13.or.k.gt.18
93            if (.not.l) a(i, j, k) = a(i, j, k) + 1
94          end do
95        end do
96      end do
97    !$acc end parallel
98    do i = v1, v2, v7
99      do j = v3, v4, v8
100        do k = v5, v6, v9
101          r = r.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
102          r = r.or.k.lt.13.or.k.gt.18
103          if (.not.l) b(i, j, k) = b(i, j, k) + 1
104        end do
105      end do
106    end do
107    if (l .neqv. r) STOP 5
108    do i = v1, v2, v7
109      do j = v3, v4, v8
110        do k = v5, v6, v9
111           if (a(i, j, k) .ne. b(i, j, k)) STOP 6
112        end do
113      end do
114    end do
115  end subroutine test3
116
117  subroutine test4
118    integer :: i, j, k, a(1:7, -3:5, 12:19), b(1:7, -3:5, 12:19)
119    integer :: v1, v2, v3, v4, v5, v6, v7, v8, v9
120    logical :: l, r
121    l = .false.
122    r = .false.
123    a(:, :, :) = 0
124    b(:, :, :) = 0
125    v1 = 2
126    v2 = 6
127    v3 = -2
128    v4 = 4
129    v5 = 13
130    v6 = 18
131    v7 = 1
132    v8 = 1
133    v9 = 1
134    !$acc parallel pcopyin (v1, v2, v3, v4, v5, v6, v7, v8, v9) reduction (.or.:l)
135    !$acc loop reduction (.or.:l) collapse (3)
136      do i = v1, v2, v7
137        do j = v3, v4, v8
138          do k = v5, v6, v9
139            l = l.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
140            l = l.or.k.lt.13.or.k.gt.18
141            if (.not.l) a(i, j, k) = a(i, j, k) + 1
142          end do
143        end do
144      end do
145    !$acc end parallel
146    do i = v1, v2, v7
147      do j = v3, v4, v8
148        do k = v5, v6, v9
149          r = r.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
150          r = r.or.k.lt.13.or.k.gt.18
151          if (.not.r) b(i, j, k) = b(i, j, k) + 1
152        end do
153      end do
154    end do
155    if (l .neqv. r) STOP 7
156    do i = v1, v2, v7
157      do j = v3, v4, v8
158         do k = v5, v6, v9
159           if (a(i, j, k) .ne. b(i, j, k)) STOP 8
160         end do
161      end do
162    end do
163  end subroutine test4
164
165  subroutine test5(v1, v2, v3, v4, v5, v6)
166    integer :: i, j, k, a(1:7, -3:5, 12:19), b(1:7, -3:5, 12:19)
167    integer :: v1, v2, v3, v4, v5, v6
168    logical :: l, r
169    l = .false.
170    r = .false.
171    a(:, :, :) = 0
172    b(:, :, :) = 0
173    !$acc parallel pcopyin (v1, v2, v3, v4, v5, v6) reduction (.or.:l)
174    !$acc loop reduction (.or.:l) collapse (3)
175      do i = v1, v2
176        do j = v3, v4
177          do k = v5, v6
178            l = l.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
179            l = l.or.k.lt.13.or.k.gt.18
180            if (.not.l) a(i, j, k) = a(i, j, k) + 1
181          end do
182        end do
183      end do
184    !$acc end parallel
185    do i = v1, v2
186      do j = v3, v4
187        do k = v5, v6
188          r = r.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
189          r = r.or.k.lt.13.or.k.gt.18
190          if (.not.r) b(i, j, k) = b(i, j, k) + 1
191        end do
192      end do
193    end do
194    if (l .neqv. r) STOP 9
195    do i = v1, v2
196      do j = v3, v4
197        do k = v5, v6
198           if (a(i, j, k) .ne. b(i, j, k)) STOP 10
199        end do
200      end do
201    end do
202  end subroutine test5
203
204  subroutine test6(v1, v2, v3, v4, v5, v6, v7, v8, v9)
205    integer :: i, j, k, a(1:7, -3:5, 12:19), b(1:7, -3:5, 12:19)
206    integer :: v1, v2, v3, v4, v5, v6, v7, v8, v9
207    logical :: l, r
208    l = .false.
209    r = .false.
210    a(:, :, :) = 0
211    b(:, :, :) = 0
212    !$acc parallel pcopyin (v1, v2, v3, v4, v5, v6, v7, v8, v9) reduction (.or.:l)
213    !$acc loop reduction (.or.:l) collapse (3)
214      do i = v1, v2, v7
215        do j = v3, v4, v8
216          do k = v5, v6, v9
217            l = l.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
218            l = l.or.k.lt.13.or.k.gt.18
219            if (.not.l) a(i, j, k) = a(i, j, k) + 1
220            m = i * 100 + j * 10 + k
221          end do
222        end do
223      end do
224    !$acc end parallel
225    do i = v1, v2, v7
226      do j = v3, v4, v8
227        do k = v5, v6, v9
228          r = r.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
229          r = r.or.k.lt.13.or.k.gt.18
230          if (.not.r) b(i, j, k) = b(i, j, k) + 1
231        end do
232      end do
233    end do
234    if (l .neqv. r) STOP 11
235    do i = v1, v2, v7
236      do j = v3, v4, v8
237        do k = v5, v6, v9
238           if (a(i, j, k) .ne. b(i, j, k)) STOP 12
239        end do
240      end do
241    end do
242  end subroutine test6
243
244end program sub_collapse_3
245