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