443 lines · plain
1! RUN: bbc %s -emit-fir -hlfir=false -o - | FileCheck %s2! RUN: %flang_fc1 -emit-fir -flang-deprecated-no-hlfir %s -o - | FileCheck %s3 4! Test Cray Pointers5 6! Test Scalar Case7 8! CHECK-LABEL: func.func @_QPcray_scalar() {9subroutine cray_scalar()10 integer :: i, pte11 integer :: data = 312 integer :: j = -313 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>) -> i6423! CHECK: fir.store %[[dataaddrval]] to %[[ptr]] : !fir.ref<i64>24 25 i = pte26 print *, i27 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 = j36 print *, data, pte37 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 45end46 47! Test Derived Type Case48 49! CHECK-LABEL: func.func @_QPcray_derivedtype() {50subroutine cray_derivedType()51 integer :: pte, k52 type dt53 integer :: i, j54 end type55 type(dt) :: xdt56 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}>>) -> i6467! CHECK: fir.store %[[xdtaddrval]] to %[[ptr]] : !fir.ref<i64>68 69 k = pte70 print *, k71 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 + 280 print *, xdt, pte81 82! CHECK: %[[kld:.*]] = fir.load %[[k]] : !fir.ref<i32>83! CHECK: %[[kld1:.*]] = fir.load %[[k]] : !fir.ref<i32>84! CHECK: %[[const:.*]] = arith.constant 2 : i3285! CHECK: %[[add:.*]] = arith.addi %[[kld1]], %[[const]] : i3286! 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 92end93 94! Test Ptr arithmetic Case95 96! CHECK-LABEL: func.func @_QPcray_ptrarth() {97subroutine cray_ptrArth()98 integer :: pte, i99 pointer(ptr, pte)100 type dt101 integer :: x, y, z102 end type103 type(dt) :: xdt104 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}>>) -> i64114! CHECK: fir.store %[[xdtaddrval]] to %[[ptr]] : !fir.ref<i64>115 116 ptr = ptr + 4117 i = pte118 print *, i119 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 + 4128 pte = -7129 print *, xdt130 131! CHECK: %[[ld:.*]] = fir.load %[[ptr]] : !fir.ref<i64>132! CHECK: %[[const:.*]] = arith.constant 4 : i64133! CHECK: %[[add:.*]] = arith.addi %[[ld]], %[[const]] : i64134! CHECK: fir.store %[[add]] to %[[ptr]] : !fir.ref<i64>135! CHECK: %[[const1:.*]] = arith.constant -7 : i32136! 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 142end143 144! Test Array element Case145 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 : i64157! CHECK: %[[c1:.*]] = arith.constant 1 : i64158! CHECK: %[[sub:.*]] = arith.subi %[[c2]], %[[c1]] : i64159! 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>) -> i64163! CHECK: fir.store %[[val]] to %[[ptr]] : !fir.ref<i64>164 165 k = pte(3)166 print *, k167 168! CHECK: %[[c3:.*]] = arith.constant 3 : i64169! CHECK: %[[c1:.*]] = arith.constant 1 : i64170! CHECK: %[[sub:.*]] = arith.subi %[[c3]], %[[c1]] : i64171! 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) = -2180 print *, data181 182! CHECK: %[[c2n:.*]] = arith.constant -2 : i32183! CHECK: %[[c2:.*]] = arith.constant 2 : i64184! CHECK: %[[c1:.*]] = arith.constant 1 : i64185! CHECK: %[[sub:.*]] = arith.subi %[[c2]], %[[c1]] : i64186! 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 193end194 195! Test 2d Array element Case196 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 : i64208! CHECK: %[[c1:.*]] = arith.constant 1 : i64209! CHECK: %[[sub1:.*]] = arith.subi %[[c2]], %[[c1]] : i64210! CHECK: %[[c22:.*]] = arith.constant 2 : i64211! CHECK: %[[c12:.*]] = arith.constant 1 : i64212! CHECK: %[[sub2:.*]] = arith.subi %[[c22]], %[[c12]] : i64213! 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>) -> i64217! CHECK: fir.store %[[val]] to %[[ptr]] : !fir.ref<i64>218 219 k = pte(1,1)220 print *, k221 222! CHECK: %[[c2:.*]] = arith.constant 1 : i64223! CHECK: %[[c1:.*]] = arith.constant 1 : i64224! CHECK: %[[sub1:.*]] = arith.subi %[[c2]], %[[c1]] : i64225! CHECK: %[[c22:.*]] = arith.constant 1 : i64226! CHECK: %[[c12:.*]] = arith.constant 1 : i64227! CHECK: %[[sub2:.*]] = arith.subi %[[c22]], %[[c12]] : i64228! 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) = -2237 print *, data238 239! CHECK: %[[c2n:.*]] = arith.constant -2 : i32240! CHECK: %[[c2:.*]] = arith.constant 1 : i64241! CHECK: %[[c1:.*]] = arith.constant 1 : i64242! CHECK: %[[sub1:.*]] = arith.subi %[[c2]], %[[c1]] : i64243! CHECK: %[[c22:.*]] = arith.constant 2 : i64244! CHECK: %[[c12:.*]] = arith.constant 1 : i64245! CHECK: %[[sub2:.*]] = arith.subi %[[c22]], %[[c12]] : i64246! 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 253end254 255! Test Whole Array case256 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 : index266! CHECK: %[[k:.*]] = fir.alloca !fir.array<3xi32> {{.*}}267! CHECK: %[[ptr:.*]] = fir.alloca i64 {{.*}}268! CHECK: %[[c31:.*]] = arith.constant 3 : index269! CHECK: %[[c2:.*]] = arith.constant 2 : i64270! CHECK: %[[c1:.*]] = arith.constant 1 : i64271! CHECK: %[[sub:.*]] = arith.subi %[[c2]], %[[c1]] : i64272! 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>) -> i64276! CHECK: fir.store %[[val]] to %[[ptr]] : !fir.ref<i64>277 278 k = pte279 print *, k280 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 : index290! CHECK: %[[c0:.*]] = arith.constant 0 : index291! CHECK: %[[sub:.*]] = arith.subi %[[c3]], %[[c1]] : index292! 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) -> i32294! 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 = -2299 print *, data300 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 : i32308! CHECK: %[[c1:.*]] = arith.constant 1 : index309! CHECK: %[[c0:.*]] = arith.constant 0 : index310! CHECK: %[[sub1:.*]] = arith.subi %[[c31]], %[[c1]] : index311! 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>>315end316 317! Test Array Section case318 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 : index327! CHECK: %[[data:.*]] = fir.alloca !fir.array<5xi32> {{.*}}328! CHECK: %[[c2:.*]] = arith.constant 2 : index329! CHECK: %[[k:.*]] = fir.alloca !fir.array<2xi32> {{.*}}330! CHECK: %[[ptr:.*]] = fir.alloca i64 {{.*}}331! CHECK: %[[c3:.*]] = arith.constant 3 : index332! CHECK: %[[c1:.*]] = arith.constant 2 : i64333! CHECK: %[[c0:.*]] = arith.constant 1 : i64334! CHECK: %[[sub:.*]] = arith.subi %[[c1]], %[[c0]] : i64335! 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>) -> i64339! CHECK: fir.store %[[val]] to %[[ptr]] : !fir.ref<i64>340 341 k = pte(2:3)342 print *, k343 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 : i64347! CHECK: %[[conv:.*]] = fir.convert %[[c2i64]] : (i64) -> index348! CHECK: %[[c1i64:.*]] = arith.constant 1 : i64349! CHECK: %[[conv1:.*]] = fir.convert %[[c1i64]] : (i64) -> index350! CHECK: %[[c3i64:.*]] = arith.constant 3 : i64351! CHECK: %[[conv2:.*]] = fir.convert %[[c3i64]] : (i64) -> index352! 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 : index360! CHECK: %[[c0_4:.*]] = arith.constant 0 : index361! CHECK: %[[sub:.*]] = arith.subi %[[c2]], %[[c1_3]] : index362! 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) -> i32364! 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) = -2369 print *, data370 371! CHECK: %[[c1_5:.*]] = arith.constant 1 : i64372! CHECK: %[[conv:.*]] = fir.convert %[[c1_5]] : (i64) -> index373! CHECK: %[[c1_6:.*]] = arith.constant 1 : i64374! CHECK: %[[conv1:.*]] = fir.convert %[[c1_6]] : (i64) -> index375! CHECK: %[[c2_7:.*]] = arith.constant 2 : i64376! CHECK: %[[conv2:.*]] = fir.convert %[[c2_7]] : (i64) -> index377! CHECK: %[[c0_8:.*]] = arith.constant 0 : index378! CHECK: %[[sub:.*]] = arith.subi %[[conv2]], %[[conv]] : index379! CHECK: %[[add:.*]] = arith.addi %[[sub]], %[[conv1]] : index380! CHECK: %[[div:.*]] = arith.divsi %[[add]], %[[conv1]] : index381! CHECK: %[[cmp:.*]] = arith.cmpi sgt, %[[div]], %[[c0_8]] : index382! CHECK: %[[sel:.*]] = arith.select %[[cmp]], %[[div]], %[[c0_8]] : index383! 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 : i32391! CHECK: %[[c1_9:.*]] = arith.constant 1 : index392! CHECK: %[[c0_8:.*]] = arith.constant 0 : index393! CHECK: %[[sub1:.*]] = arith.subi %[[sel]], %[[c1_9]] : index394! 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>398end399 400! Test Cray pointer declared in a module401module mod_cray_ptr402 integer :: pte403 pointer(ptr, pte)404end module405 406! CHECK-LABEL: @_QPtest_ptr407subroutine test_ptr()408 use mod_cray_ptr409 implicit none410 integer :: x411 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>) -> i64417! CHECK: fir.store %[[addr_x]] to %[[ptr]] : !fir.ref<i64>418end419 420subroutine test_pte()421 use mod_cray_ptr422 implicit none423 integer :: x424 pte = x425! 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 = pte435! 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>441end442 443