xref: /llvm-project/flang/test/Analysis/AliasAnalysis/alias-analysis-5.fir (revision 575a6483062b8a77b35f48589b2acc1020195ac7)
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