409 lines · plain
1// Test alias analysis queries for host associated accesses.2// RUN: fir-opt %s --test-fir-alias-analysis -split-input-file --mlir-disable-threading 2>&1 | FileCheck %s3 4// subroutine test15// integer :: x(10)6// contains7// subroutine inner(y)8// integer :: y(10)9// x(1) = y(1)10// end subroutine inner11// end subroutine test112 13// F18 15.5.2.13 (4):14// CHECK: test1_y(1)#0 <-> test1_x(1)#0: NoAlias15func.func @_QFtest1Pinner(%arg0: !fir.ref<!fir.array<10xi32>> {fir.bindc_name = "y"}, %arg1: !fir.ref<tuple<!fir.box<!fir.array<10xi32>>>> {fir.host_assoc}) attributes {fir.internal_proc} {16 %c0_i32 = arith.constant 0 : i3217 %0 = fir.coordinate_of %arg1, %c0_i32 : (!fir.ref<tuple<!fir.box<!fir.array<10xi32>>>>, i32) -> !fir.ref<!fir.box<!fir.array<10xi32>>>18 %1 = fir.load %0 : !fir.ref<!fir.box<!fir.array<10xi32>>>19 %2 = fir.box_addr %1 : (!fir.box<!fir.array<10xi32>>) -> !fir.ref<!fir.array<10xi32>>20 %c0 = arith.constant 0 : index21 %3:3 = fir.box_dims %1, %c0 : (!fir.box<!fir.array<10xi32>>, index) -> (index, index, index)22 %4 = fir.shape %3#1 : (index) -> !fir.shape<1>23 %5:2 = hlfir.declare %2(%4) {fortran_attrs = #fir.var_attrs<host_assoc>, uniq_name = "_QFtest1Ex"} : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi32>>, !fir.ref<!fir.array<10xi32>>)24 %c10 = arith.constant 10 : index25 %6 = fir.shape %c10 : (index) -> !fir.shape<1>26 %7:2 = hlfir.declare %arg0(%6) {uniq_name = "_QFtest1FinnerEy"} : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi32>>, !fir.ref<!fir.array<10xi32>>)27 %c1 = arith.constant 1 : index28 %8 = hlfir.designate %7#0 (%c1) {test.ptr = "test1_y(1)"} : (!fir.ref<!fir.array<10xi32>>, index) -> !fir.ref<i32>29 %9 = fir.load %8 : !fir.ref<i32>30 %c1_0 = arith.constant 1 : index31 %10 = hlfir.designate %5#0 (%c1_0) {test.ptr = "test1_x(1)"} : (!fir.ref<!fir.array<10xi32>>, index) -> !fir.ref<i32>32 hlfir.assign %9 to %10 : i32, !fir.ref<i32>33 return34}35 36// -----37 38// subroutine test239// integer, target :: x(10)40// call inner(x)41// contains42// subroutine inner(y)43// integer, pointer, intent(in) :: y(:)44// x(1) = y(1)45// end subroutine inner46// end subroutine test247 48// F18 15.5.2.13 (4) (a):49// CHECK: test2_y(1)#0 <-> test2_x(1)#0: MayAlias50func.func @_QFtest2Pinner(%arg0: !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>> {fir.bindc_name = "y"}, %arg1: !fir.ref<tuple<!fir.box<!fir.array<10xi32>>>> {fir.host_assoc}) attributes {fir.internal_proc} {51 %c0_i32 = arith.constant 0 : i3252 %0 = fir.coordinate_of %arg1, %c0_i32 : (!fir.ref<tuple<!fir.box<!fir.array<10xi32>>>>, i32) -> !fir.ref<!fir.box<!fir.array<10xi32>>>53 %1 = fir.load %0 : !fir.ref<!fir.box<!fir.array<10xi32>>>54 %2 = fir.box_addr %1 : (!fir.box<!fir.array<10xi32>>) -> !fir.ref<!fir.array<10xi32>>55 %c0 = arith.constant 0 : index56 %3:3 = fir.box_dims %1, %c0 : (!fir.box<!fir.array<10xi32>>, index) -> (index, index, index)57 %4 = fir.shape %3#1 : (index) -> !fir.shape<1>58 %5:2 = hlfir.declare %2(%4) {fortran_attrs = #fir.var_attrs<target, host_assoc>, uniq_name = "_QFtest2Ex"} : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi32>>, !fir.ref<!fir.array<10xi32>>)59 %6:2 = hlfir.declare %arg0 {fortran_attrs = #fir.var_attrs<intent_in, pointer>, uniq_name = "_QFtest2FinnerEy"} : (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>) -> (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>)60 %7 = fir.load %6#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>61 %c1 = arith.constant 1 : index62 %8 = hlfir.designate %7 (%c1) {test.ptr = "test2_y(1)"} : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, index) -> !fir.ref<i32>63 %9 = fir.load %8 : !fir.ref<i32>64 %c1_0 = arith.constant 1 : index65 %10 = hlfir.designate %5#0 (%c1_0) {test.ptr = "test2_x(1)"} : (!fir.ref<!fir.array<10xi32>>, index) -> !fir.ref<i32>66 hlfir.assign %9 to %10 : i32, !fir.ref<i32>67 return68}69 70// -----71 72// subroutine test373// integer :: x(10)74// call inner(x)75// contains76// subroutine inner(y)77// integer, target :: y(:)78// x(1) = y(1)79// end subroutine inner80// end subroutine test381 82// F18 15.5.2.13 (4) (b):83// CHECK: test3_y(1)#0 <-> test3_x(1)#0: MayAlias84func.func @_QFtest3Pinner(%arg0: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "y", fir.target}, %arg1: !fir.ref<tuple<!fir.box<!fir.array<10xi32>>>> {fir.host_assoc}) attributes {fir.internal_proc} {85 %c0_i32 = arith.constant 0 : i3286 %0 = fir.coordinate_of %arg1, %c0_i32 : (!fir.ref<tuple<!fir.box<!fir.array<10xi32>>>>, i32) -> !fir.ref<!fir.box<!fir.array<10xi32>>>87 %1 = fir.load %0 : !fir.ref<!fir.box<!fir.array<10xi32>>>88 %2 = fir.box_addr %1 : (!fir.box<!fir.array<10xi32>>) -> !fir.ref<!fir.array<10xi32>>89 %c0 = arith.constant 0 : index90 %3:3 = fir.box_dims %1, %c0 : (!fir.box<!fir.array<10xi32>>, index) -> (index, index, index)91 %4 = fir.shape %3#1 : (index) -> !fir.shape<1>92 %5:2 = hlfir.declare %2(%4) {fortran_attrs = #fir.var_attrs<host_assoc>, uniq_name = "_QFtest3Ex"} : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi32>>, !fir.ref<!fir.array<10xi32>>)93 %6:2 = hlfir.declare %arg0 {fortran_attrs = #fir.var_attrs<target>, uniq_name = "_QFtest3FinnerEy"} : (!fir.box<!fir.array<?xi32>>) -> (!fir.box<!fir.array<?xi32>>, !fir.box<!fir.array<?xi32>>)94 %c1 = arith.constant 1 : index95 %7 = hlfir.designate %6#0 (%c1) {test.ptr = "test3_y(1)"} : (!fir.box<!fir.array<?xi32>>, index) -> !fir.ref<i32>96 %8 = fir.load %7 : !fir.ref<i32>97 %c1_0 = arith.constant 1 : index98 %9 = hlfir.designate %5#0 (%c1_0) {test.ptr = "test3_x(1)"} : (!fir.ref<!fir.array<10xi32>>, index) -> !fir.ref<i32>99 hlfir.assign %8 to %9 : i32, !fir.ref<i32>100 return101}102 103// -----104 105// subroutine test4106// integer :: n(10), m(10)107// equivalence (n, m)108// contains109// subroutine inner()110// n(1) = m(1)111// end subroutine inner112// end subroutine test4113 114// CHECK: test4_m(1)#0 <-> test4_n(1)#0: MayAlias115func.func @_QFtest4Pinner(%arg0: !fir.ref<tuple<!fir.box<!fir.array<10xi32>>, !fir.box<!fir.array<10xi32>>>> {fir.host_assoc}) attributes {fir.internal_proc} {116 %c0_i32 = arith.constant 0 : i32117 %0 = fir.coordinate_of %arg0, %c0_i32 : (!fir.ref<tuple<!fir.box<!fir.array<10xi32>>, !fir.box<!fir.array<10xi32>>>>, i32) -> !fir.ref<!fir.box<!fir.array<10xi32>>>118 %1 = fir.load %0 : !fir.ref<!fir.box<!fir.array<10xi32>>>119 %2 = fir.box_addr %1 : (!fir.box<!fir.array<10xi32>>) -> !fir.ref<!fir.array<10xi32>>120 %c0 = arith.constant 0 : index121 %3:3 = fir.box_dims %1, %c0 : (!fir.box<!fir.array<10xi32>>, index) -> (index, index, index)122 %4 = fir.shape %3#1 : (index) -> !fir.shape<1>123 %5:2 = hlfir.declare %2(%4) {fortran_attrs = #fir.var_attrs<host_assoc>, uniq_name = "_QFtest4En"} : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi32>>, !fir.ref<!fir.array<10xi32>>)124 %c1_i32 = arith.constant 1 : i32125 %6 = fir.coordinate_of %arg0, %c1_i32 : (!fir.ref<tuple<!fir.box<!fir.array<10xi32>>, !fir.box<!fir.array<10xi32>>>>, i32) -> !fir.ref<!fir.box<!fir.array<10xi32>>>126 %7 = fir.load %6 : !fir.ref<!fir.box<!fir.array<10xi32>>>127 %8 = fir.box_addr %7 : (!fir.box<!fir.array<10xi32>>) -> !fir.ref<!fir.array<10xi32>>128 %c0_0 = arith.constant 0 : index129 %9:3 = fir.box_dims %7, %c0_0 : (!fir.box<!fir.array<10xi32>>, index) -> (index, index, index)130 %10 = fir.shape %9#1 : (index) -> !fir.shape<1>131 %11:2 = hlfir.declare %8(%10) {fortran_attrs = #fir.var_attrs<host_assoc>, uniq_name = "_QFtest4Em"} : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi32>>, !fir.ref<!fir.array<10xi32>>)132 %12 = fir.alloca !fir.array<40xi8> {uniq_name = "_QFtest4Em"}133 %c1 = arith.constant 1 : index134 %13 = hlfir.designate %11#0 (%c1) {test.ptr = "test4_m(1)"} : (!fir.ref<!fir.array<10xi32>>, index) -> !fir.ref<i32>135 %14 = fir.load %13 : !fir.ref<i32>136 %c1_1 = arith.constant 1 : index137 %15 = hlfir.designate %5#0 (%c1_1) {test.ptr = "test4_n(1)"} : (!fir.ref<!fir.array<10xi32>>, index) -> !fir.ref<i32>138 hlfir.assign %14 to %15 : i32, !fir.ref<i32>139 return140}141 142// -----143 144// subroutine test5145// integer, target :: x(10)146// contains147// subroutine inner(y)148// integer :: y(10)149// x(1) = y(1)150// end subroutine inner151// end subroutine test5152 153// F18 15.5.2.13 (4):154// CHECK: test5_y(1)#0 <-> test5_x(1)#0: NoAlias155func.func @_QFtest5Pinner(%arg0: !fir.ref<!fir.array<10xi32>> {fir.bindc_name = "y"}, %arg1: !fir.ref<tuple<!fir.box<!fir.array<10xi32>>>> {fir.host_assoc}) attributes {fir.internal_proc} {156 %c0_i32 = arith.constant 0 : i32157 %0 = fir.coordinate_of %arg1, %c0_i32 : (!fir.ref<tuple<!fir.box<!fir.array<10xi32>>>>, i32) -> !fir.ref<!fir.box<!fir.array<10xi32>>>158 %1 = fir.load %0 : !fir.ref<!fir.box<!fir.array<10xi32>>>159 %2 = fir.box_addr %1 : (!fir.box<!fir.array<10xi32>>) -> !fir.ref<!fir.array<10xi32>>160 %c0 = arith.constant 0 : index161 %3:3 = fir.box_dims %1, %c0 : (!fir.box<!fir.array<10xi32>>, index) -> (index, index, index)162 %4 = fir.shape %3#1 : (index) -> !fir.shape<1>163 %5:2 = hlfir.declare %2(%4) {fortran_attrs = #fir.var_attrs<target, host_assoc>, uniq_name = "_QFtest5Ex"} : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi32>>, !fir.ref<!fir.array<10xi32>>)164 %c10 = arith.constant 10 : index165 %6 = fir.shape %c10 : (index) -> !fir.shape<1>166 %7:2 = hlfir.declare %arg0(%6) {uniq_name = "_QFtest5FinnerEy"} : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi32>>, !fir.ref<!fir.array<10xi32>>)167 %c1 = arith.constant 1 : index168 %8 = hlfir.designate %7#0 (%c1) {test.ptr = "test5_y(1)"} : (!fir.ref<!fir.array<10xi32>>, index) -> !fir.ref<i32>169 %9 = fir.load %8 : !fir.ref<i32>170 %c1_0 = arith.constant 1 : index171 %10 = hlfir.designate %5#0 (%c1_0) {test.ptr = "test5_x(1)"} : (!fir.ref<!fir.array<10xi32>>, index) -> !fir.ref<i32>172 hlfir.assign %9 to %10 : i32, !fir.ref<i32>173 return174}175 176// -----177 178// subroutine test6179// integer, pointer :: x(:)180// contains181// subroutine inner(y)182// integer :: y(10)183// x(1) = y(1)184// end subroutine inner185// end subroutine test6186 187// F18 15.5.2.13 (4):188// FIXME: 'x' is classified as Indirect access leading to a conservative reply:189// CHECK: test6_y(1)#0 <-> test6_x(1)#0: MayAlias190func.func @_QFtest6Pinner(%arg0: !fir.ref<!fir.array<10xi32>> {fir.bindc_name = "y"}, %arg1: !fir.ref<tuple<!fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>>> {fir.host_assoc}) attributes {fir.internal_proc} {191 %c0_i32 = arith.constant 0 : i32192 %0 = fir.coordinate_of %arg1, %c0_i32 : (!fir.ref<tuple<!fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>>>, i32) -> !fir.llvm_ptr<!fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>>193 %1 = fir.load %0 : !fir.llvm_ptr<!fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>>194 %2:2 = hlfir.declare %1 {fortran_attrs = #fir.var_attrs<pointer, host_assoc>, uniq_name = "_QFtest6Ex"} : (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>) -> (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>)195 %c10 = arith.constant 10 : index196 %3 = fir.shape %c10 : (index) -> !fir.shape<1>197 %4:2 = hlfir.declare %arg0(%3) {uniq_name = "_QFtest6FinnerEy"} : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi32>>, !fir.ref<!fir.array<10xi32>>)198 %c1 = arith.constant 1 : index199 %5 = hlfir.designate %4#0 (%c1) {test.ptr = "test6_y(1)"} : (!fir.ref<!fir.array<10xi32>>, index) -> !fir.ref<i32>200 %6 = fir.load %5 : !fir.ref<i32>201 %7 = fir.load %2#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>202 %c1_0 = arith.constant 1 : index203 %8 = hlfir.designate %7 (%c1_0) {test.ptr = "test6_x(1)"} : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, index) -> !fir.ref<i32>204 hlfir.assign %6 to %8 : i32, !fir.ref<i32>205 return206}207 208// -----209 210// module globals211// integer :: g(10)212// end module globals213// subroutine test7214// use globals215// integer :: x(10)216// contains217// subroutine inner()218// x(1) = g(1)219// end subroutine inner220// end subroutine test7221 222// CHECK: test7_g(1)#0 <-> test7_x(1)#0: NoAlias223func.func @_QFtest7Pinner(%arg0: !fir.ref<tuple<!fir.box<!fir.array<10xi32>>>> {fir.host_assoc}) attributes {fir.internal_proc} {224 %0 = fir.address_of(@_QMglobalsEg) : !fir.ref<!fir.array<10xi32>>225 %c10 = arith.constant 10 : index226 %1 = fir.shape %c10 : (index) -> !fir.shape<1>227 %2:2 = hlfir.declare %0(%1) {uniq_name = "_QMglobalsEg"} : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi32>>, !fir.ref<!fir.array<10xi32>>)228 %c0_i32 = arith.constant 0 : i32229 %3 = fir.coordinate_of %arg0, %c0_i32 : (!fir.ref<tuple<!fir.box<!fir.array<10xi32>>>>, i32) -> !fir.ref<!fir.box<!fir.array<10xi32>>>230 %4 = fir.load %3 : !fir.ref<!fir.box<!fir.array<10xi32>>>231 %5 = fir.box_addr %4 : (!fir.box<!fir.array<10xi32>>) -> !fir.ref<!fir.array<10xi32>>232 %c0 = arith.constant 0 : index233 %6:3 = fir.box_dims %4, %c0 : (!fir.box<!fir.array<10xi32>>, index) -> (index, index, index)234 %7 = fir.shape %6#1 : (index) -> !fir.shape<1>235 %8:2 = hlfir.declare %5(%7) {fortran_attrs = #fir.var_attrs<host_assoc>, uniq_name = "_QFtest7Ex"} : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi32>>, !fir.ref<!fir.array<10xi32>>)236 %c1 = arith.constant 1 : index237 %9 = hlfir.designate %2#0 (%c1) {test.ptr = "test7_g(1)"} : (!fir.ref<!fir.array<10xi32>>, index) -> !fir.ref<i32>238 %10 = fir.load %9 : !fir.ref<i32>239 %c1_0 = arith.constant 1 : index240 %11 = hlfir.designate %8#0 (%c1_0) {test.ptr = "test7_x(1)"} : (!fir.ref<!fir.array<10xi32>>, index) -> !fir.ref<i32>241 hlfir.assign %10 to %11 : i32, !fir.ref<i32>242 return243}244fir.global @_QMglobalsEg : !fir.array<10xi32> {245 %0 = fir.undefined !fir.array<10xi32>246 fir.has_value %0 : !fir.array<10xi32>247}248 249// -----250 251// module globals252// integer, target :: g(10)253// end module globals254// subroutine test8255// use globals256// integer :: x(10)257// contains258// subroutine inner()259// x(1) = g(1)260// end subroutine inner261// end subroutine test8262 263// CHECK: test8_g(1)#0 <-> test8_x(1)#0: NoAlias264func.func @_QFtest8Pinner(%arg0: !fir.ref<tuple<!fir.box<!fir.array<10xi32>>>> {fir.host_assoc}) attributes {fir.internal_proc} {265 %0 = fir.address_of(@_QMglobalsEg) : !fir.ref<!fir.array<10xi32>>266 %c10 = arith.constant 10 : index267 %1 = fir.shape %c10 : (index) -> !fir.shape<1>268 %2:2 = hlfir.declare %0(%1) {fortran_attrs = #fir.var_attrs<target>, uniq_name = "_QMglobalsEg"} : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi32>>, !fir.ref<!fir.array<10xi32>>)269 %c0_i32 = arith.constant 0 : i32270 %3 = fir.coordinate_of %arg0, %c0_i32 : (!fir.ref<tuple<!fir.box<!fir.array<10xi32>>>>, i32) -> !fir.ref<!fir.box<!fir.array<10xi32>>>271 %4 = fir.load %3 : !fir.ref<!fir.box<!fir.array<10xi32>>>272 %5 = fir.box_addr %4 : (!fir.box<!fir.array<10xi32>>) -> !fir.ref<!fir.array<10xi32>>273 %c0 = arith.constant 0 : index274 %6:3 = fir.box_dims %4, %c0 : (!fir.box<!fir.array<10xi32>>, index) -> (index, index, index)275 %7 = fir.shape %6#1 : (index) -> !fir.shape<1>276 %8:2 = hlfir.declare %5(%7) {fortran_attrs = #fir.var_attrs<host_assoc>, uniq_name = "_QFtest8Ex"} : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi32>>, !fir.ref<!fir.array<10xi32>>)277 %c1 = arith.constant 1 : index278 %9 = hlfir.designate %2#0 (%c1) {test.ptr = "test8_g(1)"} : (!fir.ref<!fir.array<10xi32>>, index) -> !fir.ref<i32>279 %10 = fir.load %9 : !fir.ref<i32>280 %c1_0 = arith.constant 1 : index281 %11 = hlfir.designate %8#0 (%c1_0) {test.ptr = "test8_x(1)"} : (!fir.ref<!fir.array<10xi32>>, index) -> !fir.ref<i32>282 hlfir.assign %10 to %11 : i32, !fir.ref<i32>283 return284}285 286// -----287 288// module globals289// integer, pointer :: g(:)290// end module globals291// subroutine test9292// use globals293// integer :: x(10)294// contains295// subroutine inner()296// x(1) = g(1)297// end subroutine inner298// end subroutine test9299 300// CHECK: test9_g(1)#0 <-> test9_x(1)#0: NoAlias301func.func @_QFtest9Pinner(%arg0: !fir.ref<tuple<!fir.box<!fir.array<10xi32>>>> {fir.host_assoc}) attributes {fir.internal_proc} {302 %0 = fir.address_of(@_QMglobalsEg) : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>303 %1:2 = hlfir.declare %0 {fortran_attrs = #fir.var_attrs<pointer>, uniq_name = "_QMglobalsEg"} : (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>) -> (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>)304 %c0_i32 = arith.constant 0 : i32305 %2 = fir.coordinate_of %arg0, %c0_i32 : (!fir.ref<tuple<!fir.box<!fir.array<10xi32>>>>, i32) -> !fir.ref<!fir.box<!fir.array<10xi32>>>306 %3 = fir.load %2 : !fir.ref<!fir.box<!fir.array<10xi32>>>307 %4 = fir.box_addr %3 : (!fir.box<!fir.array<10xi32>>) -> !fir.ref<!fir.array<10xi32>>308 %c0 = arith.constant 0 : index309 %5:3 = fir.box_dims %3, %c0 : (!fir.box<!fir.array<10xi32>>, index) -> (index, index, index)310 %6 = fir.shape %5#1 : (index) -> !fir.shape<1>311 %7:2 = hlfir.declare %4(%6) {fortran_attrs = #fir.var_attrs<host_assoc>, uniq_name = "_QFtest9Ex"} : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi32>>, !fir.ref<!fir.array<10xi32>>)312 %8 = fir.load %1#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>313 %c1 = arith.constant 1 : index314 %9 = hlfir.designate %8 (%c1) {test.ptr = "test9_g(1)"} : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, index) -> !fir.ref<i32>315 %10 = fir.load %9 : !fir.ref<i32>316 %c1_0 = arith.constant 1 : index317 %11 = hlfir.designate %7#0 (%c1_0) {test.ptr = "test9_x(1)"} : (!fir.ref<!fir.array<10xi32>>, index) -> !fir.ref<i32>318 hlfir.assign %10 to %11 : i32, !fir.ref<i32>319 return320}321fir.global @_QMglobalsEg : !fir.box<!fir.ptr<!fir.array<?xi32>>> {322 %0 = fir.zero_bits !fir.ptr<!fir.array<?xi32>>323 %c0 = arith.constant 0 : index324 %1 = fir.shape %c0 : (index) -> !fir.shape<1>325 %2 = fir.embox %0(%1) : (!fir.ptr<!fir.array<?xi32>>, !fir.shape<1>) -> !fir.box<!fir.ptr<!fir.array<?xi32>>>326 fir.has_value %2 : !fir.box<!fir.ptr<!fir.array<?xi32>>>327}328 329// -----330 331// module globals332// integer, pointer :: g(:)333// end module globals334// subroutine test10335// use globals336// integer, target :: x(10)337// contains338// subroutine inner()339// x(1) = g(1)340// end subroutine inner341// end subroutine test10342 343// CHECK: test10_g(1)#0 <-> test10_x(1)#0: MayAlias344func.func @_QFtest10Pinner(%arg0: !fir.ref<tuple<!fir.box<!fir.array<10xi32>>>> {fir.host_assoc}) attributes {fir.internal_proc} {345 %0 = fir.address_of(@_QMglobalsEg) : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>346 %1:2 = hlfir.declare %0 {fortran_attrs = #fir.var_attrs<pointer>, uniq_name = "_QMglobalsEg"} : (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>) -> (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>)347 %c0_i32 = arith.constant 0 : i32348 %2 = fir.coordinate_of %arg0, %c0_i32 : (!fir.ref<tuple<!fir.box<!fir.array<10xi32>>>>, i32) -> !fir.ref<!fir.box<!fir.array<10xi32>>>349 %3 = fir.load %2 : !fir.ref<!fir.box<!fir.array<10xi32>>>350 %4 = fir.box_addr %3 : (!fir.box<!fir.array<10xi32>>) -> !fir.ref<!fir.array<10xi32>>351 %c0 = arith.constant 0 : index352 %5:3 = fir.box_dims %3, %c0 : (!fir.box<!fir.array<10xi32>>, index) -> (index, index, index)353 %6 = fir.shape %5#1 : (index) -> !fir.shape<1>354 %7:2 = hlfir.declare %4(%6) {fortran_attrs = #fir.var_attrs<target, host_assoc>, uniq_name = "_QFtest10Ex"} : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi32>>, !fir.ref<!fir.array<10xi32>>)355 %8 = fir.load %1#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>356 %c1 = arith.constant 1 : index357 %9 = hlfir.designate %8 (%c1) {test.ptr = "test10_g(1)"} : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, index) -> !fir.ref<i32>358 %10 = fir.load %9 : !fir.ref<i32>359 %c1_0 = arith.constant 1 : index360 %11 = hlfir.designate %7#0 (%c1_0) {test.ptr = "test10_x(1)"} : (!fir.ref<!fir.array<10xi32>>, index) -> !fir.ref<i32>361 hlfir.assign %10 to %11 : i32, !fir.ref<i32>362 return363}364fir.global @_QMglobalsEg : !fir.box<!fir.ptr<!fir.array<?xi32>>> {365 %0 = fir.zero_bits !fir.ptr<!fir.array<?xi32>>366 %c0 = arith.constant 0 : index367 %1 = fir.shape %c0 : (index) -> !fir.shape<1>368 %2 = fir.embox %0(%1) : (!fir.ptr<!fir.array<?xi32>>, !fir.shape<1>) -> !fir.box<!fir.ptr<!fir.array<?xi32>>>369 fir.has_value %2 : !fir.box<!fir.ptr<!fir.array<?xi32>>>370}371 372// -----373 374// module globals375// integer, target :: g(10)376// end module globals377// subroutine test11378// use globals379// integer, pointer :: x(:)380// contains381// subroutine inner()382// x(1) = g(1)383// end subroutine inner384// end subroutine test11385 386// CHECK: test11_g(1)#0 <-> test11_x(1)#0: MayAlias387func.func @_QFtest11Pinner(%arg0: !fir.ref<tuple<!fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>>> {fir.host_assoc}) attributes {fir.internal_proc} {388 %0 = fir.address_of(@_QMglobalsEg) : !fir.ref<!fir.array<10xi32>>389 %c10 = arith.constant 10 : index390 %1 = fir.shape %c10 : (index) -> !fir.shape<1>391 %2:2 = hlfir.declare %0(%1) {fortran_attrs = #fir.var_attrs<target>, uniq_name = "_QMglobalsEg"} : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi32>>, !fir.ref<!fir.array<10xi32>>)392 %c0_i32 = arith.constant 0 : i32393 %3 = fir.coordinate_of %arg0, %c0_i32 : (!fir.ref<tuple<!fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>>>, i32) -> !fir.llvm_ptr<!fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>>394 %4 = fir.load %3 : !fir.llvm_ptr<!fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>>395 %5:2 = hlfir.declare %4 {fortran_attrs = #fir.var_attrs<pointer, host_assoc>, uniq_name = "_QFtest11Ex"} : (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>) -> (!fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>, !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>)396 %c1 = arith.constant 1 : index397 %6 = hlfir.designate %2#0 (%c1) {test.ptr = "test11_g(1)"} : (!fir.ref<!fir.array<10xi32>>, index) -> !fir.ref<i32>398 %7 = fir.load %6 : !fir.ref<i32>399 %8 = fir.load %5#0 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>400 %c1_0 = arith.constant 1 : index401 %9 = hlfir.designate %8 (%c1_0) {test.ptr = "test11_x(1)"} : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, index) -> !fir.ref<i32>402 hlfir.assign %7 to %9 : i32, !fir.ref<i32>403 return404}405fir.global @_QMglobalsEg target : !fir.array<10xi32> {406 %0 = fir.undefined !fir.array<10xi32>407 fir.has_value %0 : !fir.array<10xi32>408}409