672 lines · plain
1// Use --mlir-disable-threading so that the AA queries are serialized2// as well as its diagnostic output.3// RUN: fir-opt %s -pass-pipeline='builtin.module(func.func(test-fir-alias-analysis))' -split-input-file --mlir-disable-threading 2>&1 | FileCheck %s4 5// CHECK-LABEL: Testing : "_QPtest1"6// CHECK: arraya(ii)#0 <-> arrayc(ii)#0: NoAlias7 8// Generated from 9// subroutine test1(arrayA, arrayB, arrayC, N)10// integer, dimension(:) :: arrayA, arrayB, arrayC11// integer N12// do ii = 1, N13// arrayC(ii) = arrayB(ii) + arrayA(ii)14// end do15// end subroutine16 17func.func @_QPtest1(%arg0: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "arraya"}, %arg1: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "arrayb"}, %arg2: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "arrayc"}, %arg3: !fir.ref<i32> {fir.bindc_name = "n"}) {18 %c1 = arith.constant 1 : index19 %c1_i64 = arith.constant 1 : i6420 %0 = fir.alloca i32 {bindc_name = "ii", uniq_name = "_QFtest1Eii"}21 %1 = fir.load %arg3 : !fir.ref<i32>22 %2 = fir.convert %1 : (i32) -> index23 %3 = fir.convert %c1 : (index) -> i3224 %4:2 = fir.do_loop %arg4 = %c1 to %2 step %c1 iter_args(%arg5 = %3) -> (index, i32) {25 fir.store %arg5 to %0 : !fir.ref<i32>26 %5 = fir.load %0 : !fir.ref<i32>27 %6 = fir.convert %5 : (i32) -> i6428 %7 = arith.subi %6, %c1_i64 : i6429 %8 = fir.coordinate_of %arg1, %7 : (!fir.box<!fir.array<?xi32>>, i64) -> !fir.ref<i32>30 %9 = fir.load %8 : !fir.ref<i32>31 %10 = fir.coordinate_of %arg0, %7 {test.ptr = "arraya(ii)"} : (!fir.box<!fir.array<?xi32>>, i64) -> !fir.ref<i32>32 %11 = fir.load %10 : !fir.ref<i32>33 %12 = arith.addi %9, %11 : i3234 %13 = fir.coordinate_of %arg2, %7 {test.ptr = "arrayc(ii)"} : (!fir.box<!fir.array<?xi32>>, i64) -> !fir.ref<i32>35 fir.store %12 to %13 : !fir.ref<i32>36 %14 = arith.addi %arg4, %c1 : index37 %15 = fir.load %0 : !fir.ref<i32>38 %16 = arith.addi %15, %3 : i3239 fir.result %14, %16 : index, i3240 }41 fir.store %4#1 to %0 : !fir.ref<i32>42 return43}44 45// -----46 47// CHECK-LABEL: Testing : "_QPtest3"48// CHECK: arraya(ii)#0 <-> arrayc(ii)#0: MayAlias49 50// subroutine test3(arrayA, arrayB, arrayC, N)51// integer, dimension(:), target :: arrayA52// integer, dimension(:) :: arrayB53// integer, dimension(:), pointer :: arrayC54// do ii = 1, N55// arrayC(ii) = arrayB(ii) + arrayA(ii)56// end do57// end subroutine58 59func.func @_QPtest3(%arg0: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "arraya", fir.target}, %arg1: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "arrayb"}, %arg2: !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>> {fir.bindc_name = "arrayc"}, %arg3: !fir.ref<i32> {fir.bindc_name = "n"}) {60 %c1 = arith.constant 1 : index61 %c0 = arith.constant 0 : index62 %c1_i64 = arith.constant 1 : i6463 %0 = fir.alloca i32 {bindc_name = "ii", uniq_name = "_QFtest3Eii"}64 %1 = fir.load %arg3 : !fir.ref<i32>65 %2 = fir.convert %1 : (i32) -> index66 %3 = fir.convert %c1 : (index) -> i3267 %4:2 = fir.do_loop %arg4 = %c1 to %2 step %c1 iter_args(%arg5 = %3) -> (index, i32) {68 fir.store %arg5 to %0 : !fir.ref<i32>69 %5 = fir.load %0 : !fir.ref<i32>70 %6 = fir.convert %5 : (i32) -> i6471 %7 = arith.subi %6, %c1_i64 : i6472 %8 = fir.coordinate_of %arg1, %7 : (!fir.box<!fir.array<?xi32>>, i64) -> !fir.ref<i32>73 %9 = fir.load %8 : !fir.ref<i32>74 %10 = fir.coordinate_of %arg0, %7 {test.ptr = "arraya(ii)"} : (!fir.box<!fir.array<?xi32>>, i64) -> !fir.ref<i32>75 %11 = fir.load %10 : !fir.ref<i32>76 %12 = arith.addi %9, %11 : i3277 %13 = fir.load %arg2 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>78 %14:3 = fir.box_dims %13, %c0 : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, index) -> (index, index, index)79 %15 = fir.convert %14#0 : (index) -> i6480 %16 = arith.subi %6, %15 : i6481 %17 = fir.coordinate_of %13, %16 {test.ptr = "arrayc(ii)"} : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, i64) -> !fir.ref<i32>82 fir.store %12 to %17 : !fir.ref<i32>83 %18 = arith.addi %arg4, %c1 : index84 %19 = fir.load %0 : !fir.ref<i32>85 %20 = arith.addi %19, %3 : i3286 fir.result %18, %20 : index, i3287 }88 fir.store %4#1 to %0 : !fir.ref<i32>89 return90}91 92// -----93 94// CHECK-LABEL: Testing : "_QMtest4Ptest"95// CHECK: arraya(ii)#0 <-> arrayc(ii)#0: NoAlias96 97// module test498// integer, dimension(:), allocatable :: arrayA99// integer, dimension(:), allocatable :: arrayB100// integer, dimension(:), allocatable :: arrayC101// integer :: N102// contains103// subroutine test104// do ii = 1, N105// arrayC(ii) = arrayB(ii) + arrayA(ii)106// end do107// end subroutine108// endmodule109 110fir.global @_QMtest4Earraya : !fir.box<!fir.heap<!fir.array<?xi32>>> 111fir.global @_QMtest4Earrayb : !fir.box<!fir.heap<!fir.array<?xi32>>> 112fir.global @_QMtest4Earrayc : !fir.box<!fir.heap<!fir.array<?xi32>>> 113fir.global @_QMtest4En : i32114 115func.func @_QMtest4Ptest() {116 %c1 = arith.constant 1 : index117 %c0 = arith.constant 0 : index118 %0 = fir.address_of(@_QMtest4Earraya) : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>119 %1 = fir.address_of(@_QMtest4Earrayb) : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>120 %2 = fir.address_of(@_QMtest4Earrayc) : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>121 %3 = fir.address_of(@_QMtest4En) : !fir.ref<i32>122 %4 = fir.alloca i32 {bindc_name = "ii", uniq_name = "_QMtest4FtestEii"}123 %5 = fir.load %3 : !fir.ref<i32>124 %6 = fir.convert %5 : (i32) -> index125 %7 = fir.convert %c1 : (index) -> i32126 %8:2 = fir.do_loop %arg0 = %c1 to %6 step %c1 iter_args(%arg1 = %7) -> (index, i32) {127 fir.store %arg1 to %4 : !fir.ref<i32>128 %9 = fir.load %1 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>129 %10:3 = fir.box_dims %9, %c0 : (!fir.box<!fir.heap<!fir.array<?xi32>>>, index) -> (index, index, index)130 %11 = fir.box_addr %9 : (!fir.box<!fir.heap<!fir.array<?xi32>>>) -> !fir.heap<!fir.array<?xi32>>131 %12 = fir.load %4 : !fir.ref<i32>132 %13 = fir.convert %12 : (i32) -> i64133 %14 = fir.convert %10#0 : (index) -> i64134 %15 = arith.subi %13, %14 : i64135 %16 = fir.coordinate_of %11, %15 : (!fir.heap<!fir.array<?xi32>>, i64) -> !fir.ref<i32>136 %17 = fir.load %16 : !fir.ref<i32>137 %18 = fir.load %0 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>138 %19:3 = fir.box_dims %18, %c0 : (!fir.box<!fir.heap<!fir.array<?xi32>>>, index) -> (index, index, index)139 %20 = fir.box_addr %18 : (!fir.box<!fir.heap<!fir.array<?xi32>>>) -> !fir.heap<!fir.array<?xi32>>140 %21 = fir.convert %19#0 : (index) -> i64141 %22 = arith.subi %13, %21 : i64142 %23 = fir.coordinate_of %20, %22 {test.ptr = "arraya(ii)"} : (!fir.heap<!fir.array<?xi32>>, i64) -> !fir.ref<i32>143 %24 = fir.load %23 : !fir.ref<i32>144 %25 = arith.addi %17, %24 : i32145 %26 = fir.load %2 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>146 %27:3 = fir.box_dims %26, %c0 : (!fir.box<!fir.heap<!fir.array<?xi32>>>, index) -> (index, index, index)147 %28 = fir.box_addr %26 : (!fir.box<!fir.heap<!fir.array<?xi32>>>) -> !fir.heap<!fir.array<?xi32>>148 %29 = fir.convert %27#0 : (index) -> i64149 %30 = arith.subi %13, %29 : i64150 %31 = fir.coordinate_of %28, %30 {test.ptr = "arrayc(ii)"} : (!fir.heap<!fir.array<?xi32>>, i64) -> !fir.ref<i32>151 fir.store %25 to %31 : !fir.ref<i32>152 %32 = arith.addi %arg0, %c1 : index153 %33 = fir.load %4 : !fir.ref<i32>154 %34 = arith.addi %33, %7 : i32155 fir.result %32, %34 : index, i32156 }157 fir.store %8#1 to %4 : !fir.ref<i32>158 return159}160 161// -----162 163// CHECK-LABEL: Testing : "_QMtest5Ptest"164// CHECK: arraya(ii)#0 <-> arrayc(ii)#0: NoAlias165 166// module test5167// integer, dimension(:), allocatable :: arrayA168// integer, dimension(:), allocatable :: arrayB169// integer, dimension(:), pointer :: arrayC170// integer :: N171// contains172// subroutine test173// do ii = 1, N174// arrayC(ii) = arrayB(ii) + arrayA(ii)175// end do176// end subroutine177// endmodule178 179fir.global @_QMtest5Earraya : !fir.box<!fir.heap<!fir.array<?xi32>>> 180fir.global @_QMtest5Earrayb : !fir.box<!fir.heap<!fir.array<?xi32>>>181fir.global @_QMtest5Earrayc : !fir.box<!fir.ptr<!fir.array<?xi32>>>182fir.global @_QMtest5En : i32183 184func.func @_QMtest5Ptest() {185 %c1 = arith.constant 1 : index186 %c0 = arith.constant 0 : index187 %0 = fir.address_of(@_QMtest5Earraya) : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>188 %1 = fir.address_of(@_QMtest5Earrayb) : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>189 %2 = fir.address_of(@_QMtest5Earrayc) : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>190 %3 = fir.address_of(@_QMtest5En) : !fir.ref<i32>191 %4 = fir.alloca i32 {bindc_name = "ii", uniq_name = "_QMtest5FtestEii"}192 %5 = fir.load %3 : !fir.ref<i32>193 %6 = fir.convert %5 : (i32) -> index194 %7 = fir.convert %c1 : (index) -> i32195 %8:2 = fir.do_loop %arg0 = %c1 to %6 step %c1 iter_args(%arg1 = %7) -> (index, i32) {196 fir.store %arg1 to %4 : !fir.ref<i32>197 %9 = fir.load %1 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>198 %10:3 = fir.box_dims %9, %c0 : (!fir.box<!fir.heap<!fir.array<?xi32>>>, index) -> (index, index, index)199 %11 = fir.box_addr %9 : (!fir.box<!fir.heap<!fir.array<?xi32>>>) -> !fir.heap<!fir.array<?xi32>>200 %12 = fir.load %4 : !fir.ref<i32>201 %13 = fir.convert %12 : (i32) -> i64202 %14 = fir.convert %10#0 : (index) -> i64203 %15 = arith.subi %13, %14 : i64204 %16 = fir.coordinate_of %11, %15 : (!fir.heap<!fir.array<?xi32>>, i64) -> !fir.ref<i32>205 %17 = fir.load %16 : !fir.ref<i32>206 %18 = fir.load %0 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>207 %19:3 = fir.box_dims %18, %c0 : (!fir.box<!fir.heap<!fir.array<?xi32>>>, index) -> (index, index, index)208 %20 = fir.box_addr %18 : (!fir.box<!fir.heap<!fir.array<?xi32>>>) -> !fir.heap<!fir.array<?xi32>>209 %21 = fir.convert %19#0 : (index) -> i64210 %22 = arith.subi %13, %21 : i64211 %23 = fir.coordinate_of %20, %22 {test.ptr = "arraya(ii)"} : (!fir.heap<!fir.array<?xi32>>, i64) -> !fir.ref<i32>212 %24 = fir.load %23 : !fir.ref<i32>213 %25 = arith.addi %17, %24 : i32214 %26 = fir.load %2 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>215 %27:3 = fir.box_dims %26, %c0 : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, index) -> (index, index, index)216 %28 = fir.convert %27#0 : (index) -> i64217 %29 = arith.subi %13, %28 : i64218 %30 = fir.coordinate_of %26, %29 {test.ptr = "arrayc(ii)"} : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, i64) -> !fir.ref<i32>219 fir.store %25 to %30 : !fir.ref<i32>220 %31 = arith.addi %arg0, %c1 : index221 %32 = fir.load %4 : !fir.ref<i32>222 %33 = arith.addi %32, %7 : i32223 fir.result %31, %33 : index, i32224 }225 fir.store %8#1 to %4 : !fir.ref<i32>226 return227}228 229// -----230 231// CHECK-LABEL: Testing : "_QMtest6Ptest"232// CHECK: arraya(ii)#0 <-> arrayc(ii)#0: MayAlias233 234// module test6235// integer, dimension(:), allocatable, target :: arrayA236// integer, dimension(:), allocatable :: arrayB237// integer, dimension(:), pointer :: arrayC238// integer :: N239// contains240// subroutine test241// do ii = 1, N242// arrayC(ii) = arrayB(ii) + arrayA(ii)243// end do244// end subroutine245// endmodule246 247fir.global @_QMtest6Earraya target : !fir.box<!fir.heap<!fir.array<?xi32>>> 248fir.global @_QMtest6Earrayb : !fir.box<!fir.heap<!fir.array<?xi32>>>249fir.global @_QMtest6Earrayc : !fir.box<!fir.ptr<!fir.array<?xi32>>>250fir.global @_QMtest6En : i32251 252func.func @_QMtest6Ptest() {253 %c1 = arith.constant 1 : index254 %c0 = arith.constant 0 : index255 %0 = fir.address_of(@_QMtest6Earraya) : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>256 %1 = fir.address_of(@_QMtest6Earrayb) : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>257 %2 = fir.address_of(@_QMtest6Earrayc) : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>258 %3 = fir.address_of(@_QMtest6En) : !fir.ref<i32>259 %4 = fir.alloca i32 {bindc_name = "ii", uniq_name = "_QMtest6FtestEii"}260 %5 = fir.load %3 : !fir.ref<i32>261 %6 = fir.convert %5 : (i32) -> index262 %7 = fir.convert %c1 : (index) -> i32263 %8:2 = fir.do_loop %arg0 = %c1 to %6 step %c1 iter_args(%arg1 = %7) -> (index, i32) {264 fir.store %arg1 to %4 : !fir.ref<i32>265 %9 = fir.load %1 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>266 %10:3 = fir.box_dims %9, %c0 : (!fir.box<!fir.heap<!fir.array<?xi32>>>, index) -> (index, index, index)267 %11 = fir.box_addr %9 : (!fir.box<!fir.heap<!fir.array<?xi32>>>) -> !fir.heap<!fir.array<?xi32>>268 %12 = fir.load %4 : !fir.ref<i32>269 %13 = fir.convert %12 : (i32) -> i64270 %14 = fir.convert %10#0 : (index) -> i64271 %15 = arith.subi %13, %14 : i64272 %16 = fir.coordinate_of %11, %15 : (!fir.heap<!fir.array<?xi32>>, i64) -> !fir.ref<i32>273 %17 = fir.load %16 : !fir.ref<i32>274 %18 = fir.load %0 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>275 %19:3 = fir.box_dims %18, %c0 : (!fir.box<!fir.heap<!fir.array<?xi32>>>, index) -> (index, index, index)276 %20 = fir.box_addr %18 : (!fir.box<!fir.heap<!fir.array<?xi32>>>) -> !fir.heap<!fir.array<?xi32>>277 %21 = fir.convert %19#0 : (index) -> i64278 %22 = arith.subi %13, %21 : i64279 %23 = fir.coordinate_of %20, %22 {test.ptr = "arraya(ii)"} : (!fir.heap<!fir.array<?xi32>>, i64) -> !fir.ref<i32>280 %24 = fir.load %23 : !fir.ref<i32>281 %25 = arith.addi %17, %24 : i32282 %26 = fir.load %2 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>283 %27:3 = fir.box_dims %26, %c0 : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, index) -> (index, index, index)284 %28 = fir.convert %27#0 : (index) -> i64285 %29 = arith.subi %13, %28 : i64286 %30 = fir.coordinate_of %26, %29 {test.ptr = "arrayc(ii)"} : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, i64) -> !fir.ref<i32>287 fir.store %25 to %30 : !fir.ref<i32>288 %31 = arith.addi %arg0, %c1 : index289 %32 = fir.load %4 : !fir.ref<i32>290 %33 = arith.addi %32, %7 : i32291 fir.result %31, %33 : index, i32292 }293 fir.store %8#1 to %4 : !fir.ref<i32>294 return295}296 297// -----298 299// CHECK-LABEL: Testing : "_QMtest7Ptest"300// CHECK: arraya(ii)#0 <-> arrayc(ii)#0: MayAlias301 302// module test7303// integer, dimension(1000), target :: arrayA304// integer, dimension(:), allocatable :: arrayB305// integer, dimension(:), pointer :: arrayC306// integer :: N307// contains308// subroutine test309// do ii = 1, N310// arrayC(ii) = arrayB(ii) + arrayA(ii)311// end do312// end subroutine313// endmodule314 315fir.global @_QMtest7Earraya target : !fir.array<1000xi32> 316fir.global @_QMtest7Earrayb : !fir.box<!fir.heap<!fir.array<?xi32>>> 317fir.global @_QMtest7Earrayc : !fir.box<!fir.ptr<!fir.array<?xi32>>> 318fir.global @_QMtest7En : i32 319 320func.func @_QMtest7Ptest() {321 %c1 = arith.constant 1 : index322 %c1_i64 = arith.constant 1 : i64323 %c0 = arith.constant 0 : index324 %0 = fir.address_of(@_QMtest7Earraya) : !fir.ref<!fir.array<1000xi32>>325 %1 = fir.address_of(@_QMtest7Earrayb) : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>326 %2 = fir.address_of(@_QMtest7Earrayc) : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>327 %3 = fir.address_of(@_QMtest7En) : !fir.ref<i32>328 %4 = fir.alloca i32 {bindc_name = "ii", uniq_name = "_QMtest7FtestEii"}329 %5 = fir.load %3 : !fir.ref<i32>330 %6 = fir.convert %5 : (i32) -> index331 %7 = fir.convert %c1 : (index) -> i32332 %8:2 = fir.do_loop %arg0 = %c1 to %6 step %c1 iter_args(%arg1 = %7) -> (index, i32) {333 fir.store %arg1 to %4 : !fir.ref<i32>334 %9 = fir.load %1 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>335 %10:3 = fir.box_dims %9, %c0 : (!fir.box<!fir.heap<!fir.array<?xi32>>>, index) -> (index, index, index)336 %11 = fir.box_addr %9 : (!fir.box<!fir.heap<!fir.array<?xi32>>>) -> !fir.heap<!fir.array<?xi32>>337 %12 = fir.load %4 : !fir.ref<i32>338 %13 = fir.convert %12 : (i32) -> i64339 %14 = fir.convert %10#0 : (index) -> i64340 %15 = arith.subi %13, %14 : i64341 %16 = fir.coordinate_of %11, %15 : (!fir.heap<!fir.array<?xi32>>, i64) -> !fir.ref<i32>342 %17 = fir.load %16 : !fir.ref<i32>343 %18 = arith.subi %13, %c1_i64 : i64344 %19 = fir.coordinate_of %0, %18 {test.ptr = "arraya(ii)"} : (!fir.ref<!fir.array<1000xi32>>, i64) -> !fir.ref<i32>345 %20 = fir.load %19 : !fir.ref<i32>346 %21 = arith.addi %17, %20 : i32347 %22 = fir.load %2 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>348 %23:3 = fir.box_dims %22, %c0 : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, index) -> (index, index, index)349 %24 = fir.convert %23#0 : (index) -> i64350 %25 = arith.subi %13, %24 : i64351 %26 = fir.coordinate_of %22, %25 {test.ptr = "arrayc(ii)"} : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, i64) -> !fir.ref<i32>352 fir.store %21 to %26 : !fir.ref<i32>353 %27 = arith.addi %arg0, %c1 : index354 %28 = fir.load %4 : !fir.ref<i32>355 %29 = arith.addi %28, %7 : i32356 fir.result %27, %29 : index, i32357 }358 fir.store %8#1 to %4 : !fir.ref<i32>359 return360}361 362// -----363 364// CHECK-LABEL: Testing : "_QMtest8Ptest"365// CHECK: arraya(ii)#0 <-> arrayc(ii)#0: NoAlias366 367// module test8368// integer, dimension(1000) :: arrayA369// integer, dimension(:), allocatable :: arrayB370// integer, dimension(:), pointer :: arrayC371// integer :: N372// contains373// subroutine test374// do ii = 1, N375// arrayC(ii) = arrayB(ii) + arrayA(ii)376// end do377// end subroutine378// endmodule379 380fir.global @_QMtest8Earraya : !fir.array<1000xi32> 381fir.global @_QMtest8Earrayb : !fir.box<!fir.heap<!fir.array<?xi32>>> 382fir.global @_QMtest8Earrayc : !fir.box<!fir.ptr<!fir.array<?xi32>>> 383fir.global @_QMtest8En : i32 384 385func.func @_QMtest8Ptest() {386 %c1 = arith.constant 1 : index387 %c1_i64 = arith.constant 1 : i64388 %c0 = arith.constant 0 : index389 %0 = fir.address_of(@_QMtest8Earraya) : !fir.ref<!fir.array<1000xi32>>390 %1 = fir.address_of(@_QMtest8Earrayb) : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>391 %2 = fir.address_of(@_QMtest8Earrayc) : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>392 %3 = fir.address_of(@_QMtest8En) : !fir.ref<i32>393 %4 = fir.alloca i32 {bindc_name = "ii", uniq_name = "_QMtest8FtestEii"}394 %5 = fir.load %3 : !fir.ref<i32>395 %6 = fir.convert %5 : (i32) -> index396 %7 = fir.convert %c1 : (index) -> i32397 %8:2 = fir.do_loop %arg0 = %c1 to %6 step %c1 iter_args(%arg1 = %7) -> (index, i32) {398 fir.store %arg1 to %4 : !fir.ref<i32>399 %9 = fir.load %1 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>400 %10:3 = fir.box_dims %9, %c0 : (!fir.box<!fir.heap<!fir.array<?xi32>>>, index) -> (index, index, index)401 %11 = fir.box_addr %9 : (!fir.box<!fir.heap<!fir.array<?xi32>>>) -> !fir.heap<!fir.array<?xi32>>402 %12 = fir.load %4 : !fir.ref<i32>403 %13 = fir.convert %12 : (i32) -> i64404 %14 = fir.convert %10#0 : (index) -> i64405 %15 = arith.subi %13, %14 : i64406 %16 = fir.coordinate_of %11, %15 : (!fir.heap<!fir.array<?xi32>>, i64) -> !fir.ref<i32>407 %17 = fir.load %16 : !fir.ref<i32>408 %18 = arith.subi %13, %c1_i64 : i64409 %19 = fir.coordinate_of %0, %18 {test.ptr = "arraya(ii)"} : (!fir.ref<!fir.array<1000xi32>>, i64) -> !fir.ref<i32>410 %20 = fir.load %19 : !fir.ref<i32>411 %21 = arith.addi %17, %20 : i32412 %22 = fir.load %2 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>413 %23:3 = fir.box_dims %22, %c0 : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, index) -> (index, index, index)414 %24 = fir.convert %23#0 : (index) -> i64415 %25 = arith.subi %13, %24 : i64416 %26 = fir.coordinate_of %22, %25 {test.ptr = "arrayc(ii)"} : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, i64) -> !fir.ref<i32>417 fir.store %21 to %26 : !fir.ref<i32>418 %27 = arith.addi %arg0, %c1 : index419 %28 = fir.load %4 : !fir.ref<i32>420 %29 = arith.addi %28, %7 : i32421 fir.result %27, %29 : index, i32422 }423 fir.store %8#1 to %4 : !fir.ref<i32>424 return425}426 427// -----428 429// CHECK-LABEL: Testing : "_QMtest9Ptest"430// CHECK: arraya(ii)#0 <-> arrayc(ii)#0: NoAlias431 432// module test9433// integer, dimension(:), allocatable :: arrayB434// integer, dimension(:), pointer :: arrayC435// integer :: N436// contains437// subroutine test(arrayA)438// integer, dimension(:) :: arrayA439// do ii = 1, N440// arrayC(ii) = arrayB(ii) + arrayA(ii)441// end do442// end subroutine443// endmodule444 445fir.global @_QMtest9Earrayb : !fir.box<!fir.heap<!fir.array<?xi32>>> 446fir.global @_QMtest9Earrayc : !fir.box<!fir.ptr<!fir.array<?xi32>>>447fir.global @_QMtest9En : i32448 449func.func @_QMtest9Ptest(%arg0: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "arraya"}) {450 %c1 = arith.constant 1 : index451 %c1_i64 = arith.constant 1 : i64452 %c0 = arith.constant 0 : index453 %0 = fir.address_of(@_QMtest9Earrayb) : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>454 %1 = fir.address_of(@_QMtest9Earrayc) : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>455 %2 = fir.address_of(@_QMtest9En) : !fir.ref<i32>456 %3 = fir.alloca i32 {bindc_name = "ii", uniq_name = "_QMtest9FtestEii"}457 %4 = fir.load %2 : !fir.ref<i32>458 %5 = fir.convert %4 : (i32) -> index459 %6 = fir.convert %c1 : (index) -> i32460 %7:2 = fir.do_loop %arg1 = %c1 to %5 step %c1 iter_args(%arg2 = %6) -> (index, i32) {461 fir.store %arg2 to %3 : !fir.ref<i32>462 %8 = fir.load %0 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>463 %9:3 = fir.box_dims %8, %c0 : (!fir.box<!fir.heap<!fir.array<?xi32>>>, index) -> (index, index, index)464 %10 = fir.box_addr %8 : (!fir.box<!fir.heap<!fir.array<?xi32>>>) -> !fir.heap<!fir.array<?xi32>>465 %11 = fir.load %3 : !fir.ref<i32>466 %12 = fir.convert %11 : (i32) -> i64467 %13 = fir.convert %9#0 : (index) -> i64468 %14 = arith.subi %12, %13 : i64469 %15 = fir.coordinate_of %10, %14 : (!fir.heap<!fir.array<?xi32>>, i64) -> !fir.ref<i32>470 %16 = fir.load %15 : !fir.ref<i32>471 %17 = arith.subi %12, %c1_i64 : i64472 %18 = fir.coordinate_of %arg0, %17 {test.ptr = "arraya(ii)"} : (!fir.box<!fir.array<?xi32>>, i64) -> !fir.ref<i32>473 %19 = fir.load %18 : !fir.ref<i32>474 %20 = arith.addi %16, %19 : i32475 %21 = fir.load %1 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>476 %22:3 = fir.box_dims %21, %c0 : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, index) -> (index, index, index)477 %23 = fir.convert %22#0 : (index) -> i64478 %24 = arith.subi %12, %23 : i64479 %25 = fir.coordinate_of %21, %24 {test.ptr = "arrayc(ii)"} : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, i64) -> !fir.ref<i32>480 fir.store %20 to %25 : !fir.ref<i32>481 %26 = arith.addi %arg1, %c1 : index482 %27 = fir.load %3 : !fir.ref<i32>483 %28 = arith.addi %27, %6 : i32484 fir.result %26, %28 : index, i32485 }486 fir.store %7#1 to %3 : !fir.ref<i32>487 return488}489 490// -----491 492// CHECK-LABEL: Testing : "_QMtest10Ptest"493// CHECK: arraya(ii)#0 <-> arrayc(ii)#0: MayAlias494 495// module test10496// integer, dimension(:), allocatable :: arrayB497// integer, dimension(:), pointer :: arrayC498// integer :: N499// contains500// subroutine test(arrayA)501// integer, dimension(:), target :: arrayA502// do ii = 1, N503// arrayC(ii) = arrayB(ii) + arrayA(ii)504// end do505// end subroutine506// endmodule507 508fir.global @_QMtest10Earrayb : !fir.box<!fir.heap<!fir.array<?xi32>>> 509fir.global @_QMtest10Earrayc : !fir.box<!fir.ptr<!fir.array<?xi32>>> 510fir.global @_QMtest10En : i32511 512func.func @_QMtest10Ptest(%arg0: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "arraya", fir.target}) {513 %c1 = arith.constant 1 : index514 %c1_i64 = arith.constant 1 : i64515 %c0 = arith.constant 0 : index516 %0 = fir.address_of(@_QMtest10Earrayb) : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>517 %1 = fir.address_of(@_QMtest10Earrayc) : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>518 %2 = fir.address_of(@_QMtest10En) : !fir.ref<i32>519 %3 = fir.alloca i32 {bindc_name = "ii", uniq_name = "_QMtest10FtestEii"}520 %4 = fir.load %2 : !fir.ref<i32>521 %5 = fir.convert %4 : (i32) -> index522 %6 = fir.convert %c1 : (index) -> i32523 %7:2 = fir.do_loop %arg1 = %c1 to %5 step %c1 iter_args(%arg2 = %6) -> (index, i32) {524 fir.store %arg2 to %3 : !fir.ref<i32>525 %8 = fir.load %0 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>526 %9:3 = fir.box_dims %8, %c0 : (!fir.box<!fir.heap<!fir.array<?xi32>>>, index) -> (index, index, index)527 %10 = fir.box_addr %8 : (!fir.box<!fir.heap<!fir.array<?xi32>>>) -> !fir.heap<!fir.array<?xi32>>528 %11 = fir.load %3 : !fir.ref<i32>529 %12 = fir.convert %11 : (i32) -> i64530 %13 = fir.convert %9#0 : (index) -> i64531 %14 = arith.subi %12, %13 : i64532 %15 = fir.coordinate_of %10, %14 : (!fir.heap<!fir.array<?xi32>>, i64) -> !fir.ref<i32>533 %16 = fir.load %15 : !fir.ref<i32>534 %17 = arith.subi %12, %c1_i64 : i64535 %18 = fir.coordinate_of %arg0, %17 {test.ptr = "arraya(ii)"} : (!fir.box<!fir.array<?xi32>>, i64) -> !fir.ref<i32>536 %19 = fir.load %18 : !fir.ref<i32>537 %20 = arith.addi %16, %19 : i32538 %21 = fir.load %1 : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xi32>>>>539 %22:3 = fir.box_dims %21, %c0 : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, index) -> (index, index, index)540 %23 = fir.convert %22#0 : (index) -> i64541 %24 = arith.subi %12, %23 : i64542 %25 = fir.coordinate_of %21, %24 {test.ptr = "arrayc(ii)"} : (!fir.box<!fir.ptr<!fir.array<?xi32>>>, i64) -> !fir.ref<i32>543 fir.store %20 to %25 : !fir.ref<i32>544 %26 = arith.addi %arg1, %c1 : index545 %27 = fir.load %3 : !fir.ref<i32>546 %28 = arith.addi %27, %6 : i32547 fir.result %26, %28 : index, i32548 }549 fir.store %7#1 to %3 : !fir.ref<i32>550 return551}552 553// -----554 555// CHECK-LABEL: Testing : "_QMtest11Ptest"556// CHECK: arraya(ii)#0 <-> arrayc(ii)#0: MayAlias557 558// module test11559// integer, dimension(:), allocatable :: arrayB560// integer, dimension(1000), target :: arrayC561// integer :: N562// contains563// subroutine test(arrayA)564// integer, dimension(:), target :: arrayA565// do ii = 1, N566// arrayC(ii) = arrayB(ii) + arrayA(ii)567// end do568// end subroutine569// endmodule570 571fir.global @_QMtest11Earrayb : !fir.box<!fir.heap<!fir.array<?xi32>>> 572fir.global @_QMtest11Earrayc target : !fir.array<1000xi32> 573fir.global @_QMtest11En : i32 574 575func.func @_QMtest11Ptest(%arg0: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "arraya", fir.target}) {576 %c1 = arith.constant 1 : index577 %c1_i64 = arith.constant 1 : i64578 %c0 = arith.constant 0 : index579 %0 = fir.address_of(@_QMtest11Earrayb) : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>580 %1 = fir.address_of(@_QMtest11Earrayc) : !fir.ref<!fir.array<1000xi32>>581 %2 = fir.address_of(@_QMtest11En) : !fir.ref<i32>582 %3 = fir.alloca i32 {bindc_name = "ii", uniq_name = "_QMtest11FtestEii"}583 %4 = fir.load %2 : !fir.ref<i32>584 %5 = fir.convert %4 : (i32) -> index585 %6 = fir.convert %c1 : (index) -> i32586 %7:2 = fir.do_loop %arg1 = %c1 to %5 step %c1 iter_args(%arg2 = %6) -> (index, i32) {587 fir.store %arg2 to %3 : !fir.ref<i32>588 %8 = fir.load %0 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>589 %9:3 = fir.box_dims %8, %c0 : (!fir.box<!fir.heap<!fir.array<?xi32>>>, index) -> (index, index, index)590 %10 = fir.box_addr %8 : (!fir.box<!fir.heap<!fir.array<?xi32>>>) -> !fir.heap<!fir.array<?xi32>>591 %11 = fir.load %3 : !fir.ref<i32>592 %12 = fir.convert %11 : (i32) -> i64593 %13 = fir.convert %9#0 : (index) -> i64594 %14 = arith.subi %12, %13 : i64595 %15 = fir.coordinate_of %10, %14 : (!fir.heap<!fir.array<?xi32>>, i64) -> !fir.ref<i32>596 %16 = fir.load %15 : !fir.ref<i32>597 %17 = arith.subi %12, %c1_i64 : i64598 %18 = fir.coordinate_of %arg0, %17 {test.ptr = "arraya(ii)"} : (!fir.box<!fir.array<?xi32>>, i64) -> !fir.ref<i32>599 %19 = fir.load %18 : !fir.ref<i32>600 %20 = arith.addi %16, %19 : i32601 %21 = fir.coordinate_of %1, %17 {test.ptr = "arrayc(ii)"} : (!fir.ref<!fir.array<1000xi32>>, i64) -> !fir.ref<i32>602 fir.store %20 to %21 : !fir.ref<i32>603 %22 = arith.addi %arg1, %c1 : index604 %23 = fir.load %3 : !fir.ref<i32>605 %24 = arith.addi %23, %6 : i32606 fir.result %22, %24 : index, i32607 }608 fir.store %7#1 to %3 : !fir.ref<i32>609 return610}611 612 613// -----614 615// CHECK-LABEL: Testing : "_QMtest12Ptest"616// CHECK: arraya(ii)#0 <-> arrayc(ii)#0: NoAlias617 618// module test12619// integer, dimension(:), allocatable :: arrayB620// integer, dimension(1000) :: arrayC621// integer :: N622// contains623// subroutine test(arrayA)624// integer, dimension(:), target :: arrayA625// do ii = 1, N626// arrayC(ii) = arrayB(ii) + arrayA(ii)627// end do628// end subroutine629// endmodule630 631fir.global @_QMtest12Earrayb : !fir.box<!fir.heap<!fir.array<?xi32>>>632fir.global @_QMtest12Earrayc : !fir.array<1000xi32> 633fir.global @_QMtest12En : i32634 635func.func @_QMtest12Ptest(%arg0: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "arraya", fir.target}) {636 %c1 = arith.constant 1 : index637 %c1_i64 = arith.constant 1 : i64638 %c0 = arith.constant 0 : index639 %0 = fir.address_of(@_QMtest12Earrayb) : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>640 %1 = fir.address_of(@_QMtest12Earrayc) : !fir.ref<!fir.array<1000xi32>>641 %2 = fir.address_of(@_QMtest12En) : !fir.ref<i32>642 %3 = fir.alloca i32 {bindc_name = "ii", uniq_name = "_QMtest12FtestEii"}643 %4 = fir.load %2 : !fir.ref<i32>644 %5 = fir.convert %4 : (i32) -> index645 %6 = fir.convert %c1 : (index) -> i32646 %7:2 = fir.do_loop %arg1 = %c1 to %5 step %c1 iter_args(%arg2 = %6) -> (index, i32) {647 fir.store %arg2 to %3 : !fir.ref<i32>648 %8 = fir.load %0 : !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>649 %9:3 = fir.box_dims %8, %c0 : (!fir.box<!fir.heap<!fir.array<?xi32>>>, index) -> (index, index, index)650 %10 = fir.box_addr %8 : (!fir.box<!fir.heap<!fir.array<?xi32>>>) -> !fir.heap<!fir.array<?xi32>>651 %11 = fir.load %3 : !fir.ref<i32>652 %12 = fir.convert %11 : (i32) -> i64653 %13 = fir.convert %9#0 : (index) -> i64654 %14 = arith.subi %12, %13 : i64655 %15 = fir.coordinate_of %10, %14 : (!fir.heap<!fir.array<?xi32>>, i64) -> !fir.ref<i32>656 %16 = fir.load %15 : !fir.ref<i32>657 %17 = arith.subi %12, %c1_i64 : i64658 %18 = fir.coordinate_of %arg0, %17 {test.ptr = "arraya(ii)"} : (!fir.box<!fir.array<?xi32>>, i64) -> !fir.ref<i32>659 %19 = fir.load %18 : !fir.ref<i32>660 %20 = arith.addi %16, %19 : i32661 %21 = fir.coordinate_of %1, %17 {test.ptr = "arrayc(ii)"} : (!fir.ref<!fir.array<1000xi32>>, i64) -> !fir.ref<i32>662 fir.store %20 to %21 : !fir.ref<i32>663 %22 = arith.addi %arg1, %c1 : index664 %23 = fir.load %3 : !fir.ref<i32>665 %24 = arith.addi %23, %6 : i32666 fir.result %22, %24 : index, i32667 }668 fir.store %7#1 to %3 : !fir.ref<i32>669 return670}671 672