brintos

brintos / llvm-project-archived public Read only

0
0
Text · 25.8 KiB · b5ad46a Raw
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