xref: /llvm-project/flang/test/Lower/cray-pointer.f90 (revision de7a50fb88faa1dafee33f10149561936214062b)
1! RUN: bbc %s -emit-fir -hlfir=false -o - | FileCheck %s
2! RUN: %flang_fc1 -emit-fir -flang-deprecated-no-hlfir %s -o - | FileCheck %s
3
4! Test Cray Pointers
5
6! Test Scalar Case
7
8! CHECK-LABEL: func.func @_QPcray_scalar() {
9subroutine cray_scalar()
10  integer :: i, pte
11  integer :: data = 3
12  integer :: j = -3
13  pointer(ptr, pte)
14  ptr = loc(data)
15
16! CHECK: %[[data:.*]] = fir.address_of(@_QFcray_scalarEdata) {{.*}}
17! CHECK: %[[i:.*]] = fir.alloca i32 {{.*}}
18! CHECK: %[[j:.*]] = fir.address_of(@_QFcray_scalarEj) {{.*}}
19! CHECK: %[[ptr:.*]] = fir.alloca i64 {{.*}}
20! CHECK: %[[databox:.*]] = fir.embox %[[data]] : (!fir.ref<i32>) -> !fir.box<i32>
21! CHECK: %[[dataaddr:.*]] = fir.box_addr %[[databox]] : (!fir.box<i32>) -> !fir.ref<i32>
22! CHECK: %[[dataaddrval:.*]] = fir.convert %[[dataaddr]] : (!fir.ref<i32>) -> i64
23! CHECK: fir.store %[[dataaddrval]] to %[[ptr]] : !fir.ref<i64>
24
25  i = pte
26  print *, i
27
28! CHECK: %[[ptrbox:.*]] = fir.embox %[[ptr]] : (!fir.ref<i64>) -> !fir.box<i64>
29! CHECK: %[[ptraddr:.*]] = fir.box_addr %[[ptrbox]] : (!fir.box<i64>) -> !fir.ref<i64>
30! CHECK: %[[ptraddrval:.*]] = fir.convert %[[ptraddr]] : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i32>>
31! CHECK: %[[ptrld:.*]] = fir.load %[[ptraddrval]] : !fir.ref<!fir.ptr<i32>>
32! CHECK: %[[ptrldd:.*]] = fir.load %[[ptrld]] : !fir.ptr<i32>
33! CHECK: fir.store %[[ptrldd]] to %[[i]] : !fir.ref<i32>
34
35  pte = j
36  print *, data, pte
37
38! CHECK: %[[jld:.*]] = fir.load %[[j]] : !fir.ref<i32>
39! CHECK: %[[ptrbox1:.*]] = fir.embox %[[ptr]] : (!fir.ref<i64>) -> !fir.box<i64>
40! CHECK: %[[ptraddr1:.*]] = fir.box_addr %[[ptrbox1]] : (!fir.box<i64>) -> !fir.ref<i64>
41! CHECK: %[[ptraddrval1:.*]] = fir.convert %[[ptraddr1]] : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i32>>
42! CHECK: %[[ptrld1:.*]] = fir.load %[[ptraddrval1]] : !fir.ref<!fir.ptr<i32>>
43! CHECK: fir.store %[[jld]] to %[[ptrld1]] : !fir.ptr<i32>
44
45end
46
47! Test Derived Type Case
48
49! CHECK-LABEL: func.func @_QPcray_derivedtype() {
50subroutine cray_derivedType()
51  integer :: pte, k
52  type dt
53    integer :: i, j
54  end type
55  type(dt) :: xdt
56  pointer(ptr, pte)
57  xdt = dt(-1, -3)
58  ptr = loc(xdt)
59
60! CHECK: %[[dt:.*]] = fir.alloca !fir.type<_QFcray_derivedtypeTdt{i:i32,j:i32}>
61! CHECK: %[[k:.*]] = fir.alloca i32 {{.*}}
62! CHECK: %[[ptr:.*]] = fir.alloca i64 {{.*}}
63! CHECK: %[[xdt:.*]] = fir.alloca !fir.type<_QFcray_derivedtypeTdt{i:i32,j:i32}> {{.*}}
64! CHECK: %[[xdtbox:.*]] = fir.embox %[[xdt]] : (!fir.ref<!fir.type<_QFcray_derivedtypeTdt{i:i32,j:i32}>>) -> !fir.box<!fir.type<_QFcray_derivedtypeTdt{i:i32,j:i32}>>
65! CHECK: %[[xdtaddr:.*]] = fir.box_addr %[[xdtbox]] : (!fir.box<!fir.type<_QFcray_derivedtypeTdt{i:i32,j:i32}>>) -> !fir.ref<!fir.type<_QFcray_derivedtypeTdt{i:i32,j:i32}>>
66! CHECK: %[[xdtaddrval:.*]] = fir.convert %[[xdtaddr]] : (!fir.ref<!fir.type<_QFcray_derivedtypeTdt{i:i32,j:i32}>>) -> i64
67! CHECK: fir.store %[[xdtaddrval]] to %[[ptr]] : !fir.ref<i64>
68
69  k = pte
70  print *, k
71
72! CHECK: %[[ptrbox:.*]] = fir.embox %[[ptr]] : (!fir.ref<i64>) -> !fir.box<i64>
73! CHECK: %[[ptraddr:.*]] = fir.box_addr %[[ptrbox]] : (!fir.box<i64>) -> !fir.ref<i64>
74! CHECK: %[[ptraddrval:.*]] = fir.convert %[[ptraddr]] : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i32>>
75! CHECK: %[[ptrld:.*]] = fir.load %[[ptraddrval]] : !fir.ref<!fir.ptr<i32>>
76! CHECK: %[[ptrldd:.*]] = fir.load %[[ptrld]] : !fir.ptr<i32>
77! CHECK: fir.store %[[ptrldd]] to %[[k]] : !fir.ref<i32>
78
79  pte = k + 2
80  print *, xdt, pte
81
82! CHECK: %[[kld:.*]] = fir.load %[[k]] : !fir.ref<i32>
83! CHECK: %[[kld1:.*]] = fir.load %[[k]] : !fir.ref<i32>
84! CHECK: %[[const:.*]] = arith.constant 2 : i32
85! CHECK: %[[add:.*]] = arith.addi %[[kld1]], %[[const]] : i32
86! CHECK: %[[ptrbox1:.*]] = fir.embox %[[ptr]] : (!fir.ref<i64>) -> !fir.box<i64>
87! CHECK: %[[ptraddr1:.*]] = fir.box_addr %[[ptrbox1]] : (!fir.box<i64>) -> !fir.ref<i64>
88! CHECK: %[[ptraddrval1:.*]] = fir.convert %[[ptraddr1]] : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i32>>
89! CHECK: %[[ptrld1:.*]] = fir.load %[[ptraddrval1]] : !fir.ref<!fir.ptr<i32>>
90! CHECK: fir.store %[[add]] to %[[ptrld1]] : !fir.ptr<i32>
91
92end
93
94! Test Ptr arithmetic Case
95
96! CHECK-LABEL: func.func @_QPcray_ptrarth() {
97subroutine cray_ptrArth()
98  integer :: pte, i
99  pointer(ptr, pte)
100  type dt
101    integer :: x, y, z
102  end type
103  type(dt) :: xdt
104  xdt = dt(5, 11, 2)
105  ptr = loc(xdt)
106
107! CHECK: %[[dt:.*]] = fir.alloca !fir.type<_QFcray_ptrarthTdt{x:i32,y:i32,z:i32}>
108! CHECK: %[[i:.*]] = fir.alloca i32 {{.*}}
109! CHECK: %[[ptr:.*]] = fir.alloca i64 {{.*}}
110! CHECK: %[[xdt:.*]] = fir.alloca !fir.type<_QFcray_ptrarthTdt{x:i32,y:i32,z:i32}> {{.*}}
111! CHECK: %[[xdtbox:.*]] = fir.embox %[[xdt]] : (!fir.ref<!fir.type<_QFcray_ptrarthTdt{x:i32,y:i32,z:i32}>>) -> !fir.box<!fir.type<_QFcray_ptrarthTdt{x:i32,y:i32,z:i32}>>
112! CHECK: %[[xdtaddr:.*]] = fir.box_addr %[[xdtbox]] : (!fir.box<!fir.type<_QFcray_ptrarthTdt{x:i32,y:i32,z:i32}>>) -> !fir.ref<!fir.type<_QFcray_ptrarthTdt{x:i32,y:i32,z:i32}>>
113! CHECK: %[[xdtaddrval:.*]] = fir.convert %[[xdtaddr]] : (!fir.ref<!fir.type<_QFcray_ptrarthTdt{x:i32,y:i32,z:i32}>>) -> i64
114! CHECK: fir.store %[[xdtaddrval]] to %[[ptr]] : !fir.ref<i64>
115
116  ptr = ptr + 4
117  i = pte
118  print *, i
119
120! CHECK: %[[ptrbox:.*]] = fir.embox %[[ptr]] : (!fir.ref<i64>) -> !fir.box<i64>
121! CHECK: %[[ptraddr:.*]] = fir.box_addr %[[ptrbox]] : (!fir.box<i64>) -> !fir.ref<i64>
122! CHECK: %[[ptraddrval:.*]] = fir.convert %[[ptraddr]] : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i32>>
123! CHECK: %[[ptrld:.*]] = fir.load %[[ptraddrval]] : !fir.ref<!fir.ptr<i32>>
124! CHECK: %[[ptrldd:.*]] = fir.load %[[ptrld]] : !fir.ptr<i32>
125! CHECK: fir.store %[[ptrldd]] to %[[i]] : !fir.ref<i32>
126
127  ptr = ptr + 4
128  pte = -7
129  print *, xdt
130
131! CHECK: %[[ld:.*]] = fir.load %[[ptr]] : !fir.ref<i64>
132! CHECK: %[[const:.*]] = arith.constant 4 : i64
133! CHECK: %[[add:.*]] = arith.addi %[[ld]], %[[const]] : i64
134! CHECK: fir.store %[[add]] to %[[ptr]] : !fir.ref<i64>
135! CHECK: %[[const1:.*]] = arith.constant -7 : i32
136! CHECK: %[[ptrbox1:.*]] = fir.embox %[[ptr]] : (!fir.ref<i64>) -> !fir.box<i64>
137! CHECK: %[[ptraddr1:.*]] = fir.box_addr %[[ptrbox1]] : (!fir.box<i64>) -> !fir.ref<i64>
138! CHECK: %[[ptraddrval1:.*]] = fir.convert %[[ptraddr1]] : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i32>>
139! CHECK: %[[ptrld1:.*]] = fir.load %[[ptraddrval1]] : !fir.ref<!fir.ptr<i32>>
140! CHECK: fir.store %[[const1]] to %[[ptrld1]] : !fir.ptr<i32>
141
142end
143
144! Test Array element Case
145
146! CHECK-LABEL: func.func @_QPcray_arrayelement() {
147subroutine cray_arrayElement()
148  integer :: pte, k, data(5)
149  pointer (ptr, pte(3))
150  data = [ 1, 2, 3, 4, 5 ]
151  ptr = loc(data(2))
152
153! CHECK: %[[data:.*]] = fir.alloca !fir.array<5xi32> {{.*}}
154! CHECK: %[[k:.*]] = fir.alloca i32 {{.*}}
155! CHECK: %[[ptr:.*]] = fir.alloca i64 {{.*}}
156! CHECK: %[[c2:.*]] = arith.constant 2 : i64
157! CHECK: %[[c1:.*]] = arith.constant 1 : i64
158! CHECK: %[[sub:.*]] = arith.subi %[[c2]], %[[c1]] : i64
159! CHECK: %[[cor:.*]] = fir.coordinate_of %[[data]], %[[sub]] : (!fir.ref<!fir.array<5xi32>>, i64) -> !fir.ref<i32>
160! CHECK: %[[box:.*]] = fir.embox %[[cor]] : (!fir.ref<i32>) -> !fir.box<i32>
161! CHECK: %[[addr:.*]] = fir.box_addr %[[box]] : (!fir.box<i32>) -> !fir.ref<i32>
162! CHECK: %[[val:.*]] = fir.convert %[[addr]] : (!fir.ref<i32>) -> i64
163! CHECK: fir.store %[[val]] to %[[ptr]] : !fir.ref<i64>
164
165  k = pte(3)
166  print *, k
167
168! CHECK: %[[c3:.*]] = arith.constant 3 : i64
169! CHECK: %[[c1:.*]] = arith.constant 1 : i64
170! CHECK: %[[sub:.*]] = arith.subi %[[c3]], %[[c1]] : i64
171! CHECK: %[[box:.*]] = fir.embox %[[ptr]] : (!fir.ref<i64>) -> !fir.box<!fir.ref<i64>>
172! CHECK: %[[addr:.*]] = fir.box_addr %[[box]] : (!fir.box<!fir.ref<i64>>) -> !fir.ref<i64>
173! CHECK: %[[val:.*]] = fir.convert %[[addr]] : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<!fir.array<3xi32>>>
174! CHECK: %[[ld1:.*]] = fir.load %[[val]] : !fir.ref<!fir.ptr<!fir.array<3xi32>>>
175! CHECK: %[[cor:.*]] = fir.coordinate_of %[[ld1]], %[[sub]] : (!fir.ptr<!fir.array<3xi32>>, i64) -> !fir.ref<i32>
176! CHECK: %[[ld2:.*]] = fir.load %[[cor]] : !fir.ref<i32>
177! CHECK: fir.store %[[ld2]] to %[[k]] : !fir.ref<i32>
178
179  pte(2) = -2
180  print *, data
181
182! CHECK: %[[c2n:.*]] = arith.constant -2 : i32
183! CHECK: %[[c2:.*]] = arith.constant 2 : i64
184! CHECK: %[[c1:.*]] = arith.constant 1 : i64
185! CHECK: %[[sub:.*]] = arith.subi %[[c2]], %[[c1]] : i64
186! CHECK: %[[box:.*]] = fir.embox %[[ptr]] : (!fir.ref<i64>) -> !fir.box<!fir.ref<i64>>
187! CHECK: %[[addr:.*]] = fir.box_addr %[[box]] : (!fir.box<!fir.ref<i64>>) -> !fir.ref<i64>
188! CHECK: %[[val:.*]] = fir.convert %[[addr]] : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<!fir.array<3xi32>>>
189! CHECK: %[[ld1:.*]] = fir.load %[[val]] : !fir.ref<!fir.ptr<!fir.array<3xi32>>>
190! CHECK: %[[cor:.*]] = fir.coordinate_of %[[ld1]], %[[sub]] : (!fir.ptr<!fir.array<3xi32>>, i64) -> !fir.ref<i32>
191! CHECK: fir.store %[[c2n]] to %[[cor]] : !fir.ref<i32>
192
193end
194
195! Test 2d Array element Case
196
197! CHECK-LABEL: func.func @_QPcray_2darrayelement() {
198subroutine cray_2darrayElement()
199  integer :: pte, k, data(2,4)
200  pointer (ptr, pte(2,3))
201  data = reshape([1,2,3,4,5,6,7,8], [2,4])
202  ptr = loc(data(2,2))
203
204! CHECK: %[[data:.*]] = fir.alloca !fir.array<2x4xi32> {{.*}}
205! CHECK: %[[k:.*]] = fir.alloca i32 {{.*}}
206! CHECK: %[[ptr:.*]] = fir.alloca i64 {{.*}}
207! CHECK: %[[c2:.*]] = arith.constant 2 : i64
208! CHECK: %[[c1:.*]] = arith.constant 1 : i64
209! CHECK: %[[sub1:.*]] = arith.subi %[[c2]], %[[c1]] : i64
210! CHECK: %[[c22:.*]] = arith.constant 2 : i64
211! CHECK: %[[c12:.*]] = arith.constant 1 : i64
212! CHECK: %[[sub2:.*]] = arith.subi %[[c22]], %[[c12]] : i64
213! CHECK: %[[cor:.*]] = fir.coordinate_of %[[data]], %[[sub1]], %[[sub2]] : (!fir.ref<!fir.array<2x4xi32>>, i64, i64) -> !fir.ref<i32>
214! CHECK: %[[box:.*]] = fir.embox %[[cor]] : (!fir.ref<i32>) -> !fir.box<i32>
215! CHECK: %[[addr:.*]] = fir.box_addr %[[box]] : (!fir.box<i32>) -> !fir.ref<i32>
216! CHECK: %[[val:.*]] = fir.convert %[[addr]] : (!fir.ref<i32>) -> i64
217! CHECK: fir.store %[[val]] to %[[ptr]] : !fir.ref<i64>
218
219  k = pte(1,1)
220  print *, k
221
222! CHECK: %[[c2:.*]] = arith.constant 1 : i64
223! CHECK: %[[c1:.*]] = arith.constant 1 : i64
224! CHECK: %[[sub1:.*]] = arith.subi %[[c2]], %[[c1]] : i64
225! CHECK: %[[c22:.*]] = arith.constant 1 : i64
226! CHECK: %[[c12:.*]] = arith.constant 1 : i64
227! CHECK: %[[sub2:.*]] = arith.subi %[[c22]], %[[c12]] : i64
228! CHECK: %[[box:.*]] = fir.embox %[[ptr]] : (!fir.ref<i64>) -> !fir.box<!fir.ref<i64>>
229! CHECK: %[[addr:.*]] = fir.box_addr %[[box]] : (!fir.box<!fir.ref<i64>>) -> !fir.ref<i64>
230! CHECK: %[[val:.*]] = fir.convert %[[addr]] : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<!fir.array<2x3xi32>>>
231! CHECK: %[[ld1:.*]] = fir.load %[[val]] : !fir.ref<!fir.ptr<!fir.array<2x3xi32>>>
232! CHECK: %[[cor:.*]] = fir.coordinate_of %[[ld1]], %[[sub1]], %[[sub2]] : (!fir.ptr<!fir.array<2x3xi32>>, i64, i64) -> !fir.ref<i32>
233! CHECK: %[[ld2:.*]] = fir.load %[[cor]] : !fir.ref<i32>
234! CHECK: fir.store %[[ld2]] to %[[k]] : !fir.ref<i32>
235
236  pte(1,2) = -2
237  print *, data
238
239! CHECK: %[[c2n:.*]] = arith.constant -2 : i32
240! CHECK: %[[c2:.*]] = arith.constant 1 : i64
241! CHECK: %[[c1:.*]] = arith.constant 1 : i64
242! CHECK: %[[sub1:.*]] = arith.subi %[[c2]], %[[c1]] : i64
243! CHECK: %[[c22:.*]] = arith.constant 2 : i64
244! CHECK: %[[c12:.*]] = arith.constant 1 : i64
245! CHECK: %[[sub2:.*]] = arith.subi %[[c22]], %[[c12]] : i64
246! CHECK: %[[box:.*]] = fir.embox %[[ptr]] : (!fir.ref<i64>) -> !fir.box<!fir.ref<i64>>
247! CHECK: %[[addr:.*]] = fir.box_addr %[[box]] : (!fir.box<!fir.ref<i64>>) -> !fir.ref<i64>
248! CHECK: %[[val:.*]] = fir.convert %[[addr]] : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<!fir.array<2x3xi32>>>
249! CHECK: %[[ld1:.*]] = fir.load %[[val]] : !fir.ref<!fir.ptr<!fir.array<2x3xi32>>>
250! CHECK: %[[cor:.*]] = fir.coordinate_of %[[ld1]], %[[sub1]], %[[sub2]] : (!fir.ptr<!fir.array<2x3xi32>>, i64, i64) -> !fir.ref<i32>
251! CHECK: fir.store %[[c2n]] to %[[cor]] : !fir.ref<i32>
252
253end
254
255! Test Whole Array case
256
257! CHECK-LABEL: func.func @_QPcray_array() {
258subroutine cray_array()
259  integer :: pte, k(3), data(5)
260  pointer (ptr, pte(3))
261  data = [ 1, 2, 3, 4, 5 ]
262  ptr = loc(data(2))
263
264! CHECK: %[[data:.*]] = fir.alloca !fir.array<5xi32> {{.*}}
265! CHECK: %[[c3:.*]] = arith.constant 3 : index
266! CHECK: %[[k:.*]] = fir.alloca !fir.array<3xi32> {{.*}}
267! CHECK: %[[ptr:.*]] = fir.alloca i64 {{.*}}
268! CHECK: %[[c31:.*]] = arith.constant 3 : index
269! CHECK: %[[c2:.*]] = arith.constant 2 : i64
270! CHECK: %[[c1:.*]] = arith.constant 1 : i64
271! CHECK: %[[sub:.*]] = arith.subi %[[c2]], %[[c1]] : i64
272! CHECK: %[[cor:.*]] = fir.coordinate_of %[[data]], %[[sub]] : (!fir.ref<!fir.array<5xi32>>, i64) -> !fir.ref<i32>
273! CHECK: %[[box:.*]] = fir.embox %[[cor]] : (!fir.ref<i32>) -> !fir.box<i32>
274! CHECK: %[[addr:.*]] = fir.box_addr %[[box]] : (!fir.box<i32>) -> !fir.ref<i32>
275! CHECK: %[[val:.*]] = fir.convert %[[addr]] : (!fir.ref<i32>) -> i64
276! CHECK: fir.store %[[val]] to %[[ptr]] : !fir.ref<i64>
277
278  k = pte
279  print *, k
280
281! CHECK: %[[shape1:.*]] = fir.shape %[[c3]] : (index) -> !fir.shape<1>
282! CHECK: %[[arrayld1:.*]] = fir.array_load %[[k]](%[[shape1]]) : (!fir.ref<!fir.array<3xi32>>, !fir.shape<1>) -> !fir.array<3xi32>
283! CHECK: %[[shape:.*]] = fir.shape %[[c31]] : (index) -> !fir.shape<1>
284! CHECK: %[[box:.*]] = fir.embox %[[ptr]] : (!fir.ref<i64>) -> !fir.box<!fir.ref<i64>>
285! CHECK: %[[addr:.*]] = fir.box_addr %[[box]] : (!fir.box<!fir.ref<i64>>) -> !fir.ref<i64>
286! CHECK: %[[val:.*]] = fir.convert %[[addr]] : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<!fir.array<3xi32>>>
287! CHECK: %[[ld:.*]] =  fir.load %[[val]] : !fir.ref<!fir.ptr<!fir.array<3xi32>>>
288! CHECK: %[[arrayld:.*]] = fir.array_load %[[ld]](%[[shape]]) : (!fir.ptr<!fir.array<3xi32>>, !fir.shape<1>) -> !fir.array<3xi32>
289! CHECK: %[[c1:.*]] = arith.constant 1 : index
290! CHECK: %[[c0:.*]] = arith.constant 0 : index
291! CHECK: %[[sub:.*]] = arith.subi %[[c3]], %[[c1]] : index
292! CHECK: %[[doloop:.*]] = fir.do_loop %arg0 = %[[c0]] to %[[sub]] step %[[c1]] unordered iter_args(%arg1 = %[[arrayld1]]) -> (!fir.array<3xi32>) {
293! CHECK: %[[arrayfetch:.*]] = fir.array_fetch %[[arrayld]], %arg0 : (!fir.array<3xi32>, index) -> i32
294! CHECK: %[[arrayupdate:.*]] = fir.array_update %arg1, %[[arrayfetch]], %arg0 : (!fir.array<3xi32>, i32, index) -> !fir.array<3xi32>
295! CHECK: fir.result %[[arrayupdate]] : !fir.array<3xi32>
296! CHECK: fir.array_merge_store %[[arrayld1]], %[[doloop]] to %[[k]] : !fir.array<3xi32>, !fir.array<3xi32>, !fir.ref<!fir.array<3xi32>>
297
298  pte = -2
299  print *, data
300
301! CHECK: %[[shape:.*]] = fir.shape %[[c31]] : (index) -> !fir.shape<1>
302! CHECK: %[[box:.*]] = fir.embox %[[ptr]] : (!fir.ref<i64>) -> !fir.box<!fir.ref<i64>>
303! CHECK: %[[addr:.*]] = fir.box_addr %[[box]] : (!fir.box<!fir.ref<i64>>) -> !fir.ref<i64>
304! CHECK: %[[val:.*]] = fir.convert %[[addr]] : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<!fir.array<3xi32>>>
305! CHECK: %[[ld:.*]] = fir.load %[[val]] : !fir.ref<!fir.ptr<!fir.array<3xi32>>>
306! CHECK: %[[arrayld:.*]] = fir.array_load %[[ld]](%[[shape]]) : (!fir.ptr<!fir.array<3xi32>>, !fir.shape<1>) -> !fir.array<3xi32>
307! CHECK: %[[c2n:.*]] = arith.constant -2 : i32
308! CHECK: %[[c1:.*]] = arith.constant 1 : index
309! CHECK: %[[c0:.*]] = arith.constant 0 : index
310! CHECK: %[[sub1:.*]] = arith.subi %[[c31]], %[[c1]] : index
311! CHECK: %[[doloop:.*]] = fir.do_loop %arg0 = %[[c0]] to %[[sub1]] step %[[c1]] unordered iter_args(%arg1 = %[[arrayld]]) -> (!fir.array<3xi32>) {
312! CHECK: %[[arrayupdate:.*]] = fir.array_update %arg1, %[[c2n]], %arg0 : (!fir.array<3xi32>, i32, index) -> !fir.array<3xi32>
313! CHECK: fir.result %[[arrayupdate]] : !fir.array<3xi32>
314! CHECK: fir.array_merge_store %[[arrayld]], %[[doloop]] to %[[ld]] : !fir.array<3xi32>, !fir.array<3xi32>, !fir.ptr<!fir.array<3xi32>>
315end
316
317! Test Array Section  case
318
319! CHECK-LABEL: func.func @_QPcray_arraysection() {
320subroutine cray_arraySection()
321  integer :: pte, k(2), data(5)
322  pointer (ptr, pte(3))
323  data = [ 1, 2, 3, 4, 5 ]
324  ptr = loc(data(2))
325
326! CHECK: %[[c5:.*]] = arith.constant 5 : index
327! CHECK: %[[data:.*]] = fir.alloca !fir.array<5xi32> {{.*}}
328! CHECK: %[[c2:.*]] = arith.constant 2 : index
329! CHECK: %[[k:.*]] = fir.alloca !fir.array<2xi32> {{.*}}
330! CHECK: %[[ptr:.*]] = fir.alloca i64 {{.*}}
331! CHECK: %[[c3:.*]] = arith.constant 3 : index
332! CHECK: %[[c1:.*]] = arith.constant 2 : i64
333! CHECK: %[[c0:.*]] = arith.constant 1 : i64
334! CHECK: %[[sub:.*]] = arith.subi %[[c1]], %[[c0]] : i64
335! CHECK: %[[cor:.*]] = fir.coordinate_of %[[data]], %[[sub]] : (!fir.ref<!fir.array<5xi32>>, i64) -> !fir.ref<i32>
336! CHECK: %[[box:.*]] = fir.embox %[[cor]] : (!fir.ref<i32>) -> !fir.box<i32>
337! CHECK: %[[addr:.*]] = fir.box_addr %[[box]] : (!fir.box<i32>) -> !fir.ref<i32>
338! CHECK: %[[val:.*]] = fir.convert %[[addr]] : (!fir.ref<i32>) -> i64
339! CHECK: fir.store %[[val]] to %[[ptr]] : !fir.ref<i64>
340
341  k = pte(2:3)
342  print *, k
343
344! CHECK: %[[shape1:.*]] = fir.shape %[[c2]] : (index) -> !fir.shape<1>
345! CHECK: %[[arrayld1:.*]] = fir.array_load %[[k]](%[[shape1]]) : (!fir.ref<!fir.array<2xi32>>, !fir.shape<1>) -> !fir.array<2xi32>
346! CHECK: %[[c2i64:.*]] = arith.constant 2 : i64
347! CHECK: %[[conv:.*]] = fir.convert %[[c2i64]] : (i64) -> index
348! CHECK: %[[c1i64:.*]] = arith.constant 1 : i64
349! CHECK: %[[conv1:.*]] = fir.convert %[[c1i64]] : (i64) -> index
350! CHECK: %[[c3i64:.*]] = arith.constant 3 : i64
351! CHECK: %[[conv2:.*]] = fir.convert %[[c3i64]] : (i64) -> index
352! CHECK: %[[shape:.*]] = fir.shape %[[c3]] : (index) -> !fir.shape<1>
353! CHECK: %[[slice:.*]] = fir.slice %[[conv]], %[[conv2]], %[[conv1]] : (index, index, index) -> !fir.slice<1>
354! CHECK: %[[box:.*]] = fir.embox %[[ptr]] : (!fir.ref<i64>) -> !fir.box<!fir.ref<i64>>
355! CHECK: %[[addr:.*]] = fir.box_addr %[[box]] : (!fir.box<!fir.ref<i64>>) -> !fir.ref<i64>
356! CHECK: %[[val:.*]] = fir.convert %[[addr]] : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<!fir.array<3xi32>>>
357! CHECK: %[[ld:.*]] =  fir.load %[[val]] : !fir.ref<!fir.ptr<!fir.array<3xi32>>>
358! CHECK: %[[arrayld:.*]] = fir.array_load %[[ld]](%[[shape]]) [%[[slice]]] : (!fir.ptr<!fir.array<3xi32>>, !fir.shape<1>, !fir.slice<1>) -> !fir.array<3xi32>
359! CHECK: %[[c1_3:.*]] = arith.constant 1 : index
360! CHECK: %[[c0_4:.*]] = arith.constant 0 : index
361! CHECK: %[[sub:.*]] = arith.subi %[[c2]], %[[c1_3]] : index
362! CHECK: %[[doloop:.*]] = fir.do_loop %arg0 = %[[c0_4]] to %[[sub]] step %[[c1_3]] unordered iter_args(%arg1 = %[[arrayld1]]) -> (!fir.array<2xi32>) {
363! CHECK: %[[arrayfetch:.*]] = fir.array_fetch %[[arrayld]], %arg0 : (!fir.array<3xi32>, index) -> i32
364! CHECK: %[[arrayupdate:.*]] = fir.array_update %arg1, %[[arrayfetch]], %arg0 : (!fir.array<2xi32>, i32, index) -> !fir.array<2xi32>
365! CHECK: fir.result %[[arrayupdate]] : !fir.array<2xi32>
366! CHECK: fir.array_merge_store %[[arrayld1]], %[[doloop]] to %[[k]] : !fir.array<2xi32>, !fir.array<2xi32>, !fir.ref<!fir.array<2xi32>>
367
368  pte(1:2) = -2
369  print *, data
370
371! CHECK: %[[c1_5:.*]] = arith.constant 1 : i64
372! CHECK: %[[conv:.*]] = fir.convert %[[c1_5]] : (i64) -> index
373! CHECK: %[[c1_6:.*]] = arith.constant 1 : i64
374! CHECK: %[[conv1:.*]] = fir.convert %[[c1_6]] : (i64) -> index
375! CHECK: %[[c2_7:.*]] = arith.constant 2 : i64
376! CHECK: %[[conv2:.*]] = fir.convert %[[c2_7]] : (i64) -> index
377! CHECK: %[[c0_8:.*]] = arith.constant 0 : index
378! CHECK: %[[sub:.*]] = arith.subi %[[conv2]], %[[conv]] : index
379! CHECK: %[[add:.*]]  = arith.addi %[[sub]], %[[conv1]] : index
380! CHECK: %[[div:.*]] = arith.divsi %[[add]], %[[conv1]] : index
381! CHECK: %[[cmp:.*]] = arith.cmpi sgt, %[[div]], %[[c0_8]] : index
382! CHECK: %[[sel:.*]] = arith.select %[[cmp]], %[[div]], %[[c0_8]] : index
383! CHECK: %[[shape:.*]] = fir.shape %[[c3]] : (index) -> !fir.shape<1>
384! CHECK: %[[slice:.*]] = fir.slice %[[conv]], %[[conv2]], %[[conv1]] : (index, index, index) -> !fir.slice<1>
385! CHECK: %[[box:.*]] = fir.embox %[[ptr]] : (!fir.ref<i64>) -> !fir.box<!fir.ref<i64>>
386! CHECK: %[[addr:.*]] = fir.box_addr %[[box]] : (!fir.box<!fir.ref<i64>>) -> !fir.ref<i64>
387! CHECK: %[[val:.*]] = fir.convert %[[addr]] : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<!fir.array<3xi32>>>
388! CHECK: %[[ld:.*]] = fir.load %[[val]] : !fir.ref<!fir.ptr<!fir.array<3xi32>>>
389! CHECK: %[[arrayld:.*]] = fir.array_load %[[ld]](%[[shape]]) [%[[slice]]] : (!fir.ptr<!fir.array<3xi32>>, !fir.shape<1>, !fir.slice<1>) -> !fir.array<3xi32>
390! CHECK: %[[c2n:.*]] = arith.constant -2 : i32
391! CHECK: %[[c1_9:.*]] = arith.constant 1 : index
392! CHECK: %[[c0_8:.*]] = arith.constant 0 : index
393! CHECK: %[[sub1:.*]] = arith.subi %[[sel]], %[[c1_9]] : index
394! CHECK: %[[doloop:.*]] = fir.do_loop %arg0 = %[[c0_8]] to %[[sub1]] step %[[c1_9]] unordered iter_args(%arg1 = %[[arrayld]]) -> (!fir.array<3xi32>) {
395! CHECK: %[[arrayupdate:.*]] = fir.array_update %arg1, %[[c2n]], %arg0 : (!fir.array<3xi32>, i32, index) -> !fir.array<3xi32>
396! CHECK: fir.result %[[arrayupdate]] : !fir.array<3xi32>
397! CHECK: fir.array_merge_store %[[arrayld]], %[[doloop]] to %[[ld]][%[[slice]]] : !fir.array<3xi32>, !fir.array<3xi32>, !fir.ptr<!fir.array<3xi32>>, !fir.slice<1>
398end
399
400! Test Cray pointer declared in a module
401module mod_cray_ptr
402  integer :: pte
403  pointer(ptr, pte)
404end module
405
406! CHECK-LABEL: @_QPtest_ptr
407subroutine test_ptr()
408  use mod_cray_ptr
409  implicit none
410  integer :: x
411  ptr = loc(x)
412! CHECK: %[[ptr:.*]] = fir.address_of(@_QMmod_cray_ptrEptr) : !fir.ref<i64>
413! CHECK: %[[x:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFtest_ptrEx"}
414! CHECK: %[[box:.*]] = fir.embox %[[x]] : (!fir.ref<i32>) -> !fir.box<i32>
415! CHECK: %[[boxAddr:.*]] = fir.box_addr %[[box]] : (!fir.box<i32>) -> !fir.ref<i32>
416! CHECK: %[[addr_x:.*]] = fir.convert %[[boxAddr]] : (!fir.ref<i32>) -> i64
417! CHECK: fir.store %[[addr_x]] to %[[ptr]] : !fir.ref<i64>
418end
419
420subroutine test_pte()
421  use mod_cray_ptr
422  implicit none
423  integer :: x
424  pte = x
425! CHECK: %[[ptr:.*]] = fir.address_of(@_QMmod_cray_ptrEptr) : !fir.ref<i64>
426! CHECK: %[[x:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFtest_pteEx"}
427! CHECK: %[[xval:.*]] = fir.load %[[x]] : !fir.ref<i32>
428! CHECK: %[[box:.*]] = fir.embox %[[ptr]] : (!fir.ref<i64>) -> !fir.box<i64>
429! CHECK: %[[boxAddr:.*]] = fir.box_addr %[[box]] : (!fir.box<i64>) -> !fir.ref<i64>
430! CHECK: %[[ptr2:.*]] = fir.convert %[[boxAddr]] : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i32>>
431! CHECK: %[[ptr2val:.*]] = fir.load %[[ptr2]] : !fir.ref<!fir.ptr<i32>>
432! CHECK: fir.store %[[xval]] to %[[ptr2val]] : !fir.ptr<i32>
433
434  x = pte
435! CHECK: %[[box2:.*]] = fir.embox %[[ptr]] : (!fir.ref<i64>) -> !fir.box<i64>
436! CHECK: %[[box2Addr:.*]] = fir.box_addr %[[box2]] : (!fir.box<i64>) -> !fir.ref<i64>
437! CHECK: %[[refptr:.*]] = fir.convert %[[box2Addr]] : (!fir.ref<i64>) -> !fir.ref<!fir.ptr<i32>>
438! CHECK: %[[ptr4:.*]] = fir.load %[[refptr]] : !fir.ref<!fir.ptr<i32>>
439! CHECK: %[[val:.*]] = fir.load %[[ptr4]] : !fir.ptr<i32>
440! CHECK: fir.store %[[val]] to %[[x]] : !fir.ref<i32>
441end
442
443