1! This test checks lowering of OpenMP compound (combined and composite) loop 2! constructs. 3 4! RUN: bbc -fopenmp -emit-hlfir %s -o - | FileCheck %s 5! RUN: %flang_fc1 -fopenmp -emit-hlfir %s -o - | FileCheck %s 6 7program main 8 integer :: i,j 9 10 ! TODO When composite constructs are supported add: 11 ! - TASKLOOP SIMD 12 13 ! ---------------------------------------------------------------------------- 14 ! DISTRIBUTE PARALLEL DO 15 ! ---------------------------------------------------------------------------- 16 !$omp teams 17 18 ! CHECK: omp.parallel 19 ! CHECK: omp.distribute 20 ! CHECK-NEXT: omp.wsloop 21 ! CHECK-NEXT: omp.loop_nest 22 !$omp distribute parallel do 23 do i = 1, 10 24 end do 25 !$omp end distribute parallel do 26 27 !$omp end teams 28 29 ! ---------------------------------------------------------------------------- 30 ! DISTRIBUTE PARALLEL DO SIMD 31 ! ---------------------------------------------------------------------------- 32 !$omp teams 33 34 ! CHECK: omp.parallel 35 ! CHECK: omp.distribute 36 ! CHECK-NEXT: omp.wsloop 37 ! CHECK-NEXT: omp.simd 38 ! CHECK-NEXT: omp.loop_nest 39 !$omp distribute parallel do simd 40 do i = 1, 10 41 end do 42 !$omp end distribute parallel do simd 43 44 !$omp end teams 45 46 ! ---------------------------------------------------------------------------- 47 ! DISTRIBUTE SIMD 48 ! ---------------------------------------------------------------------------- 49 !$omp teams 50 51 ! CHECK: omp.distribute 52 ! CHECK-NEXT: omp.simd 53 ! CHECK-NEXT: omp.loop_nest 54 !$omp distribute simd 55 do i = 1, 10 56 end do 57 !$omp end distribute simd 58 59 !$omp end teams 60 61 ! ---------------------------------------------------------------------------- 62 ! DO SIMD 63 ! ---------------------------------------------------------------------------- 64 ! CHECK: omp.wsloop 65 ! CHECK-NEXT: omp.simd 66 ! CHECK-NEXT: omp.loop_nest 67 !$omp do simd 68 do i = 1, 10 69 end do 70 !$omp end do simd 71 72 ! ---------------------------------------------------------------------------- 73 ! PARALLEL DO SIMD 74 ! ---------------------------------------------------------------------------- 75 ! CHECK: omp.parallel 76 ! CHECK: omp.wsloop 77 ! CHECK-NEXT: omp.simd 78 ! CHECK-NEXT: omp.loop_nest 79 !$omp parallel do simd 80 do i = 1, 10 81 end do 82 !$omp end parallel do simd 83 84 ! ---------------------------------------------------------------------------- 85 ! PARALLEL DO 86 ! ---------------------------------------------------------------------------- 87 ! CHECK: omp.parallel 88 ! CHECK: omp.wsloop 89 ! CHECK-NEXT: omp.loop_nest 90 !$omp parallel do 91 do i = 1, 10 92 end do 93 !$omp end parallel do 94 95 ! ---------------------------------------------------------------------------- 96 ! TARGET PARALLEL DO SIMD 97 ! ---------------------------------------------------------------------------- 98 ! CHECK: omp.target 99 ! CHECK: omp.parallel 100 ! CHECK: omp.wsloop 101 ! CHECK-NEXT: omp.simd 102 ! CHECK-NEXT: omp.loop_nest 103 !$omp target parallel do simd 104 do i = 1, 10 105 end do 106 !$omp end target parallel do simd 107 108 ! ---------------------------------------------------------------------------- 109 ! TARGET PARALLEL DO 110 ! ---------------------------------------------------------------------------- 111 ! CHECK: omp.target 112 ! CHECK: omp.parallel 113 ! CHECK: omp.wsloop 114 ! CHECK-NEXT: omp.loop_nest 115 !$omp target parallel do 116 do i = 1, 10 117 end do 118 !$omp end target parallel do 119 120 ! ---------------------------------------------------------------------------- 121 ! TARGET SIMD 122 ! ---------------------------------------------------------------------------- 123 ! CHECK: omp.target 124 ! CHECK: omp.simd 125 ! CHECK-NEXT: omp.loop_nest 126 !$omp target simd 127 do i = 1, 10 128 end do 129 !$omp end target simd 130 131 ! ---------------------------------------------------------------------------- 132 ! TARGET TEAMS DISTRIBUTE 133 ! ---------------------------------------------------------------------------- 134 ! CHECK: omp.target 135 ! CHECK: omp.teams 136 ! CHECK: omp.distribute 137 ! CHECK-NEXT: omp.loop_nest 138 !$omp target teams distribute 139 do i = 1, 10 140 end do 141 !$omp end target teams distribute 142 143 ! ---------------------------------------------------------------------------- 144 ! TARGET TEAMS DISTRIBUTE PARALLEL DO 145 ! ---------------------------------------------------------------------------- 146 ! CHECK: omp.target 147 ! CHECK: omp.teams 148 ! CHECK: omp.parallel 149 ! CHECK: omp.distribute 150 ! CHECK-NEXT: omp.wsloop 151 ! CHECK-NEXT: omp.loop_nest 152 !$omp target teams distribute parallel do 153 do i = 1, 10 154 end do 155 !$omp end target teams distribute parallel do 156 157 ! ---------------------------------------------------------------------------- 158 ! TARGET TEAMS DISTRIBUTE PARALLEL DO SIMD 159 ! ---------------------------------------------------------------------------- 160 ! CHECK: omp.target 161 ! CHECK: omp.teams 162 ! CHECK: omp.parallel 163 ! CHECK: omp.distribute 164 ! CHECK-NEXT: omp.wsloop 165 ! CHECK-NEXT: omp.simd 166 ! CHECK-NEXT: omp.loop_nest 167 !$omp target teams distribute parallel do simd 168 do i = 1, 10 169 end do 170 !$omp end target teams distribute parallel do simd 171 172 ! ---------------------------------------------------------------------------- 173 ! TARGET TEAMS DISTRIBUTE SIMD 174 ! ---------------------------------------------------------------------------- 175 ! CHECK: omp.target 176 ! CHECK: omp.teams 177 ! CHECK: omp.distribute 178 ! CHECK-NEXT: omp.simd 179 ! CHECK-NEXT: omp.loop_nest 180 !$omp target teams distribute simd 181 do i = 1, 10 182 end do 183 !$omp end target teams distribute simd 184 185 ! ---------------------------------------------------------------------------- 186 ! TEAMS DISTRIBUTE 187 ! ---------------------------------------------------------------------------- 188 ! CHECK: omp.teams 189 ! CHECK: omp.distribute 190 ! CHECK-NEXT: omp.loop_nest 191 !$omp teams distribute 192 do i = 1, 10 193 end do 194 !$omp end teams distribute 195 196 ! ---------------------------------------------------------------------------- 197 ! TEAMS DISTRIBUTE PARALLEL DO 198 ! ---------------------------------------------------------------------------- 199 ! CHECK: omp.teams 200 ! CHECK: omp.parallel 201 ! CHECK: omp.distribute 202 ! CHECK-NEXT: omp.wsloop 203 ! CHECK-NEXT: omp.loop_nest 204 !$omp teams distribute parallel do 205 do i = 1, 10 206 end do 207 !$omp end teams distribute parallel do 208 209 ! ---------------------------------------------------------------------------- 210 ! TEAMS DISTRIBUTE PARALLEL DO SIMD 211 ! ---------------------------------------------------------------------------- 212 ! CHECK: omp.teams 213 ! CHECK: omp.parallel 214 ! CHECK: omp.distribute 215 ! CHECK-NEXT: omp.wsloop 216 ! CHECK-NEXT: omp.simd 217 ! CHECK-NEXT: omp.loop_nest 218 !$omp teams distribute parallel do simd 219 do i = 1, 10 220 end do 221 !$omp end teams distribute parallel do simd 222 223 ! ---------------------------------------------------------------------------- 224 ! TEAMS DISTRIBUTE SIMD 225 ! ---------------------------------------------------------------------------- 226 ! CHECK: omp.teams 227 ! CHECK: omp.distribute 228 ! CHECK-NEXT: omp.simd 229 ! CHECK-NEXT: omp.loop_nest 230 !$omp teams distribute simd 231 do i = 1, 10 232 end do 233 !$omp end teams distribute simd 234 235 ! ---------------------------------------------------------------------------- 236 ! Unstructured control-flow in loop 237 ! ---------------------------------------------------------------------------- 238 ! CHECK: omp.target 239 ! CHECK: omp.teams 240 ! CHECK: omp.parallel 241 ! CHECK: omp.distribute 242 ! CHECK-NEXT: omp.wsloop 243 ! CHECK-NEXT: omp.loop_nest 244 ! 245 ! Verify the conrol-flow of the unstructured inner loop. 246 ! CHECK: cf.br ^[[BB1:.*]] 247 ! CHECK: ^[[BB1]]: 248 ! CHECK: cf.br ^[[BB2:.*]] 249 ! CHECK: ^[[BB2]]: 250 ! CHECK: cf.cond_br %{{.*}}, ^[[BB3:.*]], ^[[BB6:.*]] 251 ! CHECK: ^[[BB3]]: 252 ! CHECK: cf.cond_br %{{.*}}, ^[[BB4:.*]], ^[[BB5:.*]] 253 ! CHECK: ^[[BB4]]: 254 ! CHECK: cf.br ^[[BB6]] 255 ! CHECK: ^[[BB5]]: 256 ! CHECK: cf.br ^[[BB2]] 257 ! CHECK: ^[[BB6]]: 258 ! CHECK-NEXT: omp.yield 259 !$omp target teams distribute parallel do 260 do i = 1, 10 261 outerloop: do j = i-1, i+i 262 if (j == i) then 263 exit outerloop 264 end if 265 end do outerloop 266 end do 267 !$omp end target teams distribute parallel do 268end program main 269