304 lines · plain
1! This test checks lowering of OpenACC kernels construct.2 3! RUN: bbc -fopenacc -emit-hlfir %s -o - | FileCheck %s4 5subroutine acc_kernels6 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 real, dimension(10, 10) :: a, b, c16 real, pointer :: d, e17 18! CHECK: %[[A:.*]] = fir.alloca !fir.array<10x10xf32> {{{.*}}uniq_name = "{{.*}}Ea"}19! CHECK: %[[DECLA:.*]]:2 = hlfir.declare %[[A]]20! CHECK: %[[B:.*]] = fir.alloca !fir.array<10x10xf32> {{{.*}}uniq_name = "{{.*}}Eb"}21! CHECK: %[[DECLB:.*]]:2 = hlfir.declare %[[B]]22! CHECK: %[[C:.*]] = fir.alloca !fir.array<10x10xf32> {{{.*}}uniq_name = "{{.*}}Ec"}23! CHECK: %[[DECLC:.*]]:2 = hlfir.declare %[[C]]24! CHECK: %[[D:.*]] = fir.alloca !fir.box<!fir.ptr<f32>> {bindc_name = "d", uniq_name = "{{.*}}Ed"}25! CHECK: %[[DECLD:.*]]:2 = hlfir.declare %[[D]]26! CHECK: %[[E:.*]] = fir.alloca !fir.box<!fir.ptr<f32>> {bindc_name = "e", uniq_name = "{{.*}}Ee"}27! CHECK: %[[DECLE:.*]]:2 = hlfir.declare %[[E]]28! CHECK: %[[IFCONDITION:.*]] = fir.address_of(@{{.*}}ifcondition) : !fir.ref<!fir.logical<4>>29! CHECK: %[[DECLIFCONDITION:.*]]:2 = hlfir.declare %[[IFCONDITION]]30 31 !$acc kernels32 !$acc end kernels33 34! CHECK: acc.kernels {35! CHECK: acc.terminator36! CHECK-NEXT: }{{$}}37 38 !$acc kernels async39 !$acc end kernels40 41! CHECK: acc.kernels async {42! CHECK: acc.terminator43! CHECK-NEXT: }44 45 !$acc kernels async(1)46 !$acc end kernels47 48! CHECK: [[ASYNC1:%.*]] = arith.constant 1 : i3249! CHECK: acc.kernels async([[ASYNC1]] : i32) {50! CHECK: acc.terminator51! CHECK-NEXT: }{{$}}52 53 !$acc kernels async(async)54 !$acc end kernels55 56! CHECK: [[ASYNC2:%.*]] = fir.load %{{.*}} : !fir.ref<i32>57! CHECK: acc.kernels async([[ASYNC2]] : i32) {58! CHECK: acc.terminator59! CHECK-NEXT: }{{$}}60 61 !$acc kernels wait62 !$acc end kernels63 64! CHECK: acc.kernels wait {65! CHECK: acc.terminator66! CHECK-NEXT: }67 68 !$acc kernels wait(1)69 !$acc end kernels70 71! CHECK: [[WAIT1:%.*]] = arith.constant 1 : i3272! CHECK: acc.kernels wait({[[WAIT1]] : i32}) {73! CHECK: acc.terminator74! CHECK-NEXT: }{{$}}75 76 !$acc kernels wait(1, 2)77 !$acc end kernels78 79! CHECK: [[WAIT2:%.*]] = arith.constant 1 : i3280! CHECK: [[WAIT3:%.*]] = arith.constant 2 : i3281! CHECK: acc.kernels wait({[[WAIT2]] : i32, [[WAIT3]] : i32}) {82! CHECK: acc.terminator83! CHECK-NEXT: }{{$}}84 85 !$acc kernels wait(wait1, wait2)86 !$acc end kernels87 88! CHECK: [[WAIT4:%.*]] = fir.load %{{.*}} : !fir.ref<i32>89! CHECK: [[WAIT5:%.*]] = fir.load %{{.*}} : !fir.ref<i32>90! CHECK: acc.kernels wait({[[WAIT4]] : i32, [[WAIT5]] : i32}) {91! CHECK: acc.terminator92! CHECK-NEXT: }{{$}}93 94 !$acc kernels num_gangs(1)95 !$acc end kernels96 97! CHECK: [[NUMGANGS1:%.*]] = arith.constant 1 : i3298! CHECK: acc.kernels num_gangs({[[NUMGANGS1]] : i32}) {99! CHECK: acc.terminator100! CHECK-NEXT: }{{$}}101 102 !$acc kernels num_gangs(numGangs)103 !$acc end kernels104 105! CHECK: [[NUMGANGS2:%.*]] = fir.load %{{.*}} : !fir.ref<i32>106! CHECK: acc.kernels num_gangs({[[NUMGANGS2]] : i32}) {107! CHECK: acc.terminator108! CHECK-NEXT: }{{$}}109 110 !$acc kernels num_workers(10)111 !$acc end kernels112 113! CHECK: [[NUMWORKERS1:%.*]] = arith.constant 10 : i32114! CHECK: acc.kernels num_workers([[NUMWORKERS1]] : i32) {115! CHECK: acc.terminator116! CHECK-NEXT: }{{$}}117 118 !$acc kernels num_workers(numWorkers)119 !$acc end kernels120 121! CHECK: [[NUMWORKERS2:%.*]] = fir.load %{{.*}} : !fir.ref<i32>122! CHECK: acc.kernels num_workers([[NUMWORKERS2]] : i32) {123! CHECK: acc.terminator124! CHECK-NEXT: }{{$}}125 126 !$acc kernels vector_length(128)127 !$acc end kernels128 129! CHECK: [[VECTORLENGTH1:%.*]] = arith.constant 128 : i32130! CHECK: acc.kernels vector_length([[VECTORLENGTH1]] : i32) {131! CHECK: acc.terminator132! CHECK-NEXT: }{{$}}133 134 !$acc kernels vector_length(vectorLength)135 !$acc end kernels136 137! CHECK: [[VECTORLENGTH2:%.*]] = fir.load %{{.*}} : !fir.ref<i32>138! CHECK: acc.kernels vector_length([[VECTORLENGTH2]] : i32) {139! CHECK: acc.terminator140! CHECK-NEXT: }{{$}}141 142 !$acc kernels if(.TRUE.)143 !$acc end kernels144 145! CHECK: [[IF1:%.*]] = arith.constant true146! CHECK: acc.kernels if([[IF1]]) {147! CHECK: acc.terminator148! CHECK-NEXT: }{{$}}149 150 !$acc kernels if(ifCondition)151 !$acc end kernels152 153! CHECK: [[IFCOND:%.*]] = fir.load %{{.*}} : !fir.ref<!fir.logical<4>>154! CHECK: [[IF2:%.*]] = fir.convert [[IFCOND]] : (!fir.logical<4>) -> i1155! CHECK: acc.kernels if([[IF2]]) {156! CHECK: acc.terminator157! CHECK-NEXT: }{{$}}158 159 !$acc kernels self(.TRUE.)160 !$acc end kernels161 162! CHECK: [[SELF1:%.*]] = arith.constant true163! CHECK: acc.kernels self([[SELF1]]) {164! CHECK: acc.terminator165! CHECK-NEXT: }{{$}}166 167 !$acc kernels self168 !$acc end kernels169 170! CHECK: acc.kernels {171! CHECK: acc.terminator172! CHECK-NEXT: } attributes {selfAttr}173 174 !$acc kernels self(ifCondition)175 !$acc end kernels176 177! CHECK: %[[SELF2:.*]] = fir.convert %[[DECLIFCONDITION]]#0 : (!fir.ref<!fir.logical<4>>) -> i1178! CHECK: acc.kernels self(%[[SELF2]]) {179! CHECK: acc.terminator180! CHECK-NEXT: }{{$}}181 182 !$acc kernels copy(a, b, c)183 !$acc end kernels184 185! 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"}186! 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"}187! 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"}188! CHECK: acc.kernels dataOperands(%[[COPYIN_A]], %[[COPYIN_B]], %[[COPYIN_C]] : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) {189! CHECK: acc.terminator190! CHECK-NEXT: }{{$}}191! 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"}192! 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"}193! 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"}194 195 !$acc kernels copy(a) copy(b) copy(c)196 !$acc end kernels197 198! 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"}199! 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"}200! 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"}201! CHECK: acc.kernels dataOperands(%[[COPYIN_A]], %[[COPYIN_B]], %[[COPYIN_C]] : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) {202! CHECK: acc.terminator203! CHECK-NEXT: }{{$}}204! 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"}205! 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"}206! 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"}207 208 !$acc kernels copyin(a) copyin(readonly: b, c)209 !$acc end kernels210 211! CHECK: %[[COPYIN_A:.*]] = acc.copyin varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {name = "a"}212! 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"}213! 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"}214! CHECK: acc.kernels dataOperands(%[[COPYIN_A]], %[[COPYIN_B]], %[[COPYIN_C]] : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) {215! CHECK: acc.terminator216! CHECK-NEXT: }{{$}}217! CHECK: acc.delete accPtr(%[[COPYIN_A]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_copyin>, name = "a"}218! CHECK: acc.delete accPtr(%[[COPYIN_B]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_copyin_readonly>, name = "b"}219! CHECK: acc.delete accPtr(%[[COPYIN_C]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_copyin_readonly>, name = "c"}220 221 !$acc kernels copyout(a) copyout(zero: b) copyout(c)222 !$acc end kernels223 224! 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"}225! 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"}226! 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"}227! CHECK: acc.kernels dataOperands(%[[CREATE_A]], %[[CREATE_B]], %[[CREATE_C]] : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) {228! CHECK: acc.terminator229! CHECK-NEXT: }{{$}}230! CHECK: acc.copyout accPtr(%[[CREATE_A]] : !fir.ref<!fir.array<10x10xf32>>) to varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) {name = "a"}231! 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"}232! CHECK: acc.copyout accPtr(%[[CREATE_C]] : !fir.ref<!fir.array<10x10xf32>>) to varPtr(%[[DECLC]]#0 : !fir.ref<!fir.array<10x10xf32>>) {name = "c"}233 234 !$acc kernels create(a, b) create(zero: c)235 !$acc end kernels236 237! CHECK: %[[CREATE_A:.*]] = acc.create varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {name = "a"}238! CHECK: %[[CREATE_B:.*]] = acc.create varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {name = "b"}239! 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"}240! CHECK: acc.kernels dataOperands(%[[CREATE_A]], %[[CREATE_B]], %[[CREATE_C]] : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) {241! CHECK: acc.terminator242! CHECK-NEXT: }{{$}}243! CHECK: acc.delete accPtr(%[[CREATE_A]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_create>, name = "a"}244! CHECK: acc.delete accPtr(%[[CREATE_B]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_create>, name = "b"}245! CHECK: acc.delete accPtr(%[[CREATE_C]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_create_zero>, name = "c"}246 247 !$acc kernels no_create(a, b) create(zero: c)248 !$acc end kernels249 250! CHECK: %[[NO_CREATE_A:.*]] = acc.nocreate varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {name = "a"}251! CHECK: %[[NO_CREATE_B:.*]] = acc.nocreate varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {name = "b"}252! 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"}253! CHECK: acc.kernels dataOperands(%[[NO_CREATE_A]], %[[NO_CREATE_B]], %[[CREATE_C]] : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) {254! CHECK: acc.terminator255! CHECK-NEXT: }{{$}}256! CHECK: acc.delete accPtr(%[[CREATE_C]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_create_zero>, name = "c"}257! CHECK: acc.delete accPtr(%[[NO_CREATE_A]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_no_create>, name = "a"}258! CHECK: acc.delete accPtr(%[[NO_CREATE_B]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_no_create>, name = "b"}259 260 !$acc kernels present(a, b, c)261 !$acc end kernels262 263! CHECK: %[[PRESENT_A:.*]] = acc.present varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {name = "a"}264! CHECK: %[[PRESENT_B:.*]] = acc.present varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {name = "b"}265! CHECK: %[[PRESENT_C:.*]] = acc.present varPtr(%[[DECLC]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {name = "c"}266! CHECK: acc.kernels dataOperands(%[[PRESENT_A]], %[[PRESENT_B]], %[[PRESENT_C]] : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) {267! CHECK: acc.terminator268! CHECK-NEXT: }{{$}}269! CHECK: acc.delete accPtr(%[[PRESENT_A]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_present>, name = "a"}270! CHECK: acc.delete accPtr(%[[PRESENT_B]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_present>, name = "b"}271! CHECK: acc.delete accPtr(%[[PRESENT_C]] : !fir.ref<!fir.array<10x10xf32>>) {dataClause = #acc<data_clause acc_present>, name = "c"}272 273 !$acc kernels deviceptr(a) deviceptr(c)274 !$acc end kernels275 276! CHECK: %[[DEVICEPTR_A:.*]] = acc.deviceptr varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {name = "a"}277! CHECK: %[[DEVICEPTR_C:.*]] = acc.deviceptr varPtr(%[[DECLC]]#0 : !fir.ref<!fir.array<10x10xf32>>) -> !fir.ref<!fir.array<10x10xf32>> {name = "c"}278! CHECK: acc.kernels dataOperands(%[[DEVICEPTR_A]], %[[DEVICEPTR_C]] : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) {279! CHECK: acc.terminator280! CHECK-NEXT: }{{$}}281 282 !$acc kernels attach(d, e)283 !$acc end kernels284 285! CHECK: %[[ATTACH_D:.*]] = acc.attach varPtr(%[[DECLD]]#0 : !fir.ref<!fir.box<!fir.ptr<f32>>>) -> !fir.ref<!fir.box<!fir.ptr<f32>>> {name = "d"}286! CHECK: %[[ATTACH_E:.*]] = acc.attach varPtr(%[[DECLE]]#0 : !fir.ref<!fir.box<!fir.ptr<f32>>>) -> !fir.ref<!fir.box<!fir.ptr<f32>>> {name = "e"}287! CHECK: acc.kernels dataOperands(%[[ATTACH_D]], %[[ATTACH_E]] : !fir.ref<!fir.box<!fir.ptr<f32>>>, !fir.ref<!fir.box<!fir.ptr<f32>>>) {288! CHECK: acc.terminator289! CHECK-NEXT: }{{$}}290 291!$acc kernels default(none)292!$acc end kernels293 294! CHECK: acc.kernels {295! CHECK: } attributes {defaultAttr = #acc<defaultvalue none>}296 297!$acc kernels default(present)298!$acc end kernels299 300! CHECK: acc.kernels {301! CHECK: } attributes {defaultAttr = #acc<defaultvalue present>}302 303end subroutine acc_kernels304