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