1! This test checks lowering of OpenACC kernels construct. 2 3! RUN: bbc -fopenacc -emit-hlfir %s -o - | FileCheck %s 4 5subroutine acc_kernels 6 integer :: i, j 7 8 integer :: async = 1 9 integer :: wait1 = 1 10 integer :: wait2 = 2 11 integer :: numGangs = 1 12 integer :: numWorkers = 10 13 integer :: vectorLength = 128 14 logical :: ifCondition = .TRUE. 15 real, dimension(10, 10) :: a, b, c 16 real, pointer :: d, e 17 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 kernels 32 !$acc end kernels 33 34! CHECK: acc.kernels { 35! CHECK: acc.terminator 36! CHECK-NEXT: }{{$}} 37 38 !$acc kernels async 39 !$acc end kernels 40 41! CHECK: acc.kernels { 42! CHECK: acc.terminator 43! CHECK-NEXT: } attributes {asyncOnly = [#acc.device_type<none>]} 44 45 !$acc kernels async(1) 46 !$acc end kernels 47 48! CHECK: [[ASYNC1:%.*]] = arith.constant 1 : i32 49! CHECK: acc.kernels async([[ASYNC1]] : i32) { 50! CHECK: acc.terminator 51! CHECK-NEXT: }{{$}} 52 53 !$acc kernels async(async) 54 !$acc end kernels 55 56! CHECK: [[ASYNC2:%.*]] = fir.load %{{.*}} : !fir.ref<i32> 57! CHECK: acc.kernels async([[ASYNC2]] : i32) { 58! CHECK: acc.terminator 59! CHECK-NEXT: }{{$}} 60 61 !$acc kernels wait 62 !$acc end kernels 63 64! CHECK: acc.kernels wait { 65! CHECK: acc.terminator 66! CHECK-NEXT: } 67 68 !$acc kernels wait(1) 69 !$acc end kernels 70 71! CHECK: [[WAIT1:%.*]] = arith.constant 1 : i32 72! CHECK: acc.kernels wait({[[WAIT1]] : i32}) { 73! CHECK: acc.terminator 74! CHECK-NEXT: }{{$}} 75 76 !$acc kernels wait(1, 2) 77 !$acc end kernels 78 79! CHECK: [[WAIT2:%.*]] = arith.constant 1 : i32 80! CHECK: [[WAIT3:%.*]] = arith.constant 2 : i32 81! CHECK: acc.kernels wait({[[WAIT2]] : i32, [[WAIT3]] : i32}) { 82! CHECK: acc.terminator 83! CHECK-NEXT: }{{$}} 84 85 !$acc kernels wait(wait1, wait2) 86 !$acc end kernels 87 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.terminator 92! CHECK-NEXT: }{{$}} 93 94 !$acc kernels num_gangs(1) 95 !$acc end kernels 96 97! CHECK: [[NUMGANGS1:%.*]] = arith.constant 1 : i32 98! CHECK: acc.kernels num_gangs({[[NUMGANGS1]] : i32}) { 99! CHECK: acc.terminator 100! CHECK-NEXT: }{{$}} 101 102 !$acc kernels num_gangs(numGangs) 103 !$acc end kernels 104 105! CHECK: [[NUMGANGS2:%.*]] = fir.load %{{.*}} : !fir.ref<i32> 106! CHECK: acc.kernels num_gangs({[[NUMGANGS2]] : i32}) { 107! CHECK: acc.terminator 108! CHECK-NEXT: }{{$}} 109 110 !$acc kernels num_workers(10) 111 !$acc end kernels 112 113! CHECK: [[NUMWORKERS1:%.*]] = arith.constant 10 : i32 114! CHECK: acc.kernels num_workers([[NUMWORKERS1]] : i32) { 115! CHECK: acc.terminator 116! CHECK-NEXT: }{{$}} 117 118 !$acc kernels num_workers(numWorkers) 119 !$acc end kernels 120 121! CHECK: [[NUMWORKERS2:%.*]] = fir.load %{{.*}} : !fir.ref<i32> 122! CHECK: acc.kernels num_workers([[NUMWORKERS2]] : i32) { 123! CHECK: acc.terminator 124! CHECK-NEXT: }{{$}} 125 126 !$acc kernels vector_length(128) 127 !$acc end kernels 128 129! CHECK: [[VECTORLENGTH1:%.*]] = arith.constant 128 : i32 130! CHECK: acc.kernels vector_length([[VECTORLENGTH1]] : i32) { 131! CHECK: acc.terminator 132! CHECK-NEXT: }{{$}} 133 134 !$acc kernels vector_length(vectorLength) 135 !$acc end kernels 136 137! CHECK: [[VECTORLENGTH2:%.*]] = fir.load %{{.*}} : !fir.ref<i32> 138! CHECK: acc.kernels vector_length([[VECTORLENGTH2]] : i32) { 139! CHECK: acc.terminator 140! CHECK-NEXT: }{{$}} 141 142 !$acc kernels if(.TRUE.) 143 !$acc end kernels 144 145! CHECK: [[IF1:%.*]] = arith.constant true 146! CHECK: acc.kernels if([[IF1]]) { 147! CHECK: acc.terminator 148! CHECK-NEXT: }{{$}} 149 150 !$acc kernels if(ifCondition) 151 !$acc end kernels 152 153! CHECK: [[IFCOND:%.*]] = fir.load %{{.*}} : !fir.ref<!fir.logical<4>> 154! CHECK: [[IF2:%.*]] = fir.convert [[IFCOND]] : (!fir.logical<4>) -> i1 155! CHECK: acc.kernels if([[IF2]]) { 156! CHECK: acc.terminator 157! CHECK-NEXT: }{{$}} 158 159 !$acc kernels self(.TRUE.) 160 !$acc end kernels 161 162! CHECK: [[SELF1:%.*]] = arith.constant true 163! CHECK: acc.kernels self([[SELF1]]) { 164! CHECK: acc.terminator 165! CHECK-NEXT: }{{$}} 166 167 !$acc kernels self 168 !$acc end kernels 169 170! CHECK: acc.kernels { 171! CHECK: acc.terminator 172! CHECK-NEXT: } attributes {selfAttr} 173 174 !$acc kernels self(ifCondition) 175 !$acc end kernels 176 177! CHECK: %[[SELF2:.*]] = fir.convert %[[DECLIFCONDITION]]#1 : (!fir.ref<!fir.logical<4>>) -> i1 178! CHECK: acc.kernels self(%[[SELF2]]) { 179! CHECK: acc.terminator 180! CHECK-NEXT: }{{$}} 181 182 !$acc kernels copy(a, b, c) 183 !$acc end kernels 184 185! CHECK: %[[COPYIN_A:.*]] = acc.copyin varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) -> !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>>) bounds(%{{.*}}, %{{.*}}) -> !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>>) bounds(%{{.*}}, %{{.*}}) -> !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.terminator 190! CHECK-NEXT: }{{$}} 191! CHECK: acc.copyout accPtr(%[[COPYIN_A]] : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) 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>>) bounds(%{{.*}}, %{{.*}}) 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>>) bounds(%{{.*}}, %{{.*}}) 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 kernels 197 198! CHECK: %[[COPYIN_A:.*]] = acc.copyin varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) -> !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>>) bounds(%{{.*}}, %{{.*}}) -> !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>>) bounds(%{{.*}}, %{{.*}}) -> !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.terminator 203! CHECK-NEXT: }{{$}} 204! CHECK: acc.copyout accPtr(%[[COPYIN_A]] : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) 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>>) bounds(%{{.*}}, %{{.*}}) 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>>) bounds(%{{.*}}, %{{.*}}) 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 kernels 210 211! CHECK: %[[COPYIN_A:.*]] = acc.copyin varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) -> !fir.ref<!fir.array<10x10xf32>> {name = "a"} 212! CHECK: %[[COPYIN_B:.*]] = acc.copyin varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) -> !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>>) bounds(%{{.*}}, %{{.*}}) -> !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.terminator 216! CHECK-NEXT: }{{$}} 217! CHECK: acc.delete accPtr(%[[COPYIN_A]] : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) {dataClause = #acc<data_clause acc_copyin>, name = "a"} 218! CHECK: acc.delete accPtr(%[[COPYIN_B]] : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) {dataClause = #acc<data_clause acc_copyin_readonly>, name = "b"} 219! CHECK: acc.delete accPtr(%[[COPYIN_C]] : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) {dataClause = #acc<data_clause acc_copyin_readonly>, name = "c"} 220 221 !$acc kernels copyout(a) copyout(zero: b) copyout(c) 222 !$acc end kernels 223 224! CHECK: %[[CREATE_A:.*]] = acc.create varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) -> !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>>) bounds(%{{.*}}, %{{.*}}) -> !fir.ref<!fir.array<10x10xf32>> {dataClause = #acc<data_clause acc_copyout>, name = "b"} 226! CHECK: %[[CREATE_C:.*]] = acc.create varPtr(%[[DECLC]]#0 : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) -> !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.terminator 229! CHECK-NEXT: }{{$}} 230! CHECK: acc.copyout accPtr(%[[CREATE_A]] : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) to varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) {name = "a"} 231! CHECK: acc.copyout accPtr(%[[CREATE_B]] : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) to varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10x10xf32>>) {name = "b"} 232! CHECK: acc.copyout accPtr(%[[CREATE_C]] : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) to varPtr(%[[DECLC]]#0 : !fir.ref<!fir.array<10x10xf32>>) {name = "c"} 233 234 !$acc kernels create(a, b) create(zero: c) 235 !$acc end kernels 236 237! CHECK: %[[CREATE_A:.*]] = acc.create varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) -> !fir.ref<!fir.array<10x10xf32>> {name = "a"} 238! CHECK: %[[CREATE_B:.*]] = acc.create varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) -> !fir.ref<!fir.array<10x10xf32>> {name = "b"} 239! CHECK: %[[CREATE_C:.*]] = acc.create varPtr(%[[DECLC]]#0 : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) -> !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.terminator 242! CHECK-NEXT: }{{$}} 243! CHECK: acc.delete accPtr(%[[CREATE_A]] : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) {dataClause = #acc<data_clause acc_create>, name = "a"} 244! CHECK: acc.delete accPtr(%[[CREATE_B]] : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) {dataClause = #acc<data_clause acc_create>, name = "b"} 245! CHECK: acc.delete accPtr(%[[CREATE_C]] : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) {dataClause = #acc<data_clause acc_create_zero>, name = "c"} 246 247 !$acc kernels no_create(a, b) create(zero: c) 248 !$acc end kernels 249 250! CHECK: %[[NO_CREATE_A:.*]] = acc.nocreate varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) -> !fir.ref<!fir.array<10x10xf32>> {name = "a"} 251! CHECK: %[[NO_CREATE_B:.*]] = acc.nocreate varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) -> !fir.ref<!fir.array<10x10xf32>> {name = "b"} 252! CHECK: %[[CREATE_C:.*]] = acc.create varPtr(%[[DECLC]]#0 : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) -> !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.terminator 255! CHECK-NEXT: }{{$}} 256 257 !$acc kernels present(a, b, c) 258 !$acc end kernels 259 260! CHECK: %[[PRESENT_A:.*]] = acc.present varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) -> !fir.ref<!fir.array<10x10xf32>> {name = "a"} 261! CHECK: %[[PRESENT_B:.*]] = acc.present varPtr(%[[DECLB]]#0 : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) -> !fir.ref<!fir.array<10x10xf32>> {name = "b"} 262! CHECK: %[[PRESENT_C:.*]] = acc.present varPtr(%[[DECLC]]#0 : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) -> !fir.ref<!fir.array<10x10xf32>> {name = "c"} 263! 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>>) { 264! CHECK: acc.terminator 265! CHECK-NEXT: }{{$}} 266 267 !$acc kernels deviceptr(a) deviceptr(c) 268 !$acc end kernels 269 270! CHECK: %[[DEVICEPTR_A:.*]] = acc.deviceptr varPtr(%[[DECLA]]#0 : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) -> !fir.ref<!fir.array<10x10xf32>> {name = "a"} 271! CHECK: %[[DEVICEPTR_C:.*]] = acc.deviceptr varPtr(%[[DECLC]]#0 : !fir.ref<!fir.array<10x10xf32>>) bounds(%{{.*}}, %{{.*}}) -> !fir.ref<!fir.array<10x10xf32>> {name = "c"} 272! CHECK: acc.kernels dataOperands(%[[DEVICEPTR_A]], %[[DEVICEPTR_C]] : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) { 273! CHECK: acc.terminator 274! CHECK-NEXT: }{{$}} 275 276 !$acc kernels attach(d, e) 277 !$acc end kernels 278 279! CHECK: %[[BOX_D:.*]] = fir.load %[[DECLD]]#0 : !fir.ref<!fir.box<!fir.ptr<f32>>> 280! CHECK: %[[BOX_ADDR_D:.*]] = fir.box_addr %[[BOX_D]] : (!fir.box<!fir.ptr<f32>>) -> !fir.ptr<f32> 281! CHECK: %[[ATTACH_D:.*]] = acc.attach varPtr(%[[BOX_ADDR_D]] : !fir.ptr<f32>) -> !fir.ptr<f32> {name = "d"} 282! CHECK: %[[BOX_E:.*]] = fir.load %[[DECLE]]#0 : !fir.ref<!fir.box<!fir.ptr<f32>>> 283! CHECK: %[[BOX_ADDR_E:.*]] = fir.box_addr %[[BOX_E]] : (!fir.box<!fir.ptr<f32>>) -> !fir.ptr<f32> 284! CHECK: %[[ATTACH_E:.*]] = acc.attach varPtr(%[[BOX_ADDR_E]] : !fir.ptr<f32>) -> !fir.ptr<f32> {name = "e"} 285! CHECK: acc.kernels dataOperands(%[[ATTACH_D]], %[[ATTACH_E]] : !fir.ptr<f32>, !fir.ptr<f32>) { 286! CHECK: acc.terminator 287! CHECK-NEXT: }{{$}} 288 289!$acc kernels default(none) 290!$acc end kernels 291 292! CHECK: acc.kernels { 293! CHECK: } attributes {defaultAttr = #acc<defaultvalue none>} 294 295!$acc kernels default(present) 296!$acc end kernels 297 298! CHECK: acc.kernels { 299! CHECK: } attributes {defaultAttr = #acc<defaultvalue present>} 300 301end subroutine acc_kernels 302