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