362 lines · plain
1! This test checks lowering of OpenACC parallel directive.2 3! RUN: bbc -fopenacc -emit-hlfir %s -o - | FileCheck %s4 5! CHECK-LABEL: acc.firstprivate.recipe @firstprivatization_ref_10x10xf32 : !fir.ref<!fir.array<10x10xf32>> init {6! CHECK: ^bb0(%{{.*}}: !fir.ref<!fir.array<10x10xf32>>):7! CHECK: %[[SHAPE:.*]] = fir.shape %{{.*}}, %{{.*}} : (index, index) -> !fir.shape<2>8! CHECK: %[[ALLOCA:.*]] = fir.alloca !fir.array<10x10xf32>9! CHECK: %[[DECLARE:.*]]:2 = hlfir.declare %[[ALLOCA]](%[[SHAPE]]) {uniq_name = "acc.private.init"} : (!fir.ref<!fir.array<10x10xf32>>, !fir.shape<2>) -> (!fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>)10! CHECK: acc.yield %[[DECLARE]]#0 : !fir.ref<!fir.array<10x10xf32>>11! CHECK: } copy {12! CHECK: ^bb0(%arg0: !fir.ref<!fir.array<10x10xf32>>, %arg1: !fir.ref<!fir.array<10x10xf32>>):13! CHECK: acc.terminator14! CHECK: }15 16! CHECK-LABEL: acc.private.recipe @privatization_ref_10x10xf32 : !fir.ref<!fir.array<10x10xf32>> init {17! CHECK: ^bb0(%{{.*}}: !fir.ref<!fir.array<10x10xf32>>):18! CHECK: %[[SHAPE:.*]] = fir.shape %{{.*}}, %{{.*}} : (index, index) -> !fir.shape<2>19! CHECK: %[[DECLARE:.*]]:2 = hlfir.declare %[[ALLOCA]](%[[SHAPE]]) {uniq_name = "acc.private.init"} : (!fir.ref<!fir.array<10x10xf32>>, !fir.shape<2>) -> (!fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>)20! CHECK: acc.yield %[[DECLARE]]#0 : !fir.ref<!fir.array<10x10xf32>>21! CHECK: }22 23! CHECK-LABEL: func.func @_QPacc_parallel()24 25subroutine acc_parallel26 integer :: i, j27 28 integer :: async = 129 integer :: wait1 = 130 integer :: wait2 = 231 integer :: numGangs = 132 integer :: numWorkers = 1033 integer :: vectorLength = 12834 logical :: ifCondition = .TRUE.35 real, dimension(10, 10) :: a, b, c36 real, pointer :: d, e37 integer :: reduction_i38 real :: reduction_r39 40! CHECK: %[[A:.*]] = fir.alloca !fir.array<10x10xf32> {{{.*}}uniq_name = "{{.*}}Ea"}41! CHECK: %[[DECLA:.*]]:2 = hlfir.declare %[[A]]42! CHECK: %[[B:.*]] = fir.alloca !fir.array<10x10xf32> {{{.*}}uniq_name = "{{.*}}Eb"}43! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]]44! CHECK: %[[C:.*]] = fir.alloca !fir.array<10x10xf32> {{{.*}}uniq_name = "{{.*}}Ec"}45! CHECK: %[[DECLC:.*]]:2 = hlfir.declare %[[C]]46! CHECK: %[[D:.*]] = fir.alloca !fir.box<!fir.ptr<f32>> {bindc_name = "d", uniq_name = "{{.*}}Ed"}47! CHECK: %[[DECLD:.*]]:2 = hlfir.declare %[[D]]48! CHECK: %[[E:.*]] = fir.alloca !fir.box<!fir.ptr<f32>> {bindc_name = "e", uniq_name = "{{.*}}Ee"}49! CHECK: %[[DECLE:.*]]:2 = hlfir.declare %[[E]]50! CHECK: %[[IFCONDITION:.*]] = fir.address_of(@{{.*}}ifcondition) : !fir.ref<!fir.logical<4>>51! CHECK: %[[DECLIFCONDITION:.*]]:2 = hlfir.declare %[[IFCONDITION]]52 53 !$acc parallel54 !$acc end parallel55 56! CHECK: acc.parallel {57! CHECK: acc.yield58! CHECK-NEXT: }{{$}}59 60 !$acc parallel async61 !$acc end parallel62 63! CHECK: acc.parallel async {64! CHECK: acc.yield65! CHECK-NEXT: }66 67 !$acc parallel async(1)68 !$acc end parallel69 70! CHECK: [[ASYNC1:%.*]] = arith.constant 1 : i3271! CHECK: acc.parallel async([[ASYNC1]] : i32) {72! CHECK: acc.yield73! CHECK-NEXT: }{{$}}74 75 !$acc parallel async(async)76 !$acc end parallel77 78! CHECK: [[ASYNC2:%.*]] = fir.load %{{.*}} : !fir.ref<i32>79! CHECK-NEXT: acc.parallel async([[ASYNC2]] : i32) {80! CHECK: acc.yield81! CHECK-NEXT: }{{$}}82 83 !$acc parallel wait84 !$acc end parallel85 86! CHECK: acc.parallel wait {87! CHECK: acc.yield88! CHECK-NEXT: }89 90 !$acc parallel wait(1)91 !$acc end parallel92 93! CHECK: [[WAIT1:%.*]] = arith.constant 1 : i3294! CHECK: acc.parallel wait({[[WAIT1]] : i32}) {95! CHECK: acc.yield96! CHECK-NEXT: }{{$}}97 98 !$acc parallel wait(1, 2)99 !$acc end parallel100 101! CHECK: [[WAIT2:%.*]] = arith.constant 1 : i32102! CHECK: [[WAIT3:%.*]] = arith.constant 2 : i32103! CHECK: acc.parallel wait({[[WAIT2]] : i32, [[WAIT3]] : i32}) {104! CHECK: acc.yield105! CHECK-NEXT: }{{$}}106 107 !$acc parallel wait(wait1, wait2)108 !$acc end parallel109 110! CHECK: [[WAIT4:%.*]] = fir.load %{{.*}} : !fir.ref<i32>111! CHECK: [[WAIT5:%.*]] = fir.load %{{.*}} : !fir.ref<i32>112! CHECK: acc.parallel wait({[[WAIT4]] : i32, [[WAIT5]] : i32}) {113! CHECK: acc.yield114! CHECK-NEXT: }{{$}}115 116 !$acc parallel num_gangs(1)117 !$acc end parallel118 119! CHECK: [[NUMGANGS1:%.*]] = arith.constant 1 : i32120! CHECK: acc.parallel num_gangs({[[NUMGANGS1]] : i32}) {121! CHECK: acc.yield122! CHECK-NEXT: }{{$}}123 124 !$acc parallel num_gangs(numGangs)125 !$acc end parallel126 127! CHECK: [[NUMGANGS2:%.*]] = fir.load %{{.*}} : !fir.ref<i32>128! CHECK: acc.parallel num_gangs({[[NUMGANGS2]] : i32}) {129! CHECK: acc.yield130! CHECK-NEXT: }{{$}}131 132 !$acc parallel num_gangs(1, 1, 1)133 !$acc end parallel134 135! CHECK: acc.parallel num_gangs({%{{.*}} : i32, %{{.*}} : i32, %{{.*}} : i32}) {136! CHECK: acc.yield137! CHECK-NEXT: }{{$}}138 139 !$acc parallel num_workers(10)140 !$acc end parallel141 142! CHECK: [[NUMWORKERS1:%.*]] = arith.constant 10 : i32143! CHECK: acc.parallel num_workers([[NUMWORKERS1]] : i32) {144! CHECK: acc.yield145! CHECK-NEXT: }{{$}}146 147 !$acc parallel num_workers(numWorkers)148 !$acc end parallel149 150! CHECK: [[NUMWORKERS2:%.*]] = fir.load %{{.*}} : !fir.ref<i32>151! CHECK: acc.parallel num_workers([[NUMWORKERS2]] : i32) {152! CHECK: acc.yield153! CHECK-NEXT: }{{$}}154 155 !$acc parallel vector_length(128)156 !$acc end parallel157 158! CHECK: [[VECTORLENGTH1:%.*]] = arith.constant 128 : i32159! CHECK: acc.parallel vector_length([[VECTORLENGTH1]] : i32) {160! CHECK: acc.yield161! CHECK-NEXT: }{{$}}162 163 !$acc parallel vector_length(vectorLength)164 !$acc end parallel165 166! CHECK: [[VECTORLENGTH2:%.*]] = fir.load %{{.*}} : !fir.ref<i32>167! CHECK: acc.parallel vector_length([[VECTORLENGTH2]] : i32) {168! CHECK: acc.yield169! CHECK-NEXT: }{{$}}170 171 !$acc parallel if(.TRUE.)172 !$acc end parallel173 174! CHECK: [[IF1:%.*]] = arith.constant true175! CHECK: acc.parallel if([[IF1]]) {176! CHECK: acc.yield177! CHECK-NEXT: }{{$}}178 179 !$acc parallel if(ifCondition)180 !$acc end parallel181 182! CHECK: [[IFCOND:%.*]] = fir.load %{{.*}} : !fir.ref<!fir.logical<4>>183! CHECK: [[IF2:%.*]] = fir.convert [[IFCOND]] : (!fir.logical<4>) -> i1184! CHECK: acc.parallel if([[IF2]]) {185! CHECK: acc.yield186! CHECK-NEXT: }{{$}}187 188 !$acc parallel self(.TRUE.)189 !$acc end parallel190 191! CHECK: [[SELF1:%.*]] = arith.constant true192! CHECK: acc.parallel self([[SELF1]]) {193! CHECK: acc.yield194! CHECK-NEXT: }{{$}}195 196 !$acc parallel self197 !$acc end parallel198 199! CHECK: acc.parallel {200! CHECK: acc.yield201! CHECK-NEXT: } attributes {selfAttr}202 203 !$acc parallel self(ifCondition)204 !$acc end parallel205 206! CHECK: %[[SELF2:.*]] = fir.convert %[[DECLIFCONDITION]]#0 : (!fir.ref<!fir.logical<4>>) -> i1207! CHECK: acc.parallel self(%[[SELF2]]) {208! CHECK: acc.yield209! CHECK-NEXT: }{{$}}210 211 !$acc parallel copy(a, b, c)212 !$acc end parallel213 214! CHECK: %[[COPYIN_A:.*]] = acc.copyin varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {dataClause = #acc<data_clause acc_copy>, name = "a"}215! CHECK: %[[COPYIN_B:.*]] = acc.copyin varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {dataClause = #acc<data_clause acc_copy>, name = "b"}216! CHECK: %[[COPYIN_C:.*]] = acc.copyin varPtr(%[[DECLC]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {dataClause = #acc<data_clause acc_copy>, name = "c"}217! CHECK: acc.parallel dataOperands(%[[COPYIN_A]], %[[COPYIN_B]], %[[COPYIN_C]] : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) {218! CHECK: acc.yield219! CHECK-NEXT: }{{$}}220! CHECK: acc.copyout accPtr(%[[COPYIN_A]] : !fir.ref<!fir.array<10x10xf32>>) to varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_copy>, name = "a"}221! CHECK: acc.copyout accPtr(%[[COPYIN_B]] : !fir.ref<!fir.array<10x10xf32>>) to varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_copy>, name = "b"}222! CHECK: acc.copyout accPtr(%[[COPYIN_C]] : !fir.ref<!fir.array<10x10xf32>>) to varPtr(%[[DECLC]]#0 : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_copy>, name = "c"}223 224 !$acc parallel copy(a) copy(b) copy(c)225 !$acc end parallel226 227 228! CHECK: %[[COPYIN_A:.*]] = acc.copyin varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {dataClause = #acc<data_clause acc_copy>, name = "a"}229! CHECK: %[[COPYIN_B:.*]] = acc.copyin varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {dataClause = #acc<data_clause acc_copy>, name = "b"}230! CHECK: %[[COPYIN_C:.*]] = acc.copyin varPtr(%[[DECLC]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {dataClause = #acc<data_clause acc_copy>, name = "c"}231! CHECK: acc.parallel dataOperands(%[[COPYIN_A]], %[[COPYIN_B]], %[[COPYIN_C]] : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) {232! CHECK: acc.yield233! CHECK-NEXT: }{{$}}234! CHECK: acc.copyout accPtr(%[[COPYIN_A]] : !fir.ref<!fir.array<10x10xf32>>) to varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_copy>, name = "a"}235! CHECK: acc.copyout accPtr(%[[COPYIN_B]] : !fir.ref<!fir.array<10x10xf32>>) to varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_copy>, name = "b"}236! CHECK: acc.copyout accPtr(%[[COPYIN_C]] : !fir.ref<!fir.array<10x10xf32>>) to varPtr(%[[DECLC]]#0 : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_copy>, name = "c"}237 238 !$acc parallel copyin(a) copyin(readonly: b, c)239 !$acc end parallel240 241! CHECK: %[[COPYIN_A:.*]] = acc.copyin varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {name = "a"}242! CHECK: %[[COPYIN_B:.*]] = acc.copyin varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {dataClause = #acc<data_clause acc_copyin_readonly>, name = "b"}243! CHECK: %[[COPYIN_C:.*]] = acc.copyin varPtr(%[[DECLC]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {dataClause = #acc<data_clause acc_copyin_readonly>, name = "c"}244! CHECK: acc.parallel dataOperands(%[[COPYIN_A]], %[[COPYIN_B]], %[[COPYIN_C]] : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) {245! CHECK: acc.yield246! CHECK-NEXT: }{{$}}247! CHECK: acc.delete accPtr(%[[COPYIN_A]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_copyin>, name = "a"}248! CHECK: acc.delete accPtr(%[[COPYIN_B]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_copyin_readonly>, name = "b"}249! CHECK: acc.delete accPtr(%[[COPYIN_C]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_copyin_readonly>, name = "c"}250 251 !$acc parallel copyout(a) copyout(zero: b) copyout(c)252 !$acc end parallel253 254! CHECK: %[[CREATE_A:.*]] = acc.create varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {dataClause = #acc<data_clause acc_copyout>, name = "a"}255! CHECK: %[[CREATE_B:.*]] = acc.create varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {dataClause = #acc<data_clause acc_copyout_zero>, name = "b"}256! CHECK: %[[CREATE_C:.*]] = acc.create varPtr(%[[DECLC]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {dataClause = #acc<data_clause acc_copyout>, name = "c"}257! CHECK: acc.parallel dataOperands(%[[CREATE_A]], %[[CREATE_B]], %[[CREATE_C]] : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) {258! CHECK: acc.yield259! CHECK-NEXT: }{{$}}260! CHECK: acc.copyout accPtr(%[[CREATE_A]] : !fir.ref<!fir.array<10x10xf32>>) to varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) {name = "a"}261! CHECK: acc.copyout accPtr(%[[CREATE_B]] : !fir.ref<!fir.array<10x10xf32>>) to varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_copyout_zero>, name = "b"}262! CHECK: acc.copyout accPtr(%[[CREATE_C]] : !fir.ref<!fir.array<10x10xf32>>) to varPtr(%[[DECLC]]#0 : !fir.ref<!fir.array<10x10xf32>>) {name = "c"}263 264 !$acc parallel create(a, b) create(zero: c)265 !$acc end parallel266 267! CHECK: %[[CREATE_A:.*]] = acc.create varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {name = "a"}268! CHECK: %[[CREATE_B:.*]] = acc.create varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {name = "b"}269! CHECK: %[[CREATE_C:.*]] = acc.create varPtr(%[[DECLC]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {dataClause = #acc<data_clause acc_create_zero>, name = "c"}270! CHECK: acc.parallel dataOperands(%[[CREATE_A]], %[[CREATE_B]], %[[CREATE_C]] : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) {271! CHECK: acc.yield272! CHECK-NEXT: }{{$}}273! CHECK: acc.delete accPtr(%[[CREATE_A]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_create>, name = "a"}274! CHECK: acc.delete accPtr(%[[CREATE_B]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_create>, name = "b"}275! CHECK: acc.delete accPtr(%[[CREATE_C]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_create_zero>, name = "c"}276 277 !$acc parallel create(c) copy(b) create(a)278 !$acc end parallel279! CHECK: %[[CREATE_C:.*]] = acc.create varPtr(%[[DECLC]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {name = "c"}280! CHECK: %[[COPY_B:.*]] = acc.copyin varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {dataClause = #acc<data_clause acc_copy>, name = "b"}281! CHECK: %[[CREATE_A:.*]] = acc.create varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {name = "a"}282! CHECK: acc.parallel dataOperands(%[[CREATE_C]], %[[COPY_B]], %[[CREATE_A]] : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) {283 284 !$acc parallel no_create(a, b) create(zero: c)285 !$acc end parallel286 287! CHECK: %[[NO_CREATE_A:.*]] = acc.nocreate varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {name = "a"}288! CHECK: %[[NO_CREATE_B:.*]] = acc.nocreate varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {name = "b"}289! CHECK: %[[CREATE_C:.*]] = acc.create varPtr(%[[DECLC]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {dataClause = #acc<data_clause acc_create_zero>, name = "c"}290! CHECK: acc.parallel dataOperands(%[[NO_CREATE_A]], %[[NO_CREATE_B]], %[[CREATE_C]] : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) {291! CHECK: acc.yield292! CHECK-NEXT: }{{$}}293! CHECK: acc.delete accPtr(%[[CREATE_C]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_create_zero>, name = "c"}294! CHECK: acc.delete accPtr(%[[NO_CREATE_A]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_no_create>, name = "a"}295! CHECK: acc.delete accPtr(%[[NO_CREATE_B]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_no_create>, name = "b"}296 297 !$acc parallel present(a, b, c)298 !$acc end parallel299 300! CHECK: %[[PRESENT_A:.*]] = acc.present varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {name = "a"}301! CHECK: %[[PRESENT_B:.*]] = acc.present varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {name = "b"}302! CHECK: %[[PRESENT_C:.*]] = acc.present varPtr(%[[DECLC]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {name = "c"}303! CHECK: acc.parallel dataOperands(%[[PRESENT_A]], %[[PRESENT_B]], %[[PRESENT_C]] : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) {304! CHECK: acc.yield305! CHECK-NEXT: }{{$}}306! CHECK: acc.delete accPtr(%[[PRESENT_A]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_present>, name = "a"}307! CHECK: acc.delete accPtr(%[[PRESENT_B]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_present>, name = "b"}308! CHECK: acc.delete accPtr(%[[PRESENT_C]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_present>, name = "c"}309 310 !$acc parallel deviceptr(a) deviceptr(c)311 !$acc end parallel312 313! CHECK: %[[DEVICEPTR_A:.*]] = acc.deviceptr varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {name = "a"}314! CHECK: %[[DEVICEPTR_C:.*]] = acc.deviceptr varPtr(%[[DECLC]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {name = "c"}315! CHECK: acc.parallel dataOperands(%[[DEVICEPTR_A]], %[[DEVICEPTR_C]] : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) {316! CHECK: acc.yield317! CHECK-NEXT: }{{$}}318 319 !$acc parallel attach(d, e)320 !$acc end parallel321 322! CHECK: %[[ATTACH_D:.*]] = acc.attach varPtr(%[[DECLD]]#0 : !fir.ref<!fir.box<!fir.ptr<f32>>>) -> !fir.ref<!fir.box<!fir.ptr<f32>>> {name = "d"}323! CHECK: %[[ATTACH_E:.*]] = acc.attach varPtr(%[[DECLE]]#0 : !fir.ref<!fir.box<!fir.ptr<f32>>>) -> !fir.ref<!fir.box<!fir.ptr<f32>>> {name = "e"}324! CHECK: acc.parallel dataOperands(%[[ATTACH_D]], %[[ATTACH_E]] : !fir.ref<!fir.box<!fir.ptr<f32>>>, !fir.ref<!fir.box<!fir.ptr<f32>>>) {325! CHECK: acc.yield326! CHECK-NEXT: }{{$}}327! CHECK: acc.detach accPtr(%[[ATTACH_D]] : !fir.ref<!fir.box<!fir.ptr<f32>>>) {dataClause = #acc<data_clause acc_attach>, name = "d"}328! CHECK: acc.detach accPtr(%[[ATTACH_E]] : !fir.ref<!fir.box<!fir.ptr<f32>>>) {dataClause = #acc<data_clause acc_attach>, name = "e"}329 330!$acc parallel private(a) firstprivate(b) private(c) async(1)331!$acc end parallel332 333! CHECK: %[[ACC_PRIVATE_A:.*]] = acc.private varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) async([[ASYNC3:%.*]]) recipe(@privatization_ref_10x10xf32) -> !fir.ref<!fir.array<10x10xf32>> {name = "a"}334! CHECK: %[[ACC_FPRIVATE_B:.*]] = acc.firstprivate varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10x10xf32>>) async([[ASYNC3]]) recipe(@firstprivatization_ref_10x10xf32) -> !fir.ref<!fir.array<10x10xf32>> {name = "b"}335! CHECK: %[[ACC_PRIVATE_C:.*]] = acc.private varPtr(%[[DECLC]]#0 : !fir.ref<!fir.array<10x10xf32>>) async([[ASYNC3]]) recipe(@privatization_ref_10x10xf32) -> !fir.ref<!fir.array<10x10xf32>> {name = "c"}336! CHECK: acc.parallel async([[ASYNC3]]) firstprivate(%[[ACC_FPRIVATE_B]] : !fir.ref<!fir.array<10x10xf32>>) private(%[[ACC_PRIVATE_A]], %[[ACC_PRIVATE_C]] : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) {337! CHECK: acc.yield338! CHECK-NEXT: }{{$}}339 340!$acc parallel reduction(+:reduction_r) reduction(*:reduction_i)341!$acc end parallel342 343! CHECK: %[[REDUCTION_R:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<f32>) recipe(@reduction_add_ref_f32) -> !fir.ref<f32>344! CHECK: %[[REDUCTION_I:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_mul_ref_i32) -> !fir.ref<i32>345! CHECK: acc.parallel reduction(%[[REDUCTION_R]], %[[REDUCTION_I]] : !fir.ref<f32>, !fir.ref<i32>) {346! CHECK: acc.yield347! CHECK-NEXT: }{{$}}348 349!$acc parallel default(none)350!$acc end parallel351 352! CHECK: acc.parallel {353! CHECK: } attributes {defaultAttr = #acc<defaultvalue none>}354 355!$acc parallel default(present)356!$acc end parallel357 358! CHECK: acc.parallel {359! CHECK: } attributes {defaultAttr = #acc<defaultvalue present>}360 361end subroutine acc_parallel362