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