744 lines · plain
1! This test checks lowering of OpenACC parallel loop combined directive.2 3! RUN: bbc -fopenacc -emit-hlfir %s -o - | FileCheck %s4 5! CHECK-LABEL: func.func @_QPacc_parallel_loop()6 7subroutine acc_parallel_loop8 integer :: i, j9 10 integer :: async = 111 integer :: wait1 = 112 integer :: wait2 = 213 integer :: numGangs = 114 integer :: numWorkers = 1015 integer :: vectorLength = 12816 logical :: ifCondition = .TRUE.17 integer, parameter :: n = 1018 real, dimension(n) :: a, b, c19 real, dimension(n, n) :: d, e20 real, pointer :: f, g21 integer :: reduction_i22 real :: reduction_r23 24 integer :: gangNum = 825 integer :: gangStatic = 826 integer :: vectorNum = 12827 integer, parameter :: tileSize = 228 29! CHECK: %[[A:.*]] = fir.alloca !fir.array<10xf32> {{{.*}}uniq_name = "{{.*}}Ea"}30! CHECK: %[[DECLA:.*]]:2 = hlfir.declare %[[A]]31! CHECK: %[[B:.*]] = fir.alloca !fir.array<10xf32> {{{.*}}uniq_name = "{{.*}}Eb"}32! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]]33! CHECK: %[[C:.*]] = fir.alloca !fir.array<10xf32> {{{.*}}uniq_name = "{{.*}}Ec"}34! CHECK: %[[DECLC:.*]]:2 = hlfir.declare %[[C]]35! CHECK: %[[F:.*]] = fir.alloca !fir.box<!fir.ptr<f32>> {bindc_name = "f", uniq_name = "{{.*}}Ef"}36! CHECK: %[[DECLF:.*]]:2 = hlfir.declare %[[F]]37! CHECK: %[[G:.*]] = fir.alloca !fir.box<!fir.ptr<f32>> {bindc_name = "g", uniq_name = "{{.*}}Eg"}38! CHECK: %[[DECLG:.*]]:2 = hlfir.declare %[[G]]39! CHECK: %[[IFCONDITION:.*]] = fir.address_of(@{{.*}}ifcondition) : !fir.ref<!fir.logical<4>>40! CHECK: %[[DECLIFCONDITION:.*]]:2 = hlfir.declare %[[IFCONDITION]]41 42 !$acc parallel43 !$acc loop44 DO i = 1, n45 a(i) = b(i)46 END DO47 !$acc end parallel48 49! CHECK: acc.parallel {50! CHECK: acc.loop private{{.*}} {51! CHECK: acc.yield52! CHECK-NEXT: } attributes {{{.*}}independent = [#acc.device_type<none>]}53! CHECK: acc.yield54! CHECK-NEXT: }{{$}}55 56 !$acc parallel loop57 DO i = 1, n58 a(i) = b(i)59 END DO60 61! CHECK: acc.parallel combined(loop) {62! CHECK: acc.loop combined(parallel) private{{.*}} {63! CHECK: acc.yield64! CHECK-NEXT: } attributes {{{.*}}independent = [#acc.device_type<none>]}65! CHECK: acc.yield66! CHECK-NEXT: }{{$}}67 68 !$acc parallel loop async69 DO i = 1, n70 a(i) = b(i)71 END DO72 !$acc end parallel loop73 74! CHECK: acc.parallel {{.*}} async {75! CHECK: acc.loop {{.*}} {76! CHECK: acc.yield77! CHECK-NEXT: }{{$}}78! CHECK: acc.yield79! CHECK-NEXT: }80 81 !$acc parallel loop async(1)82 DO i = 1, n83 a(i) = b(i)84 END DO85 86! CHECK: [[ASYNC1:%.*]] = arith.constant 1 : i3287! CHECK: acc.parallel {{.*}} async([[ASYNC1]] : i32) {88! CHECK: acc.loop {{.*}} {89! CHECK: acc.yield90! CHECK-NEXT: }{{$}}91! CHECK: acc.yield92! CHECK-NEXT: }{{$}}93 94 !$acc parallel loop async(async)95 DO i = 1, n96 a(i) = b(i)97 END DO98 99! CHECK: [[ASYNC2:%.*]] = fir.load %{{.*}} : !fir.ref<i32>100! CHECK: acc.parallel {{.*}} async([[ASYNC2]] : i32) {101! CHECK: acc.loop {{.*}} {102! CHECK: acc.yield103! CHECK-NEXT: }{{$}}104! CHECK: acc.yield105! CHECK-NEXT: }{{$}}106 107 !$acc parallel loop async(async) device_type(nvidia) async(1)108 DO i = 1, n109 a(i) = b(i)110 END DO111! CHECK: acc.parallel combined(loop) async(%{{.*}} : i32, %c1{{.*}} : i32 [#acc.device_type<nvidia>])112 113 !$acc parallel loop wait114 DO i = 1, n115 a(i) = b(i)116 END DO117 118! CHECK: acc.parallel {{.*}} wait {119! CHECK: acc.loop {{.*}} {120! CHECK: acc.yield121! CHECK-NEXT: }{{$}}122! CHECK: acc.yield123! CHECK-NEXT: }124 125 !$acc parallel loop wait(1)126 DO i = 1, n127 a(i) = b(i)128 END DO129 130! CHECK: [[WAIT1:%.*]] = arith.constant 1 : i32131! CHECK: acc.parallel {{.*}} wait({[[WAIT1]] : i32}) {132! CHECK: acc.loop133! CHECK: acc.yield134! CHECK-NEXT: }{{$}}135! CHECK: acc.yield136! CHECK-NEXT: }{{$}}137 138 !$acc parallel loop wait(1, 2)139 DO i = 1, n140 a(i) = b(i)141 END DO142 143! CHECK: [[WAIT2:%.*]] = arith.constant 1 : i32144! CHECK: [[WAIT3:%.*]] = arith.constant 2 : i32145! CHECK: acc.parallel {{.*}} wait({[[WAIT2]] : i32, [[WAIT3]] : i32}) {146! CHECK: acc.loop147! CHECK: acc.yield148! CHECK-NEXT: }{{$}}149! CHECK: acc.yield150! CHECK-NEXT: }{{$}}151 152 !$acc parallel loop wait(wait1, wait2)153 DO i = 1, n154 a(i) = b(i)155 END DO156 157! CHECK: [[WAIT4:%.*]] = fir.load %{{.*}} : !fir.ref<i32>158! CHECK: [[WAIT5:%.*]] = fir.load %{{.*}} : !fir.ref<i32>159! CHECK: acc.parallel {{.*}} wait({[[WAIT4]] : i32, [[WAIT5]] : i32}) {160! CHECK: acc.loop161! CHECK: acc.yield162! CHECK-NEXT: }{{$}}163! CHECK: acc.yield164! CHECK-NEXT: }{{$}}165 166 !$acc parallel loop num_gangs(1)167 DO i = 1, n168 a(i) = b(i)169 END DO170 171! CHECK: [[NUMGANGS1:%.*]] = arith.constant 1 : i32172! CHECK: acc.parallel {{.*}} num_gangs({[[NUMGANGS1]] : i32}) {173! CHECK: acc.loop174! CHECK: acc.yield175! CHECK-NEXT: }{{$}}176! CHECK: acc.yield177! CHECK-NEXT: }{{$}}178 179 !$acc parallel loop num_gangs(numGangs)180 DO i = 1, n181 a(i) = b(i)182 END DO183 184! CHECK: [[NUMGANGS2:%.*]] = fir.load %{{.*}} : !fir.ref<i32>185! CHECK: acc.parallel {{.*}} num_gangs({[[NUMGANGS2]] : i32}) {186! CHECK: acc.loop187! CHECK: acc.yield188! CHECK-NEXT: }{{$}}189! CHECK: acc.yield190! CHECK-NEXT: }{{$}}191 192 !$acc parallel loop num_workers(10)193 DO i = 1, n194 a(i) = b(i)195 END DO196 197! CHECK: [[NUMWORKERS1:%.*]] = arith.constant 10 : i32198! CHECK: acc.parallel {{.*}} num_workers([[NUMWORKERS1]] : i32) {199! CHECK: acc.loop {{.*}} {200! CHECK: acc.yield201! CHECK-NEXT: }{{$}}202! CHECK: acc.yield203! CHECK-NEXT: }{{$}}204 205 !$acc parallel loop num_workers(numWorkers)206 DO i = 1, n207 a(i) = b(i)208 END DO209 210! CHECK: [[NUMWORKERS2:%.*]] = fir.load %{{.*}} : !fir.ref<i32>211! CHECK: acc.parallel {{.*}} num_workers([[NUMWORKERS2]] : i32) {212! CHECK: acc.loop {{.*}} {213! CHECK: acc.yield214! CHECK-NEXT: }{{$}}215! CHECK: acc.yield216! CHECK-NEXT: }{{$}}217 218 !$acc parallel loop vector_length(128)219 DO i = 1, n220 a(i) = b(i)221 END DO222 223! CHECK: [[VECTORLENGTH1:%.*]] = arith.constant 128 : i32224! CHECK: acc.parallel {{.*}} vector_length([[VECTORLENGTH1]] : i32) {225! CHECK: acc.loop {{.*}} {226! CHECK: acc.yield227! CHECK-NEXT: }{{$}}228! CHECK: acc.yield229! CHECK-NEXT: }{{$}}230 231 !$acc parallel loop vector_length(vectorLength)232 DO i = 1, n233 a(i) = b(i)234 END DO235 236! CHECK: [[VECTORLENGTH2:%.*]] = fir.load %{{.*}} : !fir.ref<i32>237! CHECK: acc.parallel {{.*}} vector_length([[VECTORLENGTH2]] : i32) {238! CHECK: acc.loop {{.*}} {239! CHECK: acc.yield240! CHECK-NEXT: }{{$}}241! CHECK: acc.yield242! CHECK-NEXT: }{{$}}243 244 !$acc parallel loop if(.TRUE.)245 DO i = 1, n246 a(i) = b(i)247 END DO248 249! CHECK: [[IF1:%.*]] = arith.constant true250! CHECK: acc.parallel {{.*}} if([[IF1]]) {251! CHECK: acc.loop {{.*}} {252! CHECK: acc.yield253! CHECK-NEXT: }{{$}}254! CHECK: acc.yield255! CHECK-NEXT: }{{$}}256 257 !$acc parallel loop if(ifCondition)258 DO i = 1, n259 a(i) = b(i)260 END DO261 262! CHECK: [[IFCOND:%.*]] = fir.load %{{.*}} : !fir.ref<!fir.logical<4>>263! CHECK: [[IF2:%.*]] = fir.convert [[IFCOND]] : (!fir.logical<4>) -> i1264! CHECK: acc.parallel {{.*}} if([[IF2]]) {265! CHECK: acc.loop {{.*}} {266! CHECK: acc.yield267! CHECK-NEXT: }{{$}}268! CHECK: acc.yield269! CHECK-NEXT: }{{$}}270 271 !$acc parallel loop self(.TRUE.)272 DO i = 1, n273 a(i) = b(i)274 END DO275 276! CHECK: [[SELF1:%.*]] = arith.constant true277! CHECK: acc.parallel {{.*}} self([[SELF1]]) {278! CHECK: acc.loop {{.*}} {279! CHECK: acc.yield280! CHECK-NEXT: }{{$}}281! CHECK: acc.yield282! CHECK-NEXT: }{{$}}283 284 !$acc parallel loop self285 DO i = 1, n286 a(i) = b(i)287 END DO288 289! CHECK: acc.parallel {{.*}} {290! CHECK: acc.loop {{.*}} {291! CHECK: acc.yield292! CHECK-NEXT: }{{$}}293! CHECK: acc.yield294! CHECK-NEXT: } attributes {selfAttr}295 296 !$acc parallel loop self(ifCondition)297 DO i = 1, n298 a(i) = b(i)299 END DO300 301! CHECK: %[[SELF2:.*]] = fir.convert %[[DECLIFCONDITION]]#0 : (!fir.ref<!fir.logical<4>>) -> i1302! CHECK: acc.parallel {{.*}} self(%[[SELF2]]) {303! CHECK: acc.loop {{.*}} {304! CHECK: acc.yield305! CHECK-NEXT: }{{$}}306! CHECK: acc.yield307! CHECK-NEXT: }{{$}}308 309 !$acc parallel loop copy(a, b)310 DO i = 1, n311 a(i) = b(i)312 END DO313 314! CHECK: %[[COPYIN_A:.*]] = acc.copyin varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10xf32>>) -> !fir.ref<!fir.array<10xf32>> {dataClause = #acc<data_clause acc_copy>, name = "a"}315! CHECK: %[[COPYIN_B:.*]] = acc.copyin varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10xf32>>) -> !fir.ref<!fir.array<10xf32>> {dataClause = #acc<data_clause acc_copy>, name = "b"}316! CHECK: acc.parallel {{.*}} dataOperands(%[[COPYIN_A]], %[[COPYIN_B]] : !fir.ref<!fir.array<10xf32>>, !fir.ref<!fir.array<10xf32>>) {317! CHECK: acc.loop {{.*}} {318! CHECK: acc.yield319! CHECK-NEXT: }{{$}}320! CHECK: acc.yield321! CHECK-NEXT: }{{$}}322! CHECK: acc.copyout accPtr(%[[COPYIN_A]] : !fir.ref<!fir.array<10xf32>>) to varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_copy>, name = "a"}323! CHECK: acc.copyout accPtr(%[[COPYIN_B]] : !fir.ref<!fir.array<10xf32>>) to varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_copy>, name = "b"}324 325 !$acc parallel loop copy(a) copy(b)326 DO i = 1, n327 a(i) = b(i)328 END DO329 330! CHECK: %[[COPYIN_A:.*]] = acc.copyin varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10xf32>>) -> !fir.ref<!fir.array<10xf32>> {dataClause = #acc<data_clause acc_copy>, name = "a"}331! CHECK: %[[COPYIN_B:.*]] = acc.copyin varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10xf32>>) -> !fir.ref<!fir.array<10xf32>> {dataClause = #acc<data_clause acc_copy>, name = "b"}332! CHECK: acc.parallel {{.*}} dataOperands(%[[COPYIN_A]], %[[COPYIN_B]] : !fir.ref<!fir.array<10xf32>>, !fir.ref<!fir.array<10xf32>>) {333! CHECK: acc.loop {{.*}} {334! CHECK: acc.yield335! CHECK-NEXT: }{{$}}336! CHECK: acc.yield337! CHECK-NEXT: }{{$}}338! CHECK: acc.copyout accPtr(%[[COPYIN_A]] : !fir.ref<!fir.array<10xf32>>) to varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_copy>, name = "a"}339! CHECK: acc.copyout accPtr(%[[COPYIN_B]] : !fir.ref<!fir.array<10xf32>>) to varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_copy>, name = "b"}340 341 !$acc parallel loop copyin(a) copyin(readonly: b)342 DO i = 1, n343 a(i) = b(i)344 END DO345 346! CHECK: %[[COPYIN_A:.*]] = acc.copyin varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10xf32>>) -> !fir.ref<!fir.array<10xf32>> {name = "a"}347! CHECK: %[[COPYIN_B:.*]] = acc.copyin varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10xf32>>) -> !fir.ref<!fir.array<10xf32>> {dataClause = #acc<data_clause acc_copyin_readonly>, name = "b"}348! CHECK: acc.parallel {{.*}} dataOperands(%[[COPYIN_A]], %[[COPYIN_B]] : !fir.ref<!fir.array<10xf32>>, !fir.ref<!fir.array<10xf32>>) {349! CHECK: acc.loop {{.*}} {350! CHECK: acc.yield351! CHECK-NEXT: }{{$}}352! CHECK: acc.yield353! CHECK-NEXT: }{{$}}354! CHECK: acc.delete accPtr(%[[COPYIN_A]] : !fir.ref<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_copyin>, name = "a"}355! CHECK: acc.delete accPtr(%[[COPYIN_B]] : !fir.ref<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_copyin_readonly>, name = "b"}356 357 !$acc parallel loop copyout(a) copyout(zero: b)358 DO i = 1, n359 a(i) = b(i)360 END DO361 362! CHECK: %[[CREATE_A:.*]] = acc.create varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10xf32>>) -> !fir.ref<!fir.array<10xf32>> {dataClause = #acc<data_clause acc_copyout>, name = "a"}363! CHECK: %[[CREATE_B:.*]] = acc.create varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10xf32>>) -> !fir.ref<!fir.array<10xf32>> {dataClause = #acc<data_clause acc_copyout_zero>, name = "b"}364! CHECK: acc.parallel {{.*}} dataOperands(%[[CREATE_A]], %[[CREATE_B]] : !fir.ref<!fir.array<10xf32>>, !fir.ref<!fir.array<10xf32>>) {365! CHECK: acc.loop {{.*}} {366! CHECK: acc.yield367! CHECK-NEXT: }{{$}}368! CHECK: acc.yield369! CHECK-NEXT: }{{$}}370! CHECK: acc.copyout accPtr(%[[CREATE_A]] : !fir.ref<!fir.array<10xf32>>) to varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10xf32>>) {name = "a"}371! CHECK: acc.copyout accPtr(%[[CREATE_B]] : !fir.ref<!fir.array<10xf32>>) to varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_copyout_zero>, name = "b"}372 373 !$acc parallel loop create(b) create(zero: a)374 DO i = 1, n375 a(i) = b(i)376 END DO377 378! CHECK: %[[CREATE_B:.*]] = acc.create varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10xf32>>) -> !fir.ref<!fir.array<10xf32>> {name = "b"}379! CHECK: %[[CREATE_A:.*]] = acc.create varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10xf32>>) -> !fir.ref<!fir.array<10xf32>> {dataClause = #acc<data_clause acc_create_zero>, name = "a"}380! CHECK: acc.parallel {{.*}} dataOperands(%[[CREATE_B]], %[[CREATE_A]] : !fir.ref<!fir.array<10xf32>>, !fir.ref<!fir.array<10xf32>>) {381! CHECK: acc.loop {{.*}} {382! CHECK: acc.yield383! CHECK-NEXT: }{{$}}384! CHECK: acc.yield385! CHECK-NEXT: }{{$}}386! CHECK: acc.delete accPtr(%[[CREATE_B]] : !fir.ref<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_create>, name = "b"}387! CHECK: acc.delete accPtr(%[[CREATE_A]] : !fir.ref<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_create_zero>, name = "a"}388 389 !$acc parallel loop no_create(a, b)390 DO i = 1, n391 a(i) = b(i)392 END DO393 394! CHECK: %[[NOCREATE_A:.*]] = acc.nocreate varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10xf32>>) -> !fir.ref<!fir.array<10xf32>> {name = "a"}395! CHECK: %[[NOCREATE_B:.*]] = acc.nocreate varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10xf32>>) -> !fir.ref<!fir.array<10xf32>> {name = "b"}396! CHECK: acc.parallel {{.*}} dataOperands(%[[NOCREATE_A]], %[[NOCREATE_B]] : !fir.ref<!fir.array<10xf32>>, !fir.ref<!fir.array<10xf32>>) {397! CHECK: acc.loop {{.*}} {398! CHECK: acc.yield399! CHECK-NEXT: }{{$}}400! CHECK: acc.yield401! CHECK-NEXT: }{{$}}402! CHECK: acc.delete accPtr(%[[NOCREATE_A]] : !fir.ref<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_no_create>, name = "a"}403! CHECK: acc.delete accPtr(%[[NOCREATE_B]] : !fir.ref<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_no_create>, name = "b"}404 405 !$acc parallel loop present(a, b)406 DO i = 1, n407 a(i) = b(i)408 END DO409 410! CHECK: %[[PRESENT_A:.*]] = acc.present varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10xf32>>) -> !fir.ref<!fir.array<10xf32>> {name = "a"}411! CHECK: %[[PRESENT_B:.*]] = acc.present varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10xf32>>) -> !fir.ref<!fir.array<10xf32>> {name = "b"}412! CHECK: acc.parallel {{.*}} dataOperands(%[[PRESENT_A]], %[[PRESENT_B]] : !fir.ref<!fir.array<10xf32>>, !fir.ref<!fir.array<10xf32>>) {413! CHECK: acc.loop {{.*}} {414! CHECK: acc.yield415! CHECK-NEXT: }{{$}}416! CHECK: acc.yield417! CHECK-NEXT: }{{$}}418! CHECK: acc.delete accPtr(%[[PRESENT_A]] : !fir.ref<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_present>, name = "a"}419! CHECK: acc.delete accPtr(%[[PRESENT_B]] : !fir.ref<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_present>, name = "b"}420 421 !$acc parallel loop deviceptr(a) deviceptr(b)422 DO i = 1, n423 a(i) = b(i)424 END DO425 426! CHECK: %[[DEVICEPTR_A:.*]] = acc.deviceptr varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10xf32>>) -> !fir.ref<!fir.array<10xf32>> {name = "a"}427! CHECK: %[[DEVICEPTR_B:.*]] = acc.deviceptr varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10xf32>>) -> !fir.ref<!fir.array<10xf32>> {name = "b"}428! CHECK: acc.parallel {{.*}} dataOperands(%[[DEVICEPTR_A]], %[[DEVICEPTR_B]] : !fir.ref<!fir.array<10xf32>>, !fir.ref<!fir.array<10xf32>>) {429! CHECK: acc.loop {{.*}} {430! CHECK: acc.yield431! CHECK-NEXT: }{{$}}432! CHECK: acc.yield433! CHECK-NEXT: }{{$}}434 435 !$acc parallel loop attach(f, g)436 DO i = 1, n437 a(i) = b(i)438 END DO439 440! CHECK: %[[ATTACH_F:.*]] = acc.attach varPtr(%[[DECLF]]#0 : !fir.ref<!fir.box<!fir.ptr<f32>>>) -> !fir.ref<!fir.box<!fir.ptr<f32>>> {name = "f"}441! CHECK: %[[ATTACH_G:.*]] = acc.attach varPtr(%[[DECLG]]#0 : !fir.ref<!fir.box<!fir.ptr<f32>>>) -> !fir.ref<!fir.box<!fir.ptr<f32>>> {name = "g"}442! CHECK: acc.parallel {{.*}} dataOperands(%[[ATTACH_F]], %[[ATTACH_G]] : !fir.ref<!fir.box<!fir.ptr<f32>>>, !fir.ref<!fir.box<!fir.ptr<f32>>>) {443! CHECK: acc.loop {{.*}} {444! CHECK: acc.yield445! CHECK-NEXT: }{{$}}446! CHECK: acc.yield447! CHECK-NEXT: }{{$}}448 449 !$acc parallel loop private(a) firstprivate(b)450 DO i = 1, n451 a(i) = b(i)452 END DO453 454! CHECK: %[[ACC_PRIVATE_B:.*]] = acc.firstprivate varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10xf32>>) recipe(@firstprivatization_ref_10xf32) -> !fir.ref<!fir.array<10xf32>> {name = "b"}455! CHECK: acc.parallel {{.*}} firstprivate(%[[ACC_PRIVATE_B]] : !fir.ref<!fir.array<10xf32>>) {456! CHECK: %[[ACC_PRIVATE_A:.*]] = acc.private varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10xf32>>) recipe(@privatization_ref_10xf32) -> !fir.ref<!fir.array<10xf32>> {name = "a"}457! CHECK: acc.loop {{.*}} private(%[[ACC_PRIVATE_A]]{{.*}} : !fir.ref<!fir.array<10xf32>>{{.*}})458! CHECK-NOT: fir.do_loop459! CHECK: acc.yield460! CHECK-NEXT: }{{$}}461! CHECK: acc.yield462! CHECK-NEXT: }{{$}}463 464 !$acc parallel loop seq465 DO i = 1, n466 a(i) = b(i)467 END DO468 469! CHECK: acc.parallel {{.*}} {470! CHECK: acc.loop {{.*}} {471! CHECK: acc.yield472! CHECK-NEXT: } attributes {inclusiveUpperbound = array<i1: true>, seq = [#acc.device_type<none>]}473! CHECK: acc.yield474! CHECK-NEXT: }{{$}}475 476 !$acc parallel loop auto477 DO i = 1, n478 a(i) = b(i)479 END DO480 481! CHECK: acc.parallel {{.*}} {482! CHECK: acc.loop {{.*}} {483! CHECK: acc.yield484! CHECK-NEXT: } attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}485! CHECK: acc.yield486! CHECK-NEXT: }{{$}}487 488 !$acc parallel loop independent489 DO i = 1, n490 a(i) = b(i)491 END DO492 493! CHECK: acc.parallel {{.*}} {494! CHECK: acc.loop {{.*}} {495! CHECK: acc.yield496! CHECK-NEXT: } attributes {inclusiveUpperbound = array<i1: true>, independent = [#acc.device_type<none>]}497! CHECK: acc.yield498! CHECK-NEXT: }{{$}}499 500 !$acc parallel loop gang501 DO i = 1, n502 a(i) = b(i)503 END DO504 505! CHECK: acc.parallel {{.*}} {506! CHECK: acc.loop {{.*}} gang507! CHECK: acc.yield508! CHECK-NEXT: } attributes {inclusiveUpperbound = array<i1: true>, independent = [#acc.device_type<none>]}509! CHECK: acc.yield510! CHECK-NEXT: }{{$}}511 512 !$acc parallel loop gang(num: 8)513 DO i = 1, n514 a(i) = b(i)515 END DO516 517! CHECK: acc.parallel {{.*}} {518! CHECK: [[GANGNUM1:%.*]] = arith.constant 8 : i32519! CHECK: acc.loop {{.*}} gang({num=[[GANGNUM1]] : i32})520! CHECK: acc.yield521! CHECK-NEXT: } attributes {inclusiveUpperbound = array<i1: true>, independent = [#acc.device_type<none>]}522! CHECK: acc.yield523! CHECK-NEXT: }{{$}}524 525 !$acc parallel loop gang(num: gangNum)526 DO i = 1, n527 a(i) = b(i)528 END DO529 530! CHECK: acc.parallel {{.*}} {531! CHECK: [[GANGNUM2:%.*]] = fir.load %{{.*}} : !fir.ref<i32>532! CHECK: acc.loop {{.*}} gang({num=[[GANGNUM2]] : i32})533! CHECK: acc.yield534! CHECK-NEXT: } attributes {inclusiveUpperbound = array<i1: true>, independent = [#acc.device_type<none>]}535! CHECK: acc.yield536! CHECK-NEXT: }{{$}}537 538 !$acc parallel loop gang(num: gangNum, static: gangStatic)539 DO i = 1, n540 a(i) = b(i)541 END DO542 543! CHECK: acc.parallel {{.*}} {544! CHECK: acc.loop {{.*}} gang({num=%{{.*}} : i32, static=%{{.*}} : i32})545! CHECK: acc.yield546! CHECK-NEXT: } attributes {inclusiveUpperbound = array<i1: true>, independent = [#acc.device_type<none>]}547! CHECK: acc.yield548! CHECK-NEXT: }{{$}}549 550 !$acc parallel loop vector551 DO i = 1, n552 a(i) = b(i)553 END DO554 555! CHECK: acc.parallel {{.*}} {556! CHECK: acc.loop {{.*}} vector557! CHECK: acc.yield558! CHECK-NEXT: } attributes {inclusiveUpperbound = array<i1: true>, independent = [#acc.device_type<none>]}559! CHECK: acc.yield560! CHECK-NEXT: }{{$}}561 562 !$acc parallel loop vector(128)563 DO i = 1, n564 a(i) = b(i)565 END DO566 567! CHECK: acc.parallel {{.*}} {568! CHECK: [[CONSTANT128:%.*]] = arith.constant 128 : i32569! CHECK: acc.loop {{.*}} vector([[CONSTANT128]] : i32) {{.*}} {570! CHECK: acc.yield571! CHECK-NEXT: } attributes {inclusiveUpperbound = array<i1: true>, independent = [#acc.device_type<none>]}572! CHECK: acc.yield573! CHECK-NEXT: }{{$}}574 575 !$acc parallel loop vector(vectorLength)576 DO i = 1, n577 a(i) = b(i)578 END DO579 580! CHECK: acc.parallel {{.*}} {581! CHECK: [[VECTORLENGTH:%.*]] = fir.load %{{.*}} : !fir.ref<i32>582! CHECK: acc.loop {{.*}} vector([[VECTORLENGTH]] : i32) {{.*}} {583! CHECK-NOT: fir.do_loop584! CHECK: acc.yield585! CHECK-NEXT: } attributes {inclusiveUpperbound = array<i1: true>, independent = [#acc.device_type<none>]}586! CHECK: acc.yield587! CHECK-NEXT: }{{$}}588 589 !$acc parallel loop worker590 DO i = 1, n591 a(i) = b(i)592 END DO593 594! CHECK: acc.parallel {{.*}} {595! CHECK: acc.loop {{.*}} worker {{.*}} {596! CHECK-NOT: fir.do_loop597! CHECK: acc.yield598! CHECK-NEXT: } attributes {inclusiveUpperbound = array<i1: true>, independent = [#acc.device_type<none>]}599! CHECK: acc.yield600! CHECK-NEXT: }{{$}}601 602 !$acc parallel loop worker(128)603 DO i = 1, n604 a(i) = b(i)605 END DO606 607! CHECK: acc.parallel {{.*}}{608! CHECK: [[WORKER128:%.*]] = arith.constant 128 : i32609! CHECK: acc.loop {{.*}} worker([[WORKER128]] : i32) {{.*}} {610! CHECK-NOT: fir.do_loop611! CHECK: acc.yield612! CHECK-NEXT: } attributes {inclusiveUpperbound = array<i1: true>, independent = [#acc.device_type<none>]}613! CHECK: acc.yield614! CHECK-NEXT: }{{$}}615 616 !$acc parallel loop collapse(2)617 DO i = 1, n618 DO j = 1, n619 d(i, j) = e(i, j)620 END DO621 END DO622 623! CHECK: acc.parallel {{.*}} {624! CHECK: acc.loop {{.*}} {625! CHECK: acc.yield626! CHECK-NEXT: } attributes {{{.*}}collapse = [2], collapseDeviceType = [#acc.device_type<none>]{{.*}}}627! CHECK: acc.yield628! CHECK-NEXT: }{{$}}629 630 !$acc parallel loop631 DO i = 1, n632 !$acc loop633 DO j = 1, n634 d(i, j) = e(i, j)635 END DO636 END DO637 638! CHECK: acc.parallel {{.*}} {639! CHECK: acc.loop {{.*}} {640! CHECK: acc.loop {{.*}} {641! CHECK: acc.yield642! CHECK-NEXT: } attributes {{{.*}}independent = [#acc.device_type<none>]}643! CHECK: acc.yield644! CHECK-NEXT: } attributes {{{.*}}independent = [#acc.device_type<none>]}645! CHECK: acc.yield646! CHECK-NEXT: }{{$}}647 648 !$acc parallel loop tile(2)649 DO i = 1, n650 a(i) = b(i)651 END DO652 653! CHECK: acc.parallel {{.*}} {654! CHECK: [[TILESIZE:%.*]] = arith.constant 2 : i32655! CHECK: acc.loop {{.*}} tile({[[TILESIZE]] : i32}) {{.*}} {656! CHECK: acc.yield657! CHECK-NEXT: }{{$}}658! CHECK: acc.yield659! CHECK-NEXT: }{{$}}660 661 !$acc parallel loop tile(*)662 DO i = 1, n663 a(i) = b(i)664 END DO665 666! CHECK: acc.parallel {{.*}} {667! CHECK: [[TILESIZEM1:%.*]] = arith.constant -1 : i32668! CHECK: acc.loop {{.*}} tile({[[TILESIZEM1]] : i32}) {{.*}} {669! CHECK: acc.yield670! CHECK-NEXT: }{{$}}671! CHECK: acc.yield672! CHECK-NEXT: }{{$}}673 674 !$acc parallel loop tile(2, 2)675 DO i = 1, n676 DO j = 1, n677 d(i, j) = e(i, j)678 END DO679 END DO680 681! CHECK: acc.parallel {{.*}} {682! CHECK: [[TILESIZE1:%.*]] = arith.constant 2 : i32683! CHECK: [[TILESIZE2:%.*]] = arith.constant 2 : i32684! CHECK: acc.loop {{.*}} tile({[[TILESIZE1]] : i32, [[TILESIZE2]] : i32}) control(%arg0 : i32, %arg1 : i32) {{.*}} {685! CHECK: acc.yield686! CHECK-NEXT: }{{$}}687! CHECK: acc.yield688! CHECK-NEXT: }{{$}}689 690 !$acc parallel loop tile(tileSize)691 DO i = 1, n692 a(i) = b(i)693 END DO694 695! CHECK: acc.parallel {{.*}} {696! CHECK: acc.loop {{.*}} tile({%{{.*}} : i32}) {{.*}} {697! CHECK: acc.yield698! CHECK-NEXT: }{{$}}699! CHECK: acc.yield700! CHECK-NEXT: }{{$}}701 702 !$acc parallel loop tile(tileSize, tileSize)703 DO i = 1, n704 DO j = 1, n705 d(i, j) = e(i, j)706 END DO707 END DO708 709! CHECK: acc.parallel {{.*}} {710! CHECK: acc.loop {{.*}} tile({%{{.*}} : i32, %{{.*}} : i32}) control(%arg0 : i32, %arg1 : i32) {{.*}} {711! CHECK: acc.yield712! CHECK-NEXT: }{{$}}713! CHECK: acc.yield714! CHECK-NEXT: }{{$}}715 716 !$acc parallel loop reduction(+:reduction_r) reduction(*:reduction_i)717 do i = 1, n718 reduction_r = reduction_r + a(i)719 reduction_i = 1720 end do721 722! CHECK: %[[COPYINREDR:.*]] = acc.copyin varPtr(%{{.*}} : !fir.ref<f32>) -> !fir.ref<f32> {dataClause = #acc<data_clause acc_reduction>, implicit = true, name = "reduction_r"}723! CHECK: %[[COPYINREDI:.*]] = acc.copyin varPtr(%{{.*}} : !fir.ref<i32>) -> !fir.ref<i32> {dataClause = #acc<data_clause acc_reduction>, implicit = true, name = "reduction_i"}724! CHECK: acc.parallel {{.*}} dataOperands(%[[COPYINREDR]], %[[COPYINREDI]] : !fir.ref<f32>, !fir.ref<i32>) {725! CHECK: %[[REDUCTION_R:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add_ref_f32) -> !fir.ref<f32> {name = "reduction_r"}726! CHECK: %[[REDUCTION_I:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_mul_ref_i32) -> !fir.ref<i32> {name = "reduction_i"}727! CHECK: acc.loop {{.*}} reduction(%[[REDUCTION_R]], %[[REDUCTION_I]] : !fir.ref<f32>, !fir.ref<i32>) {{.*}}728! CHECK: acc.yield729! CHECK-NEXT: }{{$}}730! CHECK: acc.yield731! CHECK-NEXT: }{{$}}732! CHECK: acc.copyout accPtr(%[[COPYINREDR]] : !fir.ref<f32>) to varPtr(%{{.*}} : !fir.ref<f32>) {dataClause = #acc<data_clause acc_reduction>, implicit = true, name = "reduction_r"}733! CHECK: acc.copyout accPtr(%[[COPYINREDI]] : !fir.ref<i32>) to varPtr(%{{.*}} : !fir.ref<i32>) {dataClause = #acc<data_clause acc_reduction>, implicit = true, name = "reduction_i"}734 735 736 !$acc parallel loop737 do 10 i=0, n738 10 continue739! CHECK: acc.parallel740! CHECK: acc.loop741! CHECK-NOT: fir.do_loop742 743end subroutine acc_parallel_loop744