xref: /llvm-project/llvm/test/CodeGen/AMDGPU/amdgpu-alias-analysis.ll (revision 9cf24652e783147b5063925ce025b9f8a6e8fe25)
1; RUN: opt -mtriple=amdgcn-- -data-layout=A5 -passes=aa-eval -aa-pipeline=amdgpu-aa -print-all-alias-modref-info -disable-output < %s 2>&1 | FileCheck %s
2; RUN: opt -mtriple=r600-- -data-layout=A5 -passes=aa-eval -aa-pipeline=amdgpu-aa -print-all-alias-modref-info -disable-output < %s 2>&1 | FileCheck %s
3
4; CHECK-LABEL: Function: test
5; CHECK: NoAlias:      i8 addrspace(5)* %p, i8 addrspace(1)* %p1
6
7define void @test(ptr addrspace(5) %p, ptr addrspace(1) %p1) {
8  load i8, ptr addrspace(5) %p
9  load i8, ptr addrspace(1) %p1
10  ret void
11}
12
13; CHECK-LABEL: Function: test_constant_vs_global
14; CHECK: MayAlias:      i8 addrspace(4)* %p, i8 addrspace(1)* %p1
15
16define void @test_constant_vs_global(ptr addrspace(4) %p, ptr addrspace(1) %p1) {
17  load i8, ptr addrspace(4) %p
18  load i8, ptr addrspace(1) %p1
19  ret void
20}
21
22; CHECK: MayAlias:      i8 addrspace(1)* %p, i8 addrspace(4)* %p1
23
24define void @test_global_vs_constant(ptr addrspace(1) %p, ptr addrspace(4) %p1) {
25  load i8, ptr addrspace(1) %p
26  load i8, ptr addrspace(4) %p1
27  ret void
28}
29
30; CHECK: MayAlias:      i8 addrspace(6)* %p, i8 addrspace(1)* %p1
31
32define void @test_constant_32bit_vs_global(ptr addrspace(6) %p, ptr addrspace(1) %p1) {
33  load i8, ptr addrspace(6) %p
34  load i8, ptr addrspace(1) %p1
35  ret void
36}
37
38; CHECK: MayAlias:      i8 addrspace(6)* %p, i8 addrspace(4)* %p1
39
40define void @test_constant_32bit_vs_constant(ptr addrspace(6) %p, ptr addrspace(4) %p1) {
41  load i8, ptr addrspace(6) %p
42  load i8, ptr addrspace(4) %p1
43  ret void
44}
45
46; CHECK: MayAlias:	i8* %p, i8 addrspace(999)* %p0
47define void @test_0_999(ptr addrspace(0) %p, ptr addrspace(999) %p0) {
48  load i8, ptr addrspace(0) %p
49  load i8, ptr addrspace(999) %p0
50  ret void
51}
52
53; CHECK: MayAlias:	i8 addrspace(999)* %p, i8* %p1
54define void @test_999_0(ptr addrspace(999) %p, ptr addrspace(0) %p1) {
55  load i8, ptr addrspace(999) %p
56  load i8, ptr addrspace(0) %p1
57  ret void
58}
59
60; CHECK: MayAlias:	i8 addrspace(1)* %p, i8 addrspace(999)* %p1
61define void @test_1_999(ptr addrspace(1) %p, ptr addrspace(999) %p1) {
62  load i8, ptr addrspace(1) %p
63  load i8, ptr addrspace(999) %p1
64  ret void
65}
66
67; CHECK: MayAlias:	i8 addrspace(999)* %p, i8 addrspace(1)* %p1
68define void @test_999_1(ptr addrspace(999) %p, ptr addrspace(1) %p1) {
69  load i8, ptr addrspace(999) %p
70  load i8, ptr addrspace(1) %p1
71  ret void
72}
73
74; CHECK: NoAlias:  i8 addrspace(2)* %p, i8* %p1
75define void @test_region_vs_flat(ptr addrspace(2) %p, ptr addrspace(0) %p1) {
76  load i8, ptr addrspace(2) %p
77  load i8, ptr addrspace(0) %p1
78  ret void
79}
80
81; CHECK: NoAlias:  i8 addrspace(2)* %p, i8 addrspace(1)* %p1
82define void @test_region_vs_global(ptr addrspace(2) %p, ptr addrspace(1) %p1) {
83  load i8, ptr addrspace(2) %p
84  load i8, ptr addrspace(1) %p1
85  ret void
86}
87
88; CHECK: MayAlias: i8 addrspace(2)* %p, i8 addrspace(2)* %p1
89define void @test_region(ptr addrspace(2) %p, ptr addrspace(2) %p1) {
90  load i8, ptr addrspace(2) %p
91  load i8, ptr addrspace(2) %p1
92  ret void
93}
94
95; CHECK: NoAlias:  i8 addrspace(2)* %p, i8 addrspace(3)* %p1
96define void @test_region_vs_group(ptr addrspace(2) %p, ptr addrspace(3) %p1) {
97  load i8, ptr addrspace(2) %p
98  load i8, ptr addrspace(3) %p1
99  ret void
100}
101
102; CHECK: NoAlias:  i8 addrspace(2)* %p, i8 addrspace(4)* %p1
103define void @test_region_vs_constant(ptr addrspace(2) %p, ptr addrspace(4) %p1) {
104  load i8, ptr addrspace(2) %p
105  load i8, ptr addrspace(4) %p1
106  ret void
107}
108
109; CHECK: NoAlias:  i8 addrspace(2)* %p, i8 addrspace(5)* %p1
110define void @test_region_vs_private(ptr addrspace(2) %p, ptr addrspace(5) %p1) {
111  load i8, ptr addrspace(2) %p
112  load i8, ptr addrspace(5) %p1
113  ret void
114}
115
116; CHECK: NoAlias:  i8 addrspace(2)* %p, i8 addrspace(6)* %p1
117define void @test_region_vs_const32(ptr addrspace(2) %p, ptr addrspace(6) %p1) {
118  load i8, ptr addrspace(2) %p
119  load i8, ptr addrspace(6) %p1
120  ret void
121}
122
123; CHECK: MayAlias:  i8 addrspace(7)* %p, i8* %p1
124define void @test_7_0(ptr addrspace(7) %p, ptr addrspace(0) %p1) {
125  load i8, ptr addrspace(7) %p
126  load i8, ptr addrspace(0) %p1
127  ret void
128}
129
130; CHECK: MayAlias:  i8 addrspace(7)* %p, i8 addrspace(1)* %p1
131define void @test_7_1(ptr addrspace(7) %p, ptr addrspace(1) %p1) {
132  load i8, ptr addrspace(7) %p
133  load i8, ptr addrspace(1) %p1
134  ret void
135}
136
137; CHECK: NoAlias:  i8 addrspace(7)* %p, i8 addrspace(2)* %p1
138define void @test_7_2(ptr addrspace(7) %p, ptr addrspace(2) %p1) {
139  load i8, ptr addrspace(7) %p
140  load i8, ptr addrspace(2) %p1
141  ret void
142}
143
144; CHECK: NoAlias:  i8 addrspace(7)* %p, i8 addrspace(3)* %p1
145define void @test_7_3(ptr addrspace(7) %p, ptr addrspace(3) %p1) {
146  load i8, ptr addrspace(7) %p
147  load i8, ptr addrspace(3) %p1
148  ret void
149}
150
151; CHECK: MayAlias:  i8 addrspace(7)* %p, i8 addrspace(4)* %p1
152define void @test_7_4(ptr addrspace(7) %p, ptr addrspace(4) %p1) {
153  load i8, ptr addrspace(7) %p
154  load i8, ptr addrspace(4) %p1
155  ret void
156}
157
158; CHECK: NoAlias:  i8 addrspace(7)* %p, i8 addrspace(5)* %p1
159define void @test_7_5(ptr addrspace(7) %p, ptr addrspace(5) %p1) {
160  load i8, ptr addrspace(7) %p
161  load i8, ptr addrspace(5) %p1
162  ret void
163}
164
165; CHECK: MayAlias:  i8 addrspace(7)* %p, i8 addrspace(6)* %p1
166define void @test_7_6(ptr addrspace(7) %p, ptr addrspace(6) %p1) {
167  load i8, ptr addrspace(7) %p
168  load i8, ptr addrspace(6) %p1
169  ret void
170}
171
172; CHECK: MayAlias:  i8 addrspace(7)* %p, i8 addrspace(7)* %p1
173define void @test_7_7(ptr addrspace(7) %p, ptr addrspace(7) %p1) {
174  load i8, ptr addrspace(7) %p
175  load i8, ptr addrspace(7) %p1
176  ret void
177}
178
179@cst = internal addrspace(4) global ptr undef, align 4
180
181; CHECK-LABEL: Function: test_8_0
182; CHECK-DAG: NoAlias:   i8 addrspace(3)* %p, i8* %p1
183; CHECK-DAG: NoAlias:   i8 addrspace(3)* %p, ptr addrspace(4)* @cst
184; CHECK-DAG: MayAlias:  i8* %p1, ptr addrspace(4)* @cst
185define void @test_8_0(ptr addrspace(3) %p) {
186  %p1 = load ptr, ptr addrspace(4) @cst
187  load i8, ptr addrspace(3) %p
188  load i8, ptr %p1
189  ret void
190}
191
192; CHECK-LABEL: Function: test_8_1
193; CHECK-DAG: NoAlias:   i8 addrspace(5)* %p, i8* %p1
194; CHECK-DAG: NoAlias:   i8 addrspace(5)* %p, ptr addrspace(4)* @cst
195; CHECK-DAG: MayAlias:  i8* %p1, ptr addrspace(4)* @cst
196define void @test_8_1(ptr addrspace(5) %p) {
197  %p1 = load ptr, ptr addrspace(4) @cst
198  load i8, ptr addrspace(5) %p
199  load i8, ptr %p1
200  ret void
201}
202
203; CHECK-LABEL: Function: test_8_2
204; CHECK: NoAlias:   i8* %p, i8 addrspace(5)* %p1
205define amdgpu_kernel void @test_8_2(ptr %p) {
206  %p1 = alloca i8, align 1, addrspace(5)
207  load i8, ptr %p
208  load i8, ptr addrspace(5) %p1
209  ret void
210}
211
212; CHECK-LABEL: Function: test_8_3
213; CHECK: MayAlias:  i8* %p, i8 addrspace(5)* %p1
214; TODO: So far, %p1 may still alias to %p. As it's not captured at all, it
215; should be NoAlias.
216define void @test_8_3(ptr %p) {
217  %p1 = alloca i8, align 1, addrspace(5)
218  load i8, ptr %p
219  load i8, ptr addrspace(5) %p1
220  ret void
221}
222
223@shm = internal addrspace(3) global [2 x i8] undef, align 4
224
225; CHECK-LABEL: Function: test_8_4
226; CHECK: NoAlias:   i8* %p, i8 addrspace(3)* %p1
227; CHECK: NoAlias:   i8* %p, i8 addrspace(3)* @shm
228; CHECK: MayAlias:  i8 addrspace(3)* %p1, i8 addrspace(3)* @shm
229define amdgpu_kernel void @test_8_4(ptr %p) {
230  %p1 = getelementptr [2 x i8], ptr addrspace(3) @shm, i32 0, i32 1
231  load i8, ptr %p
232  load i8, ptr addrspace(3) %p1
233  load i8, ptr addrspace(3) @shm
234  ret void
235}
236
237; CHECK-LABEL: Function: test_8_5
238; CHECK: MayAlias:  i8* %p, i8 addrspace(3)* %p1
239; CHECK: MayAlias:  i8* %p, i8 addrspace(3)* @shm
240; CHECK: MayAlias:  i8 addrspace(3)* %p1, i8 addrspace(3)* @shm
241
242; TODO: So far, @shm may still alias to %p. As it's not captured at all, it
243; should be NoAlias.
244define void @test_8_5(ptr %p) {
245  %p1 = getelementptr [2 x i8], ptr addrspace(3) @shm, i32 0, i32 1
246  load i8, ptr %p
247  load i8, ptr addrspace(3) %p1
248  load i8, ptr addrspace(3) @shm
249  ret void
250}
251
252; CHECK: MayAlias:  i8 addrspace(9)* %p, i8* %p1
253define void @test_9_0(ptr addrspace(9) %p, ptr addrspace(0) %p1) {
254  load i8, ptr addrspace(9) %p
255  load i8, ptr addrspace(0) %p1
256  ret void
257}
258
259; CHECK: MayAlias:  i8 addrspace(9)* %p, i8 addrspace(1)* %p1
260define void @test_9_1(ptr addrspace(9) %p, ptr addrspace(1) %p1) {
261  load i8, ptr addrspace(9) %p
262  load i8, ptr addrspace(1) %p1
263  ret void
264}
265
266; CHECK: NoAlias:  i8 addrspace(9)* %p, i8 addrspace(2)* %p1
267define void @test_9_2(ptr addrspace(9) %p, ptr addrspace(2) %p1) {
268  load i8, ptr addrspace(9) %p
269  load i8, ptr addrspace(2) %p1
270  ret void
271}
272
273; CHECK: NoAlias:  i8 addrspace(9)* %p, i8 addrspace(3)* %p1
274define void @test_9_3(ptr addrspace(9) %p, ptr addrspace(3) %p1) {
275  load i8, ptr addrspace(9) %p
276  load i8, ptr addrspace(3) %p1
277  ret void
278}
279
280; CHECK: MayAlias:  i8 addrspace(9)* %p, i8 addrspace(4)* %p1
281define void @test_9_4(ptr addrspace(9) %p, ptr addrspace(4) %p1) {
282  load i8, ptr addrspace(9) %p
283  load i8, ptr addrspace(4) %p1
284  ret void
285}
286
287; CHECK: NoAlias:  i8 addrspace(9)* %p, i8 addrspace(5)* %p1
288define void @test_9_5(ptr addrspace(9) %p, ptr addrspace(5) %p1) {
289  load i8, ptr addrspace(9) %p
290  load i8, ptr addrspace(5) %p1
291  ret void
292}
293
294; CHECK: MayAlias:  i8 addrspace(9)* %p, i8 addrspace(6)* %p1
295define void @test_9_6(ptr addrspace(9) %p, ptr addrspace(6) %p1) {
296  load i8, ptr addrspace(9) %p
297  load i8, ptr addrspace(6) %p1
298  ret void
299}
300
301; CHECK: MayAlias:  i8 addrspace(9)* %p, i8 addrspace(7)* %p1
302define void @test_9_7(ptr addrspace(9) %p, ptr addrspace(7) %p1) {
303  load i8, ptr addrspace(9) %p
304  load i8, ptr addrspace(7) %p1
305  ret void
306}
307
308; CHECK: MayAlias:  i8 addrspace(9)* %p, i8 addrspace(8)* %p1
309define void @test_9_8(ptr addrspace(9) %p, ptr addrspace(8) %p1) {
310  load i8, ptr addrspace(9) %p
311  load i8, ptr addrspace(8) %p1
312  ret void
313}
314
315; CHECK: MayAlias:  i8 addrspace(9)* %p, i8 addrspace(9)* %p1
316define void @test_9_9(ptr addrspace(9) %p, ptr addrspace(9) %p1) {
317  load i8, ptr addrspace(9) %p
318  load i8, ptr addrspace(9) %p1
319  ret void
320}
321
322; CHECK-LABEL: Function: test_kernel_arg_local_ptr
323; CHECK: MayAlias:   i32 addrspace(3)* %arg, i32 addrspace(3)* %arg1
324; CHECK: MayAlias:   i32 addrspace(3)* %arg, i32* %arg2
325; CHECK: MayAlias:   i32 addrspace(3)* %arg1, i32* %arg2
326define amdgpu_kernel void @test_kernel_arg_local_ptr(ptr addrspace(3) %arg) {
327entry:
328  %load1 = load i32, ptr addrspace(3) %arg, align 4
329  %arg.plus.1 = getelementptr inbounds nuw i8, ptr addrspace(3) %arg, i64 1
330  %arg1 = getelementptr inbounds nuw i8, ptr addrspace(3) %arg.plus.1, i64 -1
331  %load2 = load i32, ptr addrspace(3) %arg1, align 4
332  %arg.plus.4 = getelementptr inbounds nuw i8, ptr addrspace(3) %arg, i64 4
333  %acast = addrspacecast ptr addrspace(3) %arg.plus.4 to ptr
334  %arg2 = getelementptr inbounds i8, ptr %acast, i64 -4
335  %load3 = load i32, ptr %arg2, align 4
336  ret void
337}
338