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(i8 addrspace(5)* %p, i8 addrspace(1)* %p1) {
8  load i8, i8 addrspace(5)* %p
9  load i8, i8 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(i8 addrspace(4)* %p, i8 addrspace(1)* %p1) {
17  load i8, i8 addrspace(4)* %p
18  load i8, i8 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(i8 addrspace(1)* %p, i8 addrspace(4)* %p1) {
25  load i8, i8 addrspace(1)* %p
26  load i8, i8 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(i8 addrspace(6)* %p, i8 addrspace(1)* %p1) {
33  load i8, i8 addrspace(6)* %p
34  load i8, i8 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(i8 addrspace(6)* %p, i8 addrspace(4)* %p1) {
41  load i8, i8 addrspace(6)* %p
42  load i8, i8 addrspace(4)* %p1
43  ret void
44}
45
46; CHECK: MayAlias:	i8* %p, i8 addrspace(999)* %p0
47define void @test_0_999(i8 addrspace(0)* %p, i8 addrspace(999)* %p0) {
48  load i8, i8 addrspace(0)* %p
49  load i8, i8 addrspace(999)* %p0
50  ret void
51}
52
53; CHECK: MayAlias:	i8 addrspace(999)* %p, i8* %p1
54define void @test_999_0(i8 addrspace(999)* %p, i8 addrspace(0)* %p1) {
55  load i8, i8 addrspace(999)* %p
56  load i8, i8 addrspace(0)* %p1
57  ret void
58}
59
60; CHECK: MayAlias:	i8 addrspace(1)* %p, i8 addrspace(999)* %p1
61define void @test_1_999(i8 addrspace(1)* %p, i8 addrspace(999)* %p1) {
62  load i8, i8 addrspace(1)* %p
63  load i8, i8 addrspace(999)* %p1
64  ret void
65}
66
67; CHECK: MayAlias:	i8 addrspace(999)* %p, i8 addrspace(1)* %p1
68define void @test_999_1(i8 addrspace(999)* %p, i8 addrspace(1)* %p1) {
69  load i8, i8 addrspace(999)* %p
70  load i8, i8 addrspace(1)* %p1
71  ret void
72}
73
74; CHECK: NoAlias:  i8 addrspace(2)* %p, i8* %p1
75define void @test_region_vs_flat(i8 addrspace(2)* %p, i8 addrspace(0)* %p1) {
76  load i8, i8 addrspace(2)* %p
77  load i8, i8 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(i8 addrspace(2)* %p, i8 addrspace(1)* %p1) {
83  load i8, i8 addrspace(2)* %p
84  load i8, i8 addrspace(1)* %p1
85  ret void
86}
87
88; CHECK: MayAlias: i8 addrspace(2)* %p, i8 addrspace(2)* %p1
89define void @test_region(i8 addrspace(2)* %p, i8 addrspace(2)* %p1) {
90  load i8, i8 addrspace(2)* %p
91  load i8, i8 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(i8 addrspace(2)* %p, i8 addrspace(3)* %p1) {
97  load i8, i8 addrspace(2)* %p
98  load i8, i8 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(i8 addrspace(2)* %p, i8 addrspace(4)* %p1) {
104  load i8, i8 addrspace(2)* %p
105  load i8, i8 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(i8 addrspace(2)* %p, i8 addrspace(5)* %p1) {
111  load i8, i8 addrspace(2)* %p
112  load i8, i8 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(i8 addrspace(2)* %p, i8 addrspace(6)* %p1) {
118  load i8, i8 addrspace(2)* %p
119  load i8, i8 addrspace(6)* %p1
120  ret void
121}
122
123; CHECK: MayAlias:  i8 addrspace(7)* %p, i8* %p1
124define void @test_7_0(i8 addrspace(7)* %p, i8 addrspace(0)* %p1) {
125  load i8, i8 addrspace(7)* %p
126  load i8, i8 addrspace(0)* %p1
127  ret void
128}
129
130; CHECK: MayAlias:  i8 addrspace(7)* %p, i8 addrspace(1)* %p1
131define void @test_7_1(i8 addrspace(7)* %p, i8 addrspace(1)* %p1) {
132  load i8, i8 addrspace(7)* %p
133  load i8, i8 addrspace(1)* %p1
134  ret void
135}
136
137; CHECK: NoAlias:  i8 addrspace(7)* %p, i8 addrspace(2)* %p1
138define void @test_7_2(i8 addrspace(7)* %p, i8 addrspace(2)* %p1) {
139  load i8, i8 addrspace(7)* %p
140  load i8, i8 addrspace(2)* %p1
141  ret void
142}
143
144; CHECK: NoAlias:  i8 addrspace(7)* %p, i8 addrspace(3)* %p1
145define void @test_7_3(i8 addrspace(7)* %p, i8 addrspace(3)* %p1) {
146  load i8, i8 addrspace(7)* %p
147  load i8, i8 addrspace(3)* %p1
148  ret void
149}
150
151; CHECK: MayAlias:  i8 addrspace(7)* %p, i8 addrspace(4)* %p1
152define void @test_7_4(i8 addrspace(7)* %p, i8 addrspace(4)* %p1) {
153  load i8, i8 addrspace(7)* %p
154  load i8, i8 addrspace(4)* %p1
155  ret void
156}
157
158; CHECK: NoAlias:  i8 addrspace(7)* %p, i8 addrspace(5)* %p1
159define void @test_7_5(i8 addrspace(7)* %p, i8 addrspace(5)* %p1) {
160  load i8, i8 addrspace(7)* %p
161  load i8, i8 addrspace(5)* %p1
162  ret void
163}
164
165; CHECK: MayAlias:  i8 addrspace(7)* %p, i8 addrspace(6)* %p1
166define void @test_7_6(i8 addrspace(7)* %p, i8 addrspace(6)* %p1) {
167  load i8, i8 addrspace(7)* %p
168  load i8, i8 addrspace(6)* %p1
169  ret void
170}
171
172; CHECK: MayAlias:  i8 addrspace(7)* %p, i8 addrspace(7)* %p1
173define void @test_7_7(i8 addrspace(7)* %p, i8 addrspace(7)* %p1) {
174  load i8, i8 addrspace(7)* %p
175  load i8, i8 addrspace(7)* %p1
176  ret void
177}
178
179@cst = internal addrspace(4) global i8* 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, i8* addrspace(4)* @cst
184; CHECK-DAG: MayAlias:  i8* %p1, i8* addrspace(4)* @cst
185define void @test_8_0(i8 addrspace(3)* %p) {
186  %p1 = load i8*, i8* addrspace(4)* @cst
187  load i8, i8 addrspace(3)* %p
188  load i8, i8* %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, i8* addrspace(4)* @cst
195; CHECK-DAG: MayAlias:  i8* %p1, i8* addrspace(4)* @cst
196define void @test_8_1(i8 addrspace(5)* %p) {
197  %p1 = load i8*, i8* addrspace(4)* @cst
198  load i8, i8 addrspace(5)* %p
199  load i8, i8* %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(i8* %p) {
206  %p1 = alloca i8, align 1, addrspace(5)
207  load i8, i8* %p
208  load i8, i8 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(i8* %p) {
217  %p1 = alloca i8, align 1, addrspace(5)
218  load i8, i8* %p
219  load i8, i8 addrspace(5)* %p1
220  ret void
221}
222
223@shm = internal addrspace(3) global 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(i8* %p) {
230  %p1 = getelementptr i8, i8 addrspace(3)* @shm, i32 0
231  load i8, i8* %p
232  load i8, i8 addrspace(3)* %p1
233  load i8, i8 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; TODO: So far, %p1 may still alias to %p. As it's not captured at all, it
242; should be NoAlias.
243define void @test_8_5(i8* %p) {
244  %p1 = getelementptr i8, i8 addrspace(3)* @shm, i32 0
245  load i8, i8* %p
246  load i8, i8 addrspace(3)* %p1
247  load i8, i8 addrspace(3)* @shm
248  ret void
249}
250