1! Exercise nested function decomposition, gcc/tree-nested.c.
2
3! { dg-do run }
4
5program collapse3
6  integer :: p1, p2, p3, p4, p5, p6, p7, p8, p9
7  p1 = 2
8  p2 = 6
9  p3 = -2
10  p4 = 4
11  p5 = 13
12  p6 = 18
13  p7 = 1
14  p8 = 1
15  p9 = 1
16  call test1
17  call test2 (p1, p2, p3, p4, p5, p6)
18  call test3 (p1, p2, p3, p4, p5, p6, p7, p8, p9)
19  call test4
20contains
21  subroutine test1
22    integer :: a(3,3,3), k, kk, kkk, l, ll, lll
23    !$acc parallel
24    !$acc loop collapse(3)
25      do 115 k=1,3
26dokk:   do kk=1,3
27          do kkk=1,3
28            a(k,kk,kkk) = 1
29          enddo
30        enddo dokk
31115   continue
32    !$acc end parallel
33    if (any(a(1:3,1:3,1:3).ne.1)) STOP 1
34    !$acc parallel
35    !$acc loop collapse(3)
36dol:  do 120 l=1,3
37doll:   do ll=1,3
38          do lll=1,3
39            a(l,ll,lll) = 2
40          enddo
41        enddo doll
42120   end do dol
43    !$acc end parallel
44    if (any(a(1:3,1:3,1:3).ne.2)) STOP 2
45    end subroutine test1
46
47  subroutine test2(v1, v2, v3, v4, v5, v6)
48    integer :: i, j, k, a(1:7, -3:5, 12:19), b(1:7, -3:5, 12:19)
49    integer :: v1, v2, v3, v4, v5, v6
50    logical :: l, r
51    l = .false.
52    r = .false.
53    a(:, :, :) = 0
54    b(:, :, :) = 0
55    !$acc parallel reduction (.or.:l)
56    !$acc loop reduction (.or.:l) collapse (3)
57      do i = v1, v2
58        do j = v3, v4
59          do k = v5, v6
60            l = l.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
61            l = l.or.k.lt.13.or.k.gt.18
62            if (.not.l) a(i, j, k) = a(i, j, k) + 1
63          end do
64        end do
65      end do
66    !$acc end parallel
67    do i = v1, v2
68      do j = v3, v4
69        do k = v5, v6
70          r = r.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
71          r = r.or.k.lt.13.or.k.gt.18
72          if (.not.l) b(i, j, k) = b(i, j, k) + 1
73        end do
74      end do
75    end do
76    if (l .neqv. r) STOP 3
77    do i = v1, v2
78      do j = v3, v4
79        do k = v5, v6
80           if (a(i, j, k) .ne. b(i, j, k)) STOP 4
81        end do
82      end do
83    end do
84  end subroutine test2
85
86  subroutine test3(v1, v2, v3, v4, v5, v6, v7, v8, v9)
87    integer :: i, j, k, a(1:7, -3:5, 12:19), b(1:7, -3:5, 12:19)
88    integer :: v1, v2, v3, v4, v5, v6, v7, v8, v9
89    logical :: l, r
90    l = .false.
91    r = .false.
92    a(:, :, :) = 0
93    b(:, :, :) = 0
94    !$acc parallel reduction (.or.:l)
95    !$acc loop reduction (.or.:l) collapse (3)
96      do i = v1, v2, v7
97        do j = v3, v4, v8
98          do k = v5, v6, v9
99            l = l.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
100            l = l.or.k.lt.13.or.k.gt.18
101            if (.not.l) a(i, j, k) = a(i, j, k) + 1
102          end do
103        end do
104      end do
105    !$acc end parallel
106    do i = v1, v2, v7
107      do j = v3, v4, v8
108        do k = v5, v6, v9
109          r = r.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
110          r = r.or.k.lt.13.or.k.gt.18
111          if (.not.l) b(i, j, k) = b(i, j, k) + 1
112        end do
113      end do
114    end do
115    if (l .neqv. r) STOP 5
116    do i = v1, v2, v7
117      do j = v3, v4, v8
118        do k = v5, v6, v9
119           if (a(i, j, k) .ne. b(i, j, k)) STOP 6
120        end do
121      end do
122    end do
123  end subroutine test3
124
125  subroutine test4
126    integer :: i, j, k, a(1:7, -3:5, 12:19), b(1:7, -3:5, 12:19)
127    integer :: v1, v2, v3, v4, v5, v6, v7, v8, v9
128    logical :: l, r
129    l = .false.
130    r = .false.
131    a(:, :, :) = 0
132    b(:, :, :) = 0
133    v1 = p1
134    v2 = p2
135    v3 = p3
136    v4 = p4
137    v5 = p5
138    v6 = p6
139    v7 = p7
140    v8 = p8
141    v9 = p9
142    !$acc parallel reduction (.or.:l)
143    !$acc loop reduction (.or.:l) collapse (3)
144      do i = v1, v2, v7
145        do j = v3, v4, v8
146          do k = v5, v6, v9
147            l = l.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
148            l = l.or.k.lt.13.or.k.gt.18
149            if (.not.l) a(i, j, k) = a(i, j, k) + 1
150          end do
151        end do
152      end do
153    !$acc end parallel
154    do i = v1, v2, v7
155      do j = v3, v4, v8
156        do k = v5, v6, v9
157          r = r.or.i.lt.2.or.i.gt.6.or.j.lt.-2.or.j.gt.4
158          r = r.or.k.lt.13.or.k.gt.18
159          if (.not.r) b(i, j, k) = b(i, j, k) + 1
160        end do
161      end do
162    end do
163    if (l .neqv. r) STOP 7
164    do i = v1, v2, v7
165      do j = v3, v4, v8
166         do k = v5, v6, v9
167           if (a(i, j, k) .ne. b(i, j, k)) STOP 8
168         end do
169      end do
170    end do
171  end subroutine test4
172
173end program collapse3
174