brintos

brintos / llvm-project-archived public Read only

0
0
Text · 24.9 KiB · 70f5b7d Raw
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