718 lines · plain
1! This test checks lowering of OpenACC kernels loop combined directive.2 3! RUN: bbc -fopenacc -emit-hlfir %s -o - | FileCheck %s4 5subroutine acc_kernels_loop6 integer :: i, j7 8 integer :: async = 19 integer :: wait1 = 110 integer :: wait2 = 211 integer :: numGangs = 112 integer :: numWorkers = 1013 integer :: vectorLength = 12814 logical :: ifCondition = .TRUE.15 integer, parameter :: n = 1016 real, dimension(n) :: a, b, c17 real, dimension(n, n) :: d, e18 real, pointer :: f, g19 integer :: reduction_i20 real :: reduction_r21 22 integer :: gangNum = 823 integer :: gangStatic = 824 integer :: vectorNum = 12825 integer, parameter :: tileSize = 226 27! CHECK: %[[A:.*]] = fir.alloca !fir.array<10xf32> {{{.*}}uniq_name = "{{.*}}Ea"}28! CHECK: %[[DECLA:.*]]:2 = hlfir.declare %[[A]]29! CHECK: %[[B:.*]] = fir.alloca !fir.array<10xf32> {{{.*}}uniq_name = "{{.*}}Eb"}30! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]]31! CHECK: %[[C:.*]] = fir.alloca !fir.array<10xf32> {{{.*}}uniq_name = "{{.*}}Ec"}32! CHECK: %[[DECLC:.*]]:2 = hlfir.declare %[[C]]33! CHECK: %[[F:.*]] = fir.alloca !fir.box<!fir.ptr<f32>> {bindc_name = "f", uniq_name = "{{.*}}Ef"}34! CHECK: %[[DECLF:.*]]:2 = hlfir.declare %[[F]]35! CHECK: %[[G:.*]] = fir.alloca !fir.box<!fir.ptr<f32>> {bindc_name = "g", uniq_name = "{{.*}}Eg"}36! CHECK: %[[DECLG:.*]]:2 = hlfir.declare %[[G]]37! CHECK: %[[IFCONDITION:.*]] = fir.address_of(@{{.*}}ifcondition) : !fir.ref<!fir.logical<4>>38! CHECK: %[[DECLIFCONDITION:.*]]:2 = hlfir.declare %[[IFCONDITION]]39 40 !$acc kernels41 !$acc loop42 DO i = 1, n43 a(i) = b(i)44 END DO45 !$acc end kernels46 47! CHECK: acc.kernels {48! CHECK: acc.loop private{{.*}} {49! CHECK: acc.yield50! CHECK-NEXT: } attributes {auto_ = [#acc.device_type<none>]{{.*}}}51! CHECK: acc.terminator52! CHECK-NEXT: }{{$}}53 54 !$acc kernels loop55 DO i = 1, n56 a(i) = b(i)57 END DO58 59! CHECK: acc.kernels combined(loop) {60! CHECK: acc.loop combined(kernels) private{{.*}} {61! CHECK: acc.yield62! CHECK-NEXT: } attributes {auto_ = [#acc.device_type<none>]{{.*}}}63! CHECK: acc.terminator64! CHECK-NEXT: }{{$}}65 66 !$acc kernels loop async67 DO i = 1, n68 a(i) = b(i)69 END DO70 !$acc end kernels loop71 72! CHECK: acc.kernels {{.*}} async {73! CHECK: acc.loop {{.*}} {74! CHECK: acc.yield75! CHECK-NEXT: }{{$}}76! CHECK: acc.terminator77! CHECK-NEXT: }78 79 !$acc kernels loop async(1)80 DO i = 1, n81 a(i) = b(i)82 END DO83 84! CHECK: [[ASYNC1:%.*]] = arith.constant 1 : i3285! CHECK: acc.kernels {{.*}} async([[ASYNC1]] : i32) {86! CHECK: acc.loop {{.*}} {87! CHECK: acc.yield88! CHECK-NEXT: }{{$}}89! CHECK: acc.terminator90! CHECK-NEXT: }{{$}}91 92 !$acc kernels loop async(async)93 DO i = 1, n94 a(i) = b(i)95 END DO96 97! CHECK: [[ASYNC2:%.*]] = fir.load %{{.*}} : !fir.ref<i32>98! CHECK: acc.kernels {{.*}} async([[ASYNC2]] : i32) {99! CHECK: acc.loop {{.*}} {100! CHECK: acc.yield101! CHECK-NEXT: }{{$}}102! CHECK: acc.terminator103! CHECK-NEXT: }{{$}}104 105 !$acc kernels loop async(async) device_type(nvidia) async(1)106 DO i = 1, n107 a(i) = b(i)108 END DO109! CHECK: acc.kernels combined(loop) async(%{{.*}} : i32, %c1{{.*}} : i32 [#acc.device_type<nvidia>])110 111 !$acc kernels loop wait112 DO i = 1, n113 a(i) = b(i)114 END DO115 116! CHECK: acc.kernels {{.*}} wait {117! CHECK: acc.loop {{.*}} {118! CHECK: acc.yield119! CHECK-NEXT: }{{$}}120! CHECK: acc.terminator121! CHECK-NEXT: }122 123 !$acc kernels loop wait(1)124 DO i = 1, n125 a(i) = b(i)126 END DO127 128! CHECK: [[WAIT1:%.*]] = arith.constant 1 : i32129! CHECK: acc.kernels {{.*}} wait({[[WAIT1]] : i32}) {130! CHECK: acc.loop131! CHECK: acc.yield132! CHECK-NEXT: }{{$}}133! CHECK: acc.terminator134! CHECK-NEXT: }{{$}}135 136 !$acc kernels loop wait(1, 2)137 DO i = 1, n138 a(i) = b(i)139 END DO140 141! CHECK: [[WAIT2:%.*]] = arith.constant 1 : i32142! CHECK: [[WAIT3:%.*]] = arith.constant 2 : i32143! CHECK: acc.kernels {{.*}} wait({[[WAIT2]] : i32, [[WAIT3]] : i32}) {144! CHECK: acc.loop145! CHECK: acc.yield146! CHECK-NEXT: }{{$}}147! CHECK: acc.terminator148! CHECK-NEXT: }{{$}}149 150 !$acc kernels loop wait(wait1, wait2)151 DO i = 1, n152 a(i) = b(i)153 END DO154 155! CHECK: [[WAIT4:%.*]] = fir.load %{{.*}} : !fir.ref<i32>156! CHECK: [[WAIT5:%.*]] = fir.load %{{.*}} : !fir.ref<i32>157! CHECK: acc.kernels {{.*}} wait({[[WAIT4]] : i32, [[WAIT5]] : i32}) {158! CHECK: acc.loop159! CHECK: acc.yield160! CHECK-NEXT: }{{$}}161! CHECK: acc.terminator162! CHECK-NEXT: }{{$}}163 164 !$acc kernels loop num_gangs(1)165 DO i = 1, n166 a(i) = b(i)167 END DO168 169! CHECK: [[NUMGANGS1:%.*]] = arith.constant 1 : i32170! CHECK: acc.kernels {{.*}} num_gangs({[[NUMGANGS1]] : i32}) {171! CHECK: acc.loop172! CHECK: acc.yield173! CHECK-NEXT: }{{$}}174! CHECK: acc.terminator175! CHECK-NEXT: }{{$}}176 177 !$acc kernels loop num_gangs(numGangs)178 DO i = 1, n179 a(i) = b(i)180 END DO181 182! CHECK: [[NUMGANGS2:%.*]] = fir.load %{{.*}} : !fir.ref<i32>183! CHECK: acc.kernels {{.*}} num_gangs({[[NUMGANGS2]] : i32}) {184! CHECK: acc.loop185! CHECK: acc.yield186! CHECK-NEXT: }{{$}}187! CHECK: acc.terminator188! CHECK-NEXT: }{{$}}189 190 !$acc kernels loop num_workers(10)191 DO i = 1, n192 a(i) = b(i)193 END DO194 195! CHECK: [[NUMWORKERS1:%.*]] = arith.constant 10 : i32196! CHECK: acc.kernels {{.*}} num_workers([[NUMWORKERS1]] : i32) {197! CHECK: acc.loop {{.*}} {198! CHECK: acc.yield199! CHECK-NEXT: }{{$}}200! CHECK: acc.terminator201! CHECK-NEXT: }{{$}}202 203 !$acc kernels loop num_workers(numWorkers)204 DO i = 1, n205 a(i) = b(i)206 END DO207 208! CHECK: [[NUMWORKERS2:%.*]] = fir.load %{{.*}} : !fir.ref<i32>209! CHECK: acc.kernels {{.*}} num_workers([[NUMWORKERS2]] : i32) {210! CHECK: acc.loop {{.*}} {211! CHECK: acc.yield212! CHECK-NEXT: }{{$}}213! CHECK: acc.terminator214! CHECK-NEXT: }{{$}}215 216 !$acc kernels loop vector_length(128)217 DO i = 1, n218 a(i) = b(i)219 END DO220 221! CHECK: [[VECTORLENGTH1:%.*]] = arith.constant 128 : i32222! CHECK: acc.kernels {{.*}} vector_length([[VECTORLENGTH1]] : i32) {223! CHECK: acc.loop {{.*}} {224! CHECK: acc.yield225! CHECK-NEXT: }{{$}}226! CHECK: acc.terminator227! CHECK-NEXT: }{{$}}228 229 !$acc kernels loop vector_length(vectorLength)230 DO i = 1, n231 a(i) = b(i)232 END DO233 234! CHECK: [[VECTORLENGTH2:%.*]] = fir.load %{{.*}} : !fir.ref<i32>235! CHECK: acc.kernels {{.*}} vector_length([[VECTORLENGTH2]] : i32) {236! CHECK: acc.loop {{.*}} {237! CHECK: acc.yield238! CHECK-NEXT: }{{$}}239! CHECK: acc.terminator240! CHECK-NEXT: }{{$}}241 242 !$acc kernels loop if(.TRUE.)243 DO i = 1, n244 a(i) = b(i)245 END DO246 247! CHECK: [[IF1:%.*]] = arith.constant true248! CHECK: acc.kernels {{.*}} if([[IF1]]) {249! CHECK: acc.loop {{.*}} {250! CHECK: acc.yield251! CHECK-NEXT: }{{$}}252! CHECK: acc.terminator253! CHECK-NEXT: }{{$}}254 255 !$acc kernels loop if(ifCondition)256 DO i = 1, n257 a(i) = b(i)258 END DO259 260! CHECK: [[IFCOND:%.*]] = fir.load %{{.*}} : !fir.ref<!fir.logical<4>>261! CHECK: [[IF2:%.*]] = fir.convert [[IFCOND]] : (!fir.logical<4>) -> i1262! CHECK: acc.kernels {{.*}} if([[IF2]]) {263! CHECK: acc.loop {{.*}} {264! CHECK: acc.yield265! CHECK-NEXT: }{{$}}266! CHECK: acc.terminator267! CHECK-NEXT: }{{$}}268 269 !$acc kernels loop self(.TRUE.)270 DO i = 1, n271 a(i) = b(i)272 END DO273 274! CHECK: [[SELF1:%.*]] = arith.constant true275! CHECK: acc.kernels {{.*}} self([[SELF1]]) {276! CHECK: acc.loop {{.*}} {277! CHECK: acc.yield278! CHECK-NEXT: }{{$}}279! CHECK: acc.terminator280! CHECK-NEXT: }{{$}}281 282 !$acc kernels loop self283 DO i = 1, n284 a(i) = b(i)285 END DO286 287! CHECK: acc.kernels {{.*}}{288! CHECK: acc.loop {{.*}} {289! CHECK: acc.yield290! CHECK-NEXT: }{{$}}291! CHECK: acc.terminator292! CHECK-NEXT: } attributes {selfAttr}293 294 !$acc kernels loop self(ifCondition)295 DO i = 1, n296 a(i) = b(i)297 END DO298 299 300! CHECK: %[[SELF2:.*]] = fir.convert %[[DECLIFCONDITION]]#0 : (!fir.ref<!fir.logical<4>>) -> i1301! CHECK: acc.kernels {{.*}} self(%[[SELF2]]) {302! CHECK: acc.loop {{.*}} {303! CHECK: acc.yield304! CHECK-NEXT: }{{$}}305! CHECK: acc.terminator306! CHECK-NEXT: }{{$}}307 308 !$acc kernels loop copy(a, b)309 DO i = 1, n310 a(i) = b(i)311 END DO312 313 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.kernels {{.*}} 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.terminator321! 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 kernels 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.kernels {{.*}} 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.terminator337! 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 kernels 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.kernels {{.*}} 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.terminator353! 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 kernels 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.kernels {{.*}} 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.terminator369! 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 kernels 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.kernels {{.*}} 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.terminator385! 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 kernels 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.kernels {{.*}} 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.terminator401! 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 kernels 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.kernels {{.*}} 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.terminator417! 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 kernels 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.kernels {{.*}} 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.terminator433! CHECK-NEXT: }{{$}}434 435 !$acc kernels 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.kernels {{.*}} 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.terminator447! CHECK-NEXT: }{{$}}448 449 !$acc kernels loop seq450 DO i = 1, n451 a(i) = b(i)452 END DO453 454! CHECK: acc.kernels {{.*}} {455! CHECK: acc.loop {{.*}} {456! CHECK: acc.yield457! CHECK-NEXT: } attributes {inclusiveUpperbound = array<i1: true>, seq = [#acc.device_type<none>]}458! CHECK: acc.terminator459! CHECK-NEXT: }{{$}}460 461 !$acc kernels loop auto462 DO i = 1, n463 a(i) = b(i)464 END DO465 466! CHECK: acc.kernels {{.*}} {467! CHECK: acc.loop {{.*}} {468! CHECK: acc.yield469! CHECK-NEXT: } attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}470! CHECK: acc.terminator471! CHECK-NEXT: }{{$}}472 473 !$acc kernels loop independent474 DO i = 1, n475 a(i) = b(i)476 END DO477 478! CHECK: acc.kernels {{.*}} {479! CHECK: acc.loop {{.*}} {480! CHECK: acc.yield481! CHECK-NEXT: } attributes {inclusiveUpperbound = array<i1: true>, independent = [#acc.device_type<none>]}482! CHECK: acc.terminator483! CHECK-NEXT: }{{$}}484 485 !$acc kernels loop gang486 DO i = 1, n487 a(i) = b(i)488 END DO489 490! CHECK: acc.kernels {{.*}} {491! CHECK: acc.loop {{.*}} gang {{.*}} {492! CHECK: acc.yield493! CHECK-NEXT: } attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}494! CHECK: acc.terminator495! CHECK-NEXT: }{{$}}496 497 !$acc kernels loop gang(num: 8)498 DO i = 1, n499 a(i) = b(i)500 END DO501 502! CHECK: acc.kernels {{.*}} {503! CHECK: [[GANGNUM1:%.*]] = arith.constant 8 : i32504! CHECK: acc.loop {{.*}} gang({num=[[GANGNUM1]] : i32}) {{.*}} {505! CHECK: acc.yield506! CHECK-NEXT: } attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}507! CHECK: acc.terminator508! CHECK-NEXT: }{{$}}509 510 !$acc kernels loop gang(num: gangNum)511 DO i = 1, n512 a(i) = b(i)513 END DO514 515! CHECK: acc.kernels {{.*}} {516! CHECK: [[GANGNUM2:%.*]] = fir.load %{{.*}} : !fir.ref<i32>517! CHECK: acc.loop {{.*}} gang({num=[[GANGNUM2]] : i32}) {{.*}} {518! CHECK: acc.yield519! CHECK-NEXT: } attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}520! CHECK: acc.terminator521! CHECK-NEXT: }{{$}}522 523 !$acc kernels loop gang(num: gangNum, static: gangStatic)524 DO i = 1, n525 a(i) = b(i)526 END DO527 528! CHECK: acc.kernels {{.*}} {529! CHECK: acc.loop {{.*}} gang({num=%{{.*}} : i32, static=%{{.*}} : i32})530! CHECK: acc.yield531! CHECK-NEXT: } attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}532! CHECK: acc.terminator533! CHECK-NEXT: }{{$}}534 535 !$acc kernels loop vector536 DO i = 1, n537 a(i) = b(i)538 END DO539 540! CHECK: acc.kernels {{.*}} {541! CHECK: acc.loop {{.*}} vector {{.*}} {542! CHECK: acc.yield543! CHECK-NEXT: } attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}544! CHECK: acc.terminator545! CHECK-NEXT: }{{$}}546 547 !$acc kernels loop vector(128)548 DO i = 1, n549 a(i) = b(i)550 END DO551 552! CHECK: acc.kernels {{.*}} {553! CHECK: [[CONSTANT128:%.*]] = arith.constant 128 : i32554! CHECK: acc.loop {{.*}} vector([[CONSTANT128]] : i32) {{.*}} {555! CHECK: acc.yield556! CHECK-NEXT: } attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}557! CHECK: acc.terminator558! CHECK-NEXT: }{{$}}559 560 !$acc kernels loop vector(vectorLength)561 DO i = 1, n562 a(i) = b(i)563 END DO564 565! CHECK: acc.kernels {{.*}} {566! CHECK: [[VECTORLENGTH:%.*]] = fir.load %{{.*}} : !fir.ref<i32>567! CHECK: acc.loop {{.*}} vector([[VECTORLENGTH]] : i32) {{.*}} {568! CHECK: acc.yield569! CHECK-NEXT: } attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}570! CHECK: acc.terminator571! CHECK-NEXT: }{{$}}572 573 !$acc kernels loop worker574 DO i = 1, n575 a(i) = b(i)576 END DO577 578! CHECK: acc.kernels {{.*}} {579! CHECK: acc.loop {{.*}} worker {{.*}} {580! CHECK: acc.yield581! CHECK-NEXT: } attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}582! CHECK: acc.terminator583! CHECK-NEXT: }{{$}}584 585 !$acc kernels loop worker(128)586 DO i = 1, n587 a(i) = b(i)588 END DO589 590! CHECK: acc.kernels {{.*}} {591! CHECK: [[WORKER128:%.*]] = arith.constant 128 : i32592! CHECK: acc.loop {{.*}} worker([[WORKER128]] : i32) {{.*}} {593! CHECK: acc.yield594! CHECK-NEXT: } attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}595! CHECK: acc.terminator596! CHECK-NEXT: }{{$}}597 598 !$acc kernels loop collapse(2)599 DO i = 1, n600 DO j = 1, n601 d(i, j) = e(i, j)602 END DO603 END DO604 605! CHECK: acc.kernels {{.*}} {606! CHECK: acc.loop {{.*}} {607! CHECK: acc.yield608! CHECK-NEXT: } attributes {{{.*}}collapse = [2], collapseDeviceType = [#acc.device_type<none>]{{.*}}}609! CHECK: acc.terminator610! CHECK-NEXT: }{{$}}611 612 !$acc kernels loop613 DO i = 1, n614 !$acc loop615 DO j = 1, n616 d(i, j) = e(i, j)617 END DO618 END DO619 620! CHECK: acc.kernels {{.*}} {621! CHECK: acc.loop {{.*}} {622! CHECK: acc.loop {{.*}} {623! CHECK: acc.yield624! CHECK-NEXT: } attributes {auto_ = [#acc.device_type<none>]{{.*}}}625! CHECK: acc.yield626! CHECK-NEXT: } attributes {auto_ = [#acc.device_type<none>]{{.*}}}627! CHECK: acc.terminator628! CHECK-NEXT: }{{$}}629 630 !$acc kernels loop tile(2)631 DO i = 1, n632 a(i) = b(i)633 END DO634 635! CHECK: acc.kernels {{.*}} {636! CHECK: [[TILESIZE:%.*]] = arith.constant 2 : i32637! CHECK: acc.loop {{.*}} tile({[[TILESIZE]] : i32}) {{.*}} {638! CHECK: acc.yield639! CHECK-NEXT: }{{$}}640! CHECK: acc.terminator641! CHECK-NEXT: }{{$}}642 643 !$acc kernels loop tile(*)644 DO i = 1, n645 a(i) = b(i)646 END DO647 648! CHECK: acc.kernels {{.*}} {649! CHECK: [[TILESIZEM1:%.*]] = arith.constant -1 : i32650! CHECK: acc.loop {{.*}} tile({[[TILESIZEM1]] : i32}) {{.*}} {651! CHECK: acc.yield652! CHECK-NEXT: }{{$}}653! CHECK: acc.terminator654! CHECK-NEXT: }{{$}}655 656 !$acc kernels loop tile(2, 2)657 DO i = 1, n658 DO j = 1, n659 d(i, j) = e(i, j)660 END DO661 END DO662 663! CHECK: acc.kernels {{.*}} {664! CHECK: [[TILESIZE1:%.*]] = arith.constant 2 : i32665! CHECK: [[TILESIZE2:%.*]] = arith.constant 2 : i32666! CHECK: acc.loop {{.*}} tile({[[TILESIZE1]] : i32, [[TILESIZE2]] : i32}) control(%arg0 : i32, %arg1 : i32) {{.*}} {667! CHECK: acc.yield668! CHECK-NEXT: }{{$}}669! CHECK: acc.terminator670! CHECK-NEXT: }{{$}}671 672 !$acc kernels loop tile(tileSize)673 DO i = 1, n674 a(i) = b(i)675 END DO676 677! CHECK: acc.kernels {{.*}} {678! CHECK: acc.loop {{.*}} tile({%{{.*}} : i32}) {{.*}} {679! CHECK: acc.yield680! CHECK-NEXT: }{{$}}681! CHECK: acc.terminator682! CHECK-NEXT: }{{$}}683 684 !$acc kernels loop tile(tileSize, tileSize)685 DO i = 1, n686 DO j = 1, n687 d(i, j) = e(i, j)688 END DO689 END DO690 691! CHECK: acc.kernels {{.*}} {692! CHECK: acc.loop {{.*}} tile({%{{.*}} : i32, %{{.*}} : i32}) control(%arg0 : i32, %arg1 : i32) {{.*}} {693! CHECK: acc.yield694! CHECK-NEXT: }{{$}}695! CHECK: acc.terminator696! CHECK-NEXT: }{{$}}697 698 !$acc kernels loop reduction(+:reduction_r) reduction(*:reduction_i)699 do i = 1, n700 reduction_r = reduction_r + a(i)701 reduction_i = 1702 end do703 704! CHECK: %[[COPYINREDR:.*]] = acc.copyin varPtr(%{{.*}} : !fir.ref<f32>) -> !fir.ref<f32> {dataClause = #acc<data_clause acc_reduction>, implicit = true, name = "reduction_r"}705! CHECK: %[[COPYINREDI:.*]] = acc.copyin varPtr(%{{.*}} : !fir.ref<i32>) -> !fir.ref<i32> {dataClause = #acc<data_clause acc_reduction>, implicit = true, name = "reduction_i"}706! CHECK: acc.kernels {{.*}} dataOperands(%[[COPYINREDR]], %[[COPYINREDI]] : !fir.ref<f32>, !fir.ref<i32>) {707! CHECK: %[[REDUCTION_R:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add_ref_f32) -> !fir.ref<f32> {name = "reduction_r"}708! CHECK: %[[REDUCTION_I:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_mul_ref_i32) -> !fir.ref<i32> {name = "reduction_i"}709! CHECK: acc.loop {{.*}} reduction(%[[REDUCTION_R]], %[[REDUCTION_I]] : !fir.ref<f32>, !fir.ref<i32>) {{.*}} {710! CHECK: acc.yield711! CHECK-NEXT: }{{$}}712! CHECK: acc.terminator713! CHECK-NEXT: }{{$}}714! CHECK: acc.copyout accPtr(%[[COPYINREDR]] : !fir.ref<f32>) to varPtr(%{{.*}} : !fir.ref<f32>) {dataClause = #acc<data_clause acc_reduction>, implicit = true, name = "reduction_r"}715! CHECK: acc.copyout accPtr(%[[COPYINREDI]] : !fir.ref<i32>) to varPtr(%{{.*}} : !fir.ref<i32>) {dataClause = #acc<data_clause acc_reduction>, implicit = true, name = "reduction_i"}716 717end subroutine718