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