1// Use --mlir-disable-threading so that the AA queries are serialized 2// 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 %s 4 5// CHECK-LABEL: Testing : "_QPtest1" 6// CHECK: arraya(ii)#0 <-> arrayc(ii)#0: NoAlias 7 8// Generated from 9// subroutine test1(arrayA, arrayB, arrayC, N) 10// integer, dimension(:) :: arrayA, arrayB, arrayC 11// integer N 12// do ii = 1, N 13// arrayC(ii) = arrayB(ii) + arrayA(ii) 14// end do 15// end subroutine 16 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 : index 19 %c1_i64 = arith.constant 1 : i64 20 %0 = fir.alloca i32 {bindc_name = "ii", uniq_name = "_QFtest1Eii"} 21 %1 = fir.load %arg3 : !fir.ref<i32> 22 %2 = fir.convert %1 : (i32) -> index 23 %3 = fir.convert %c1 : (index) -> i32 24 %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) -> i64 28 %7 = arith.subi %6, %c1_i64 : i64 29 %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 : i32 34 %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 : index 37 %15 = fir.load %0 : !fir.ref<i32> 38 %16 = arith.addi %15, %3 : i32 39 fir.result %14, %16 : index, i32 40 } 41 fir.store %4#1 to %0 : !fir.ref<i32> 42 return 43} 44 45// ----- 46 47// CHECK-LABEL: Testing : "_QPtest3" 48// CHECK: arraya(ii)#0 <-> arrayc(ii)#0: MayAlias 49 50// subroutine test3(arrayA, arrayB, arrayC, N) 51// integer, dimension(:), target :: arrayA 52// integer, dimension(:) :: arrayB 53// integer, dimension(:), pointer :: arrayC 54// do ii = 1, N 55// arrayC(ii) = arrayB(ii) + arrayA(ii) 56// end do 57// end subroutine 58 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 : index 61 %c0 = arith.constant 0 : index 62 %c1_i64 = arith.constant 1 : i64 63 %0 = fir.alloca i32 {bindc_name = "ii", uniq_name = "_QFtest3Eii"} 64 %1 = fir.load %arg3 : !fir.ref<i32> 65 %2 = fir.convert %1 : (i32) -> index 66 %3 = fir.convert %c1 : (index) -> i32 67 %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) -> i64 71 %7 = arith.subi %6, %c1_i64 : i64 72 %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 : i32 77 %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) -> i64 80 %16 = arith.subi %6, %15 : i64 81 %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 : index 84 %19 = fir.load %0 : !fir.ref<i32> 85 %20 = arith.addi %19, %3 : i32 86 fir.result %18, %20 : index, i32 87 } 88 fir.store %4#1 to %0 : !fir.ref<i32> 89 return 90} 91 92// ----- 93 94// CHECK-LABEL: Testing : "_QMtest4Ptest" 95// CHECK: arraya(ii)#0 <-> arrayc(ii)#0: NoAlias 96 97// module test4 98// integer, dimension(:), allocatable :: arrayA 99// integer, dimension(:), allocatable :: arrayB 100// integer, dimension(:), allocatable :: arrayC 101// integer :: N 102// contains 103// subroutine test 104// do ii = 1, N 105// arrayC(ii) = arrayB(ii) + arrayA(ii) 106// end do 107// end subroutine 108// endmodule 109 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 : i32 114 115func.func @_QMtest4Ptest() { 116 %c1 = arith.constant 1 : index 117 %c0 = arith.constant 0 : index 118 %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) -> index 125 %7 = fir.convert %c1 : (index) -> i32 126 %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) -> i64 133 %14 = fir.convert %10#0 : (index) -> i64 134 %15 = arith.subi %13, %14 : i64 135 %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) -> i64 141 %22 = arith.subi %13, %21 : i64 142 %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 : i32 145 %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) -> i64 149 %30 = arith.subi %13, %29 : i64 150 %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 : index 153 %33 = fir.load %4 : !fir.ref<i32> 154 %34 = arith.addi %33, %7 : i32 155 fir.result %32, %34 : index, i32 156 } 157 fir.store %8#1 to %4 : !fir.ref<i32> 158 return 159} 160 161// ----- 162 163// CHECK-LABEL: Testing : "_QMtest5Ptest" 164// CHECK: arraya(ii)#0 <-> arrayc(ii)#0: NoAlias 165 166// module test5 167// integer, dimension(:), allocatable :: arrayA 168// integer, dimension(:), allocatable :: arrayB 169// integer, dimension(:), pointer :: arrayC 170// integer :: N 171// contains 172// subroutine test 173// do ii = 1, N 174// arrayC(ii) = arrayB(ii) + arrayA(ii) 175// end do 176// end subroutine 177// endmodule 178 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 : i32 183 184func.func @_QMtest5Ptest() { 185 %c1 = arith.constant 1 : index 186 %c0 = arith.constant 0 : index 187 %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) -> index 194 %7 = fir.convert %c1 : (index) -> i32 195 %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) -> i64 202 %14 = fir.convert %10#0 : (index) -> i64 203 %15 = arith.subi %13, %14 : i64 204 %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) -> i64 210 %22 = arith.subi %13, %21 : i64 211 %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 : i32 214 %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) -> i64 217 %29 = arith.subi %13, %28 : i64 218 %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 : index 221 %32 = fir.load %4 : !fir.ref<i32> 222 %33 = arith.addi %32, %7 : i32 223 fir.result %31, %33 : index, i32 224 } 225 fir.store %8#1 to %4 : !fir.ref<i32> 226 return 227} 228 229// ----- 230 231// CHECK-LABEL: Testing : "_QMtest6Ptest" 232// CHECK: arraya(ii)#0 <-> arrayc(ii)#0: MayAlias 233 234// module test6 235// integer, dimension(:), allocatable, target :: arrayA 236// integer, dimension(:), allocatable :: arrayB 237// integer, dimension(:), pointer :: arrayC 238// integer :: N 239// contains 240// subroutine test 241// do ii = 1, N 242// arrayC(ii) = arrayB(ii) + arrayA(ii) 243// end do 244// end subroutine 245// endmodule 246 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 : i32 251 252func.func @_QMtest6Ptest() { 253 %c1 = arith.constant 1 : index 254 %c0 = arith.constant 0 : index 255 %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) -> index 262 %7 = fir.convert %c1 : (index) -> i32 263 %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) -> i64 270 %14 = fir.convert %10#0 : (index) -> i64 271 %15 = arith.subi %13, %14 : i64 272 %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) -> i64 278 %22 = arith.subi %13, %21 : i64 279 %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 : i32 282 %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) -> i64 285 %29 = arith.subi %13, %28 : i64 286 %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 : index 289 %32 = fir.load %4 : !fir.ref<i32> 290 %33 = arith.addi %32, %7 : i32 291 fir.result %31, %33 : index, i32 292 } 293 fir.store %8#1 to %4 : !fir.ref<i32> 294 return 295} 296 297// ----- 298 299// CHECK-LABEL: Testing : "_QMtest7Ptest" 300// CHECK: arraya(ii)#0 <-> arrayc(ii)#0: MayAlias 301 302// module test7 303// integer, dimension(1000), target :: arrayA 304// integer, dimension(:), allocatable :: arrayB 305// integer, dimension(:), pointer :: arrayC 306// integer :: N 307// contains 308// subroutine test 309// do ii = 1, N 310// arrayC(ii) = arrayB(ii) + arrayA(ii) 311// end do 312// end subroutine 313// endmodule 314 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 : index 322 %c1_i64 = arith.constant 1 : i64 323 %c0 = arith.constant 0 : index 324 %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) -> index 331 %7 = fir.convert %c1 : (index) -> i32 332 %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) -> i64 339 %14 = fir.convert %10#0 : (index) -> i64 340 %15 = arith.subi %13, %14 : i64 341 %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 : i64 344 %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 : i32 347 %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) -> i64 350 %25 = arith.subi %13, %24 : i64 351 %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 : index 354 %28 = fir.load %4 : !fir.ref<i32> 355 %29 = arith.addi %28, %7 : i32 356 fir.result %27, %29 : index, i32 357 } 358 fir.store %8#1 to %4 : !fir.ref<i32> 359 return 360} 361 362// ----- 363 364// CHECK-LABEL: Testing : "_QMtest8Ptest" 365// CHECK: arraya(ii)#0 <-> arrayc(ii)#0: NoAlias 366 367// module test8 368// integer, dimension(1000) :: arrayA 369// integer, dimension(:), allocatable :: arrayB 370// integer, dimension(:), pointer :: arrayC 371// integer :: N 372// contains 373// subroutine test 374// do ii = 1, N 375// arrayC(ii) = arrayB(ii) + arrayA(ii) 376// end do 377// end subroutine 378// endmodule 379 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 : index 387 %c1_i64 = arith.constant 1 : i64 388 %c0 = arith.constant 0 : index 389 %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) -> index 396 %7 = fir.convert %c1 : (index) -> i32 397 %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) -> i64 404 %14 = fir.convert %10#0 : (index) -> i64 405 %15 = arith.subi %13, %14 : i64 406 %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 : i64 409 %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 : i32 412 %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) -> i64 415 %25 = arith.subi %13, %24 : i64 416 %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 : index 419 %28 = fir.load %4 : !fir.ref<i32> 420 %29 = arith.addi %28, %7 : i32 421 fir.result %27, %29 : index, i32 422 } 423 fir.store %8#1 to %4 : !fir.ref<i32> 424 return 425} 426 427// ----- 428 429// CHECK-LABEL: Testing : "_QMtest9Ptest" 430// CHECK: arraya(ii)#0 <-> arrayc(ii)#0: NoAlias 431 432// module test9 433// integer, dimension(:), allocatable :: arrayB 434// integer, dimension(:), pointer :: arrayC 435// integer :: N 436// contains 437// subroutine test(arrayA) 438// integer, dimension(:) :: arrayA 439// do ii = 1, N 440// arrayC(ii) = arrayB(ii) + arrayA(ii) 441// end do 442// end subroutine 443// endmodule 444 445fir.global @_QMtest9Earrayb : !fir.box<!fir.heap<!fir.array<?xi32>>> 446fir.global @_QMtest9Earrayc : !fir.box<!fir.ptr<!fir.array<?xi32>>> 447fir.global @_QMtest9En : i32 448 449func.func @_QMtest9Ptest(%arg0: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "arraya"}) { 450 %c1 = arith.constant 1 : index 451 %c1_i64 = arith.constant 1 : i64 452 %c0 = arith.constant 0 : index 453 %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) -> index 459 %6 = fir.convert %c1 : (index) -> i32 460 %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) -> i64 467 %13 = fir.convert %9#0 : (index) -> i64 468 %14 = arith.subi %12, %13 : i64 469 %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 : i64 472 %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 : i32 475 %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) -> i64 478 %24 = arith.subi %12, %23 : i64 479 %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 : index 482 %27 = fir.load %3 : !fir.ref<i32> 483 %28 = arith.addi %27, %6 : i32 484 fir.result %26, %28 : index, i32 485 } 486 fir.store %7#1 to %3 : !fir.ref<i32> 487 return 488} 489 490// ----- 491 492// CHECK-LABEL: Testing : "_QMtest10Ptest" 493// CHECK: arraya(ii)#0 <-> arrayc(ii)#0: MayAlias 494 495// module test10 496// integer, dimension(:), allocatable :: arrayB 497// integer, dimension(:), pointer :: arrayC 498// integer :: N 499// contains 500// subroutine test(arrayA) 501// integer, dimension(:), target :: arrayA 502// do ii = 1, N 503// arrayC(ii) = arrayB(ii) + arrayA(ii) 504// end do 505// end subroutine 506// endmodule 507 508fir.global @_QMtest10Earrayb : !fir.box<!fir.heap<!fir.array<?xi32>>> 509fir.global @_QMtest10Earrayc : !fir.box<!fir.ptr<!fir.array<?xi32>>> 510fir.global @_QMtest10En : i32 511 512func.func @_QMtest10Ptest(%arg0: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "arraya", fir.target}) { 513 %c1 = arith.constant 1 : index 514 %c1_i64 = arith.constant 1 : i64 515 %c0 = arith.constant 0 : index 516 %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) -> index 522 %6 = fir.convert %c1 : (index) -> i32 523 %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) -> i64 530 %13 = fir.convert %9#0 : (index) -> i64 531 %14 = arith.subi %12, %13 : i64 532 %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 : i64 535 %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 : i32 538 %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) -> i64 541 %24 = arith.subi %12, %23 : i64 542 %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 : index 545 %27 = fir.load %3 : !fir.ref<i32> 546 %28 = arith.addi %27, %6 : i32 547 fir.result %26, %28 : index, i32 548 } 549 fir.store %7#1 to %3 : !fir.ref<i32> 550 return 551} 552 553// ----- 554 555// CHECK-LABEL: Testing : "_QMtest11Ptest" 556// CHECK: arraya(ii)#0 <-> arrayc(ii)#0: MayAlias 557 558// module test11 559// integer, dimension(:), allocatable :: arrayB 560// integer, dimension(1000), target :: arrayC 561// integer :: N 562// contains 563// subroutine test(arrayA) 564// integer, dimension(:), target :: arrayA 565// do ii = 1, N 566// arrayC(ii) = arrayB(ii) + arrayA(ii) 567// end do 568// end subroutine 569// endmodule 570 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 : index 577 %c1_i64 = arith.constant 1 : i64 578 %c0 = arith.constant 0 : index 579 %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) -> index 585 %6 = fir.convert %c1 : (index) -> i32 586 %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) -> i64 593 %13 = fir.convert %9#0 : (index) -> i64 594 %14 = arith.subi %12, %13 : i64 595 %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 : i64 598 %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 : i32 601 %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 : index 604 %23 = fir.load %3 : !fir.ref<i32> 605 %24 = arith.addi %23, %6 : i32 606 fir.result %22, %24 : index, i32 607 } 608 fir.store %7#1 to %3 : !fir.ref<i32> 609 return 610} 611 612 613// ----- 614 615// CHECK-LABEL: Testing : "_QMtest12Ptest" 616// CHECK: arraya(ii)#0 <-> arrayc(ii)#0: NoAlias 617 618// module test12 619// integer, dimension(:), allocatable :: arrayB 620// integer, dimension(1000) :: arrayC 621// integer :: N 622// contains 623// subroutine test(arrayA) 624// integer, dimension(:), target :: arrayA 625// do ii = 1, N 626// arrayC(ii) = arrayB(ii) + arrayA(ii) 627// end do 628// end subroutine 629// endmodule 630 631fir.global @_QMtest12Earrayb : !fir.box<!fir.heap<!fir.array<?xi32>>> 632fir.global @_QMtest12Earrayc : !fir.array<1000xi32> 633fir.global @_QMtest12En : i32 634 635func.func @_QMtest12Ptest(%arg0: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "arraya", fir.target}) { 636 %c1 = arith.constant 1 : index 637 %c1_i64 = arith.constant 1 : i64 638 %c0 = arith.constant 0 : index 639 %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) -> index 645 %6 = fir.convert %c1 : (index) -> i32 646 %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) -> i64 653 %13 = fir.convert %9#0 : (index) -> i64 654 %14 = arith.subi %12, %13 : i64 655 %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 : i64 658 %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 : i32 661 %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 : index 664 %23 = fir.load %3 : !fir.ref<i32> 665 %24 = arith.addi %23, %6 : i32 666 fir.result %22, %24 : index, i32 667 } 668 fir.store %7#1 to %3 : !fir.ref<i32> 669 return 670} 671 672