brintos

brintos / llvm-project-archived public Read only

0
0
Text · 29.2 KiB · 0624138 Raw
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