xref: /llvm-project/flang/test/Lower/OpenACC/acc-kernels.f90 (revision f3d3ec86d1a40a2c86d743384d272ebcd0a1cbd8)
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