676 lines · plain
1! This test checks lowering of Openacc serial loop combined directive.2 3! RUN: bbc -fopenacc -emit-hlfir %s -o - | FileCheck %s4 5! CHECK-LABEL: acc.private.recipe @privatization_ref_10xf32 : !fir.ref<!fir.array<10xf32>> init {6! CHECK: ^bb0(%{{.*}}: !fir.ref<!fir.array<10xf32>>):7! CHECK: %[[SHAPE:.*]] = fir.shape %{{.*}} : (index) -> !fir.shape<1>8! CHECK: %[[ALLOCA:.*]] = fir.alloca !fir.array<10xf32>9! CHECK: %[[DECLARE:.*]]:2 = hlfir.declare %[[ALLOCA]](%[[SHAPE]]) {uniq_name = "acc.private.init"} : (!fir.ref<!fir.array<10xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xf32>>, !fir.ref<!fir.array<10xf32>>)10! CHECK: acc.yield %[[DECLARE]]#0 : !fir.ref<!fir.array<10xf32>>11! CHECK: }12 13! CHECK-LABEL: acc.firstprivate.recipe @firstprivatization_ref_10xf32 : !fir.ref<!fir.array<10xf32>> init {14! CHECK: ^bb0(%{{.*}}: !fir.ref<!fir.array<10xf32>>):15! CHECK: %[[SHAPE:.*]] = fir.shape %{{.*}} : (index) -> !fir.shape<1>16! CHECK: %[[ALLOCA:.*]] = fir.alloca !fir.array<10xf32>17! CHECK: %[[DECLARE:.*]]:2 = hlfir.declare %[[ALLOCA]](%[[SHAPE]]) {uniq_name = "acc.private.init"} : (!fir.ref<!fir.array<10xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xf32>>, !fir.ref<!fir.array<10xf32>>)18! CHECK: acc.yield %[[DECLARE]]#0 : !fir.ref<!fir.array<10xf32>>19! CHECK: } copy {20! CHECK: ^bb0(%arg0: !fir.ref<!fir.array<10xf32>>, %arg1: !fir.ref<!fir.array<10xf32>>):21! CHECK: acc.terminator22! CHECK: }23 24! CHECK-LABEL: func.func @_QPacc_serial_loop()25 26subroutine acc_serial_loop27 integer :: i, j28 29 integer :: async = 130 integer :: wait1 = 131 integer :: wait2 = 232 integer :: numGangs = 133 integer :: numWorkers = 1034 integer :: vectorLength = 12835 logical :: ifCondition = .TRUE.36 integer, parameter :: n = 1037 real, dimension(n) :: a, b, c38 real, dimension(n, n) :: d, e39 real, pointer :: f, g40 integer :: reduction_i41 real :: reduction_r42 43 integer :: gangNum = 844 integer :: gangStatic = 845 integer :: vectorNum = 12846 integer, parameter :: tileSize = 247 48! CHECK: %[[A:.*]] = fir.alloca !fir.array<10xf32> {{{.*}}uniq_name = "{{.*}}Ea"}49! CHECK: %[[DECLA:.*]]:2 = hlfir.declare %[[A]]50! CHECK: %[[B:.*]] = fir.alloca !fir.array<10xf32> {{{.*}}uniq_name = "{{.*}}Eb"}51! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]]52! CHECK: %[[C:.*]] = fir.alloca !fir.array<10xf32> {{{.*}}uniq_name = "{{.*}}Ec"}53! CHECK: %[[DECLC:.*]]:2 = hlfir.declare %[[C]]54! CHECK: %[[F:.*]] = fir.alloca !fir.box<!fir.ptr<f32>> {bindc_name = "f", uniq_name = "{{.*}}Ef"}55! CHECK: %[[DECLF:.*]]:2 = hlfir.declare %[[F]]56! CHECK: %[[G:.*]] = fir.alloca !fir.box<!fir.ptr<f32>> {bindc_name = "g", uniq_name = "{{.*}}Eg"}57! CHECK: %[[DECLG:.*]]:2 = hlfir.declare %[[G]]58! CHECK: %[[IFCONDITION:.*]] = fir.address_of(@{{.*}}ifcondition) : !fir.ref<!fir.logical<4>>59! CHECK: %[[DECLIFCONDITION:.*]]:2 = hlfir.declare %[[IFCONDITION]]60 61 !$acc serial62 !$acc loop63 DO i = 1, n64 a(i) = b(i)65 END DO66 !$acc end serial67 68! CHECK: acc.serial {69! CHECK: acc.loop private{{.*}} {70! CHECK: acc.yield71! CHECK-NEXT: } attributes {{{.*}}seq = [#acc.device_type<none>]}72! CHECK: acc.yield73! CHECK-NEXT: }{{$}}74 75 !$acc serial loop76 DO i = 1, n77 a(i) = b(i)78 END DO79 80! CHECK: acc.serial combined(loop) {81! CHECK: acc.loop combined(serial) private{{.*}} {82! CHECK: acc.yield83! CHECK-NEXT: } attributes {{{.*}}seq = [#acc.device_type<none>]}84! CHECK: acc.yield85! CHECK-NEXT: }{{$}}86 87 !$acc serial loop async88 DO i = 1, n89 a(i) = b(i)90 END DO91 !$acc end serial loop92 93! CHECK: acc.serial {{.*}} async {94! CHECK: acc.loop {{.*}} {95! CHECK: acc.yield96! CHECK-NEXT: }{{$}}97! CHECK: acc.yield98! CHECK-NEXT: }99 100 !$acc serial loop async(1)101 DO i = 1, n102 a(i) = b(i)103 END DO104 105! CHECK: [[ASYNC1:%.*]] = arith.constant 1 : i32106! CHECK: acc.serial {{.*}} async([[ASYNC1]] : i32) {107! CHECK: acc.loop {{.*}} {108! CHECK: acc.yield109! CHECK-NEXT: }{{$}}110! CHECK: acc.yield111! CHECK-NEXT: }{{$}}112 113 !$acc serial loop async(async)114 DO i = 1, n115 a(i) = b(i)116 END DO117 118! CHECK: [[ASYNC2:%.*]] = fir.load %{{.*}} : !fir.ref<i32>119! CHECK: acc.serial {{.*}} async([[ASYNC2]] : i32) {120! CHECK: acc.loop {{.*}} {121! CHECK: acc.yield122! CHECK-NEXT: }{{$}}123! CHECK: acc.yield124! CHECK-NEXT: }{{$}}125 126 !$acc serial loop async(async) device_type(nvidia) async(1)127 DO i = 1, n128 a(i) = b(i)129 END DO130! CHECK: acc.serial combined(loop) async(%{{.*}} : i32, %c1{{.*}} : i32 [#acc.device_type<nvidia>])131 132 !$acc serial loop wait133 DO i = 1, n134 a(i) = b(i)135 END DO136 137! CHECK: acc.serial {{.*}} wait {138! CHECK: acc.loop {{.*}} {139! CHECK: acc.yield140! CHECK-NEXT: }{{$}}141! CHECK: acc.yield142! CHECK-NEXT: }143 144 !$acc serial loop wait(1)145 DO i = 1, n146 a(i) = b(i)147 END DO148 149! CHECK: [[WAIT1:%.*]] = arith.constant 1 : i32150! CHECK: acc.serial {{.*}} wait({[[WAIT1]] : i32}) {151! CHECK: acc.loop {{.*}} {152! CHECK: acc.yield153! CHECK-NEXT: }{{$}}154! CHECK: acc.yield155! CHECK-NEXT: }{{$}}156 157 !$acc serial loop wait(1, 2)158 DO i = 1, n159 a(i) = b(i)160 END DO161 162! CHECK: [[WAIT2:%.*]] = arith.constant 1 : i32163! CHECK: [[WAIT3:%.*]] = arith.constant 2 : i32164! CHECK: acc.serial {{.*}} wait({[[WAIT2]] : i32, [[WAIT3]] : i32}) {165! CHECK: acc.loop {{.*}} {166! CHECK: acc.yield167! CHECK-NEXT: }{{$}}168! CHECK: acc.yield169! CHECK-NEXT: }{{$}}170 171 !$acc serial loop wait(wait1, wait2)172 DO i = 1, n173 a(i) = b(i)174 END DO175 176! CHECK: [[WAIT4:%.*]] = fir.load %{{.*}} : !fir.ref<i32>177! CHECK: [[WAIT5:%.*]] = fir.load %{{.*}} : !fir.ref<i32>178! CHECK: acc.serial {{.*}} wait({[[WAIT4]] : i32, [[WAIT5]] : i32}) {179! CHECK: acc.loop {{.*}} {180! CHECK: acc.yield181! CHECK-NEXT: }{{$}}182! CHECK: acc.yield183! CHECK-NEXT: }{{$}}184 185 !$acc serial loop if(.TRUE.)186 DO i = 1, n187 a(i) = b(i)188 END DO189 190! CHECK: [[IF1:%.*]] = arith.constant true191! CHECK: acc.serial {{.*}} if([[IF1]]) {192! CHECK: acc.loop {{.*}} {193! CHECK: acc.yield194! CHECK-NEXT: }{{$}}195! CHECK: acc.yield196! CHECK-NEXT: }{{$}}197 198 !$acc serial loop if(ifCondition)199 DO i = 1, n200 a(i) = b(i)201 END DO202 203! CHECK: [[IFCOND:%.*]] = fir.load %{{.*}} : !fir.ref<!fir.logical<4>>204! CHECK: [[IF2:%.*]] = fir.convert [[IFCOND]] : (!fir.logical<4>) -> i1205! CHECK: acc.serial {{.*}} if([[IF2]]) {206! CHECK: acc.loop {{.*}} {207! CHECK: acc.yield208! CHECK-NEXT: }{{$}}209! CHECK: acc.yield210! CHECK-NEXT: }{{$}}211 212 !$acc serial loop self(.TRUE.)213 DO i = 1, n214 a(i) = b(i)215 END DO216 217! CHECK: [[SELF1:%.*]] = arith.constant true218! CHECK: acc.serial {{.*}} self([[SELF1]]) {219! CHECK: acc.loop {{.*}} {220! CHECK: acc.yield221! CHECK-NEXT: }{{$}}222! CHECK: acc.yield223! CHECK-NEXT: }{{$}}224 225 !$acc serial loop self226 DO i = 1, n227 a(i) = b(i)228 END DO229 230! CHECK: acc.serial {{.*}} {231! CHECK: acc.loop {{.*}} {232! CHECK: acc.yield233! CHECK-NEXT: }{{$}}234! CHECK: acc.yield235! CHECK-NEXT: } attributes {selfAttr}236 237 !$acc serial loop self(ifCondition)238 DO i = 1, n239 a(i) = b(i)240 END DO241 242! CHECK: %[[SELF2:.*]] = fir.convert %[[DECLIFCONDITION]]#0 : (!fir.ref<!fir.logical<4>>) -> i1243! CHECK: acc.serial {{.*}} self(%[[SELF2]]) {244! CHECK: acc.loop {{.*}} {245! CHECK: acc.yield246! CHECK-NEXT: }{{$}}247! CHECK: acc.yield248! CHECK-NEXT: }{{$}}249 250 !$acc serial loop copy(a, b)251 DO i = 1, n252 a(i) = b(i)253 END DO254 255! 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"}256! 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"}257! CHECK: acc.serial {{.*}} dataOperands(%[[COPYIN_A]], %[[COPYIN_B]] : !fir.ref<!fir.array<10xf32>>, !fir.ref<!fir.array<10xf32>>) {258! CHECK: acc.loop {{.*}} {259! CHECK: acc.yield260! CHECK-NEXT: }{{$}}261! CHECK: acc.yield262! CHECK-NEXT: }{{$}}263! 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"}264! 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"}265 266 !$acc serial loop copy(a) copy(b)267 DO i = 1, n268 a(i) = b(i)269 END DO270 271! 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"}272! 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"}273! CHECK: acc.serial {{.*}} dataOperands(%[[COPYIN_A]], %[[COPYIN_B]] : !fir.ref<!fir.array<10xf32>>, !fir.ref<!fir.array<10xf32>>) {274! CHECK: acc.loop {{.*}} {275! CHECK: acc.yield276! CHECK-NEXT: }{{$}}277! CHECK: acc.yield278! CHECK-NEXT: }{{$}}279! 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"}280! 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"}281 282 !$acc serial loop copyin(a) copyin(readonly: b)283 DO i = 1, n284 a(i) = b(i)285 END DO286 287! CHECK: %[[COPYIN_A:.*]] = acc.copyin varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10xf32>>) -> !fir.ref<!fir.array<10xf32>> {name = "a"}288! 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"}289! CHECK: acc.serial {{.*}} dataOperands(%[[COPYIN_A]], %[[COPYIN_B]] : !fir.ref<!fir.array<10xf32>>, !fir.ref<!fir.array<10xf32>>) {290! CHECK: acc.loop {{.*}} {291! CHECK: acc.yield292! CHECK-NEXT: }{{$}}293! CHECK: acc.yield294! CHECK-NEXT: }{{$}}295! CHECK: acc.delete accPtr(%[[COPYIN_A]] : !fir.ref<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_copyin>, name = "a"}296! CHECK: acc.delete accPtr(%[[COPYIN_B]] : !fir.ref<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_copyin_readonly>, name = "b"}297 298 !$acc serial loop copyout(a) copyout(zero: b)299 DO i = 1, n300 a(i) = b(i)301 END DO302 303! 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"}304! 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"}305! CHECK: acc.serial {{.*}} dataOperands(%[[CREATE_A]], %[[CREATE_B]] : !fir.ref<!fir.array<10xf32>>, !fir.ref<!fir.array<10xf32>>) {306! CHECK: acc.loop {{.*}} {307! CHECK: acc.yield308! CHECK-NEXT: }{{$}}309! CHECK: acc.yield310! CHECK-NEXT: }{{$}}311! CHECK: acc.copyout accPtr(%[[CREATE_A]] : !fir.ref<!fir.array<10xf32>>) to varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10xf32>>) {name = "a"}312! 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"}313 314 !$acc serial loop create(b) create(zero: a)315 DO i = 1, n316 a(i) = b(i)317 END DO318 319! CHECK: %[[CREATE_B:.*]] = acc.create varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10xf32>>) -> !fir.ref<!fir.array<10xf32>> {name = "b"}320! 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"}321! CHECK: acc.serial {{.*}} dataOperands(%[[CREATE_B]], %[[CREATE_A]] : !fir.ref<!fir.array<10xf32>>, !fir.ref<!fir.array<10xf32>>) {322! CHECK: acc.loop {{.*}} {323! CHECK: acc.yield324! CHECK-NEXT: }{{$}}325! CHECK: acc.yield326! CHECK-NEXT: }{{$}}327! CHECK: acc.delete accPtr(%[[CREATE_B]] : !fir.ref<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_create>, name = "b"}328! CHECK: acc.delete accPtr(%[[CREATE_A]] : !fir.ref<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_create_zero>, name = "a"}329 330 !$acc serial loop no_create(a, b)331 DO i = 1, n332 a(i) = b(i)333 END DO334 335! CHECK: %[[NOCREATE_A:.*]] = acc.nocreate varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10xf32>>) -> !fir.ref<!fir.array<10xf32>> {name = "a"}336! CHECK: %[[NOCREATE_B:.*]] = acc.nocreate varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10xf32>>) -> !fir.ref<!fir.array<10xf32>> {name = "b"}337! CHECK: acc.serial {{.*}} dataOperands(%[[NOCREATE_A]], %[[NOCREATE_B]] : !fir.ref<!fir.array<10xf32>>, !fir.ref<!fir.array<10xf32>>) {338! CHECK: acc.loop {{.*}} {339! CHECK: acc.yield340! CHECK-NEXT: }{{$}}341! CHECK: acc.yield342! CHECK-NEXT: }{{$}}343! CHECK: acc.delete accPtr(%[[NOCREATE_A]] : !fir.ref<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_no_create>, name = "a"}344! CHECK: acc.delete accPtr(%[[NOCREATE_B]] : !fir.ref<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_no_create>, name = "b"}345 346 !$acc serial loop present(a, b)347 DO i = 1, n348 a(i) = b(i)349 END DO350 351! CHECK: %[[PRESENT_A:.*]] = acc.present varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10xf32>>) -> !fir.ref<!fir.array<10xf32>> {name = "a"}352! CHECK: %[[PRESENT_B:.*]] = acc.present varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10xf32>>) -> !fir.ref<!fir.array<10xf32>> {name = "b"}353! CHECK: acc.serial {{.*}} dataOperands(%[[PRESENT_A]], %[[PRESENT_B]] : !fir.ref<!fir.array<10xf32>>, !fir.ref<!fir.array<10xf32>>) {354! CHECK: acc.loop {{.*}} {355! CHECK: acc.yield356! CHECK-NEXT: }{{$}}357! CHECK: acc.yield358! CHECK-NEXT: }{{$}}359! CHECK: acc.delete accPtr(%[[PRESENT_A]] : !fir.ref<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_present>, name = "a"}360! CHECK: acc.delete accPtr(%[[PRESENT_B]] : !fir.ref<!fir.array<10xf32>>) {dataClause = #acc<data_clause acc_present>, name = "b"}361 362 !$acc serial loop deviceptr(a) deviceptr(b)363 DO i = 1, n364 a(i) = b(i)365 END DO366 367! CHECK: %[[DEVICEPTR_A:.*]] = acc.deviceptr varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10xf32>>) -> !fir.ref<!fir.array<10xf32>> {name = "a"}368! CHECK: %[[DEVICEPTR_B:.*]] = acc.deviceptr varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10xf32>>) -> !fir.ref<!fir.array<10xf32>> {name = "b"}369! CHECK: acc.serial {{.*}} dataOperands(%[[DEVICEPTR_A]], %[[DEVICEPTR_B]] : !fir.ref<!fir.array<10xf32>>, !fir.ref<!fir.array<10xf32>>) {370! CHECK: acc.loop {{.*}} {371! CHECK: acc.yield372! CHECK-NEXT: }{{$}}373! CHECK: acc.yield374! CHECK-NEXT: }{{$}}375 376 !$acc serial loop attach(f, g)377 DO i = 1, n378 a(i) = b(i)379 END DO380 381! CHECK: %[[ATTACH_F:.*]] = acc.attach varPtr(%[[DECLF]]#0 : !fir.ref<!fir.box<!fir.ptr<f32>>>) -> !fir.ref<!fir.box<!fir.ptr<f32>>> {name = "f"}382! CHECK: %[[ATTACH_G:.*]] = acc.attach varPtr(%[[DECLG]]#0 : !fir.ref<!fir.box<!fir.ptr<f32>>>) -> !fir.ref<!fir.box<!fir.ptr<f32>>> {name = "g"}383! CHECK: acc.serial {{.*}} dataOperands(%[[ATTACH_F]], %[[ATTACH_G]] : !fir.ref<!fir.box<!fir.ptr<f32>>>, !fir.ref<!fir.box<!fir.ptr<f32>>>) {384! CHECK: acc.loop {{.*}} {385! CHECK: acc.yield386! CHECK-NEXT: }{{$}}387! CHECK: acc.yield388! CHECK-NEXT: }{{$}}389 390 !$acc serial loop private(a) firstprivate(b)391 DO i = 1, n392 a(i) = b(i)393 END DO394 395! CHECK: %[[ACC_FPRIVATE_B:.*]] = acc.firstprivate varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10xf32>>) recipe(@firstprivatization_ref_10xf32) -> !fir.ref<!fir.array<10xf32>> {name = "b"}396! CHECK: acc.serial {{.*}} firstprivate(%[[ACC_FPRIVATE_B]] : !fir.ref<!fir.array<10xf32>>) {397! 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"}398! CHECK: acc.loop {{.*}} private(%[[ACC_PRIVATE_A]]{{.*}} : !fir.ref<!fir.array<10xf32>>{{.*}})399! CHECK-NOT: fir.do_loop400! CHECK: acc.yield401! CHECK-NEXT: }{{$}}402! CHECK: acc.yield403! CHECK-NEXT: }{{$}}404 405 !$acc serial loop seq406 DO i = 1, n407 a(i) = b(i)408 END DO409 410! CHECK: acc.serial {{.*}} {411! CHECK: acc.loop {{.*}} {412! CHECK: acc.yield413! CHECK-NEXT: } attributes {inclusiveUpperbound = array<i1: true>, seq = [#acc.device_type<none>]}414! CHECK: acc.yield415! CHECK-NEXT: }{{$}}416 417 !$acc serial loop auto418 DO i = 1, n419 a(i) = b(i)420 END DO421 422! CHECK: acc.serial {{.*}} {423! CHECK: acc.loop {{.*}} {424! CHECK: acc.yield425! CHECK-NEXT: } attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}426! CHECK: acc.yield427! CHECK-NEXT: }{{$}}428 429 !$acc serial loop independent430 DO i = 1, n431 a(i) = b(i)432 END DO433 434! CHECK: acc.serial {{.*}} {435! CHECK: acc.loop {{.*}} {436! CHECK: acc.yield437! CHECK-NEXT: } attributes {inclusiveUpperbound = array<i1: true>, independent = [#acc.device_type<none>]}438! CHECK: acc.yield439! CHECK-NEXT: }{{$}}440 441 !$acc serial loop gang442 DO i = 1, n443 a(i) = b(i)444 END DO445 446! CHECK: acc.serial {{.*}} {447! CHECK: acc.loop {{.*}} gang {{.*}} {448! CHECK: acc.yield449! CHECK-NEXT: } attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}450! CHECK: acc.yield451! CHECK-NEXT: }{{$}}452 453 !$acc serial loop gang(num: 8)454 DO i = 1, n455 a(i) = b(i)456 END DO457 458! CHECK: acc.serial {{.*}} {459! CHECK: [[GANGNUM1:%.*]] = arith.constant 8 : i32460! CHECK: acc.loop {{.*}} gang({num=[[GANGNUM1]] : i32}) {{.*}} {461! CHECK: acc.yield462! CHECK-NEXT: } attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}463! CHECK: acc.yield464! CHECK-NEXT: }{{$}}465 466 !$acc serial loop gang(num: gangNum)467 DO i = 1, n468 a(i) = b(i)469 END DO470 471! CHECK: acc.serial {{.*}} {472! CHECK: [[GANGNUM2:%.*]] = fir.load %{{.*}} : !fir.ref<i32>473! CHECK: acc.loop {{.*}} gang({num=[[GANGNUM2]] : i32}) {{.*}} {474! CHECK: acc.yield475! CHECK-NEXT: } attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}476! CHECK: acc.yield477! CHECK-NEXT: }{{$}}478 479 !$acc serial loop gang(num: gangNum, static: gangStatic)480 DO i = 1, n481 a(i) = b(i)482 END DO483 484! CHECK: acc.serial {{.*}} {485! CHECK: acc.loop {{.*}} gang({num=%{{.*}} : i32, static=%{{.*}} : i32}) {{.*}} {486! CHECK: acc.yield487! CHECK-NEXT: } attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}488! CHECK: acc.yield489! CHECK-NEXT: }{{$}}490 491 !$acc serial loop vector492 DO i = 1, n493 a(i) = b(i)494 END DO495 496! CHECK: acc.serial {{.*}} {497! CHECK: acc.loop {{.*}} vector {{.*}} {498! CHECK: acc.yield499! CHECK-NEXT: } attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}500! CHECK: acc.yield501! CHECK-NEXT: }{{$}}502 503 !$acc serial loop vector(128)504 DO i = 1, n505 a(i) = b(i)506 END DO507 508! CHECK: acc.serial {{.*}} {509! CHECK: [[CONSTANT128:%.*]] = arith.constant 128 : i32510! CHECK: acc.loop {{.*}} vector([[CONSTANT128]] : i32) {{.*}} {511! CHECK: acc.yield512! CHECK-NEXT: } attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}513! CHECK: acc.yield514! CHECK-NEXT: }{{$}}515 516 !$acc serial loop vector(vectorLength)517 DO i = 1, n518 a(i) = b(i)519 END DO520 521! CHECK: acc.serial {{.*}} {522! CHECK: [[VECTORLENGTH:%.*]] = fir.load %{{.*}} : !fir.ref<i32>523! CHECK: acc.loop {{.*}} vector([[VECTORLENGTH]] : i32) {{.*}} {524! CHECK: acc.yield525! CHECK-NEXT: } attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}526! CHECK: acc.yield527! CHECK-NEXT: }{{$}}528 529 !$acc serial loop worker530 DO i = 1, n531 a(i) = b(i)532 END DO533 534! CHECK: acc.serial {{.*}} {535! CHECK: acc.loop {{.*}} worker {{.*}} {536! CHECK: acc.yield537! CHECK-NEXT: } attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}538! CHECK: acc.yield539! CHECK-NEXT: }{{$}}540 541 !$acc serial loop worker(128)542 DO i = 1, n543 a(i) = b(i)544 END DO545 546! CHECK: acc.serial {{.*}} {547! CHECK: [[WORKER128:%.*]] = arith.constant 128 : i32548! CHECK: acc.loop {{.*}} worker([[WORKER128]] : i32) {{.*}} {549! CHECK: acc.yield550! CHECK-NEXT: } attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}551! CHECK: acc.yield552! CHECK-NEXT: }{{$}}553 554 !$acc serial loop collapse(2)555 DO i = 1, n556 DO j = 1, n557 d(i, j) = e(i, j)558 END DO559 END DO560 561! CHECK: acc.serial {{.*}} {562! CHECK: acc.loop {{.*}} {563! CHECK-NOT: fir.do_loop564! CHECK: acc.yield565! CHECK-NEXT: } attributes {{{.*}}collapse = [2], collapseDeviceType = [#acc.device_type<none>]{{.*}}}566! CHECK: acc.yield567! CHECK-NEXT: }{{$}}568 569 !$acc serial loop570 DO i = 1, n571 !$acc loop572 DO j = 1, n573 d(i, j) = e(i, j)574 END DO575 END DO576 577! CHECK: acc.serial {{.*}} {578! CHECK: acc.loop {{.*}} {579! CHECK: acc.loop {{.*}} {580! CHECK: acc.yield581! CHECK-NEXT: } attributes {{{.*}}seq = [#acc.device_type<none>]}582! CHECK: acc.yield583! CHECK-NEXT: } attributes {{{.*}}seq = [#acc.device_type<none>]}584! CHECK: acc.yield585! CHECK-NEXT: }{{$}}586 587 !$acc serial loop tile(2)588 DO i = 1, n589 a(i) = b(i)590 END DO591 592! CHECK: acc.serial {{.*}} {593! CHECK: [[TILESIZE:%.*]] = arith.constant 2 : i32594! CHECK: acc.loop {{.*}} tile({[[TILESIZE]] : i32}) {{.*}} {595! CHECK: acc.yield596! CHECK-NEXT: }{{$}}597! CHECK: acc.yield598! CHECK-NEXT: }{{$}}599 600 !$acc serial loop tile(*)601 DO i = 1, n602 a(i) = b(i)603 END DO604 605! CHECK: acc.serial {{.*}} {606! CHECK: [[TILESIZEM1:%.*]] = arith.constant -1 : i32607! CHECK: acc.loop {{.*}} tile({[[TILESIZEM1]] : i32}) {{.*}} {608! CHECK: acc.yield609! CHECK-NEXT: }{{$}}610! CHECK: acc.yield611! CHECK-NEXT: }{{$}}612 613 !$acc serial loop tile(2, 2)614 DO i = 1, n615 DO j = 1, n616 d(i, j) = e(i, j)617 END DO618 END DO619 620! CHECK: acc.serial {{.*}} {621! CHECK: [[TILESIZE1:%.*]] = arith.constant 2 : i32622! CHECK: [[TILESIZE2:%.*]] = arith.constant 2 : i32623! CHECK: acc.loop {{.*}} tile({[[TILESIZE1]] : i32, [[TILESIZE2]] : i32}) control(%arg0 : i32, %arg1 : i32) {{.*}} {624! CHECK: acc.yield625! CHECK-NEXT: }{{$}}626! CHECK: acc.yield627! CHECK-NEXT: }{{$}}628 629 !$acc serial loop tile(tileSize)630 DO i = 1, n631 a(i) = b(i)632 END DO633 634! CHECK: acc.serial {{.*}} {635! CHECK: acc.loop {{.*}} tile({%{{.*}} : i32}) {{.*}} {636! CHECK: acc.yield637! CHECK-NEXT: }{{$}}638! CHECK: acc.yield639! CHECK-NEXT: }{{$}}640 641 !$acc serial loop tile(tileSize, tileSize)642 DO i = 1, n643 DO j = 1, n644 d(i, j) = e(i, j)645 END DO646 END DO647 648! CHECK: acc.serial {{.*}} {649! CHECK: acc.loop {{.*}} tile({%{{.*}} : i32, %{{.*}} : i32}) control(%arg0 : i32, %arg1 : i32) {{.*}} {650! CHECK: acc.yield651! CHECK-NEXT: }{{$}}652! CHECK: acc.yield653! CHECK-NEXT: }{{$}}654 655 !$acc serial loop reduction(+:reduction_r) reduction(*:reduction_i)656 do i = 1, n657 reduction_r = reduction_r + a(i)658 reduction_i = 1659 end do660 661! CHECK: %[[COPYINREDR:.*]] = acc.copyin varPtr(%{{.*}} : !fir.ref<f32>) -> !fir.ref<f32> {dataClause = #acc<data_clause acc_reduction>, implicit = true, name = "reduction_r"}662! CHECK: %[[COPYINREDI:.*]] = acc.copyin varPtr(%{{.*}} : !fir.ref<i32>) -> !fir.ref<i32> {dataClause = #acc<data_clause acc_reduction>, implicit = true, name = "reduction_i"}663! CHECK: acc.serial {{.*}} dataOperands(%[[COPYINREDR]], %[[COPYINREDI]] : !fir.ref<f32>, !fir.ref<i32>) {664! CHECK: %[[REDUCTION_R:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add_ref_f32) -> !fir.ref<f32> {name = "reduction_r"}665! CHECK: %[[REDUCTION_I:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_mul_ref_i32) -> !fir.ref<i32> {name = "reduction_i"}666! CHECK: acc.loop {{.*}} reduction(%[[REDUCTION_R]], %[[REDUCTION_I]] : !fir.ref<f32>, !fir.ref<i32>)667! CHECK-NOT: fir.do_loop668! CHECK: acc.yield669! CHECK-NEXT: }{{$}}670! CHECK: acc.yield671! CHECK-NEXT: }{{$}}672! CHECK: acc.copyout accPtr(%[[COPYINREDR]] : !fir.ref<f32>) to varPtr(%{{.*}} : !fir.ref<f32>) {dataClause = #acc<data_clause acc_reduction>, implicit = true, name = "reduction_r"}673! CHECK: acc.copyout accPtr(%[[COPYINREDI]] : !fir.ref<i32>) to varPtr(%{{.*}} : !fir.ref<i32>) {dataClause = #acc<data_clause acc_reduction>, implicit = true, name = "reduction_i"}674 675end subroutine acc_serial_loop676