brintos

brintos / llvm-project-archived public Read only

0
0
Text · 24.7 KiB · b5bff63 Raw
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