1 ; RUN: opt < %s -aa-pipeline=basic-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
5 ; CHECK-LABEL: gep_alloca_const_offset_1
6 ; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep1
7 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep2
8 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep2
9 define void @gep_alloca_const_offset_1() {
10 %alloc = alloca <vscale x 4 x i32>
11 %gep1 = getelementptr <vscale x 4 x i32>, ptr %alloc, i64 0
12 %gep2 = getelementptr <vscale x 4 x i32>, ptr %alloc, i64 1
13 load <vscale x 4 x i32>, ptr %alloc
14 load <vscale x 4 x i32>, ptr %gep1
15 load <vscale x 4 x i32>, ptr %gep2
19 ; CHECK-LABEL: gep_alloca_const_offset_2
20 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep1
21 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep2
22 ; TODO: AliasResult for gep1,gep2 can be improved as MustAlias
23 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep2
24 define void @gep_alloca_const_offset_2() {
25 %alloc = alloca <vscale x 4 x i32>
26 %gep1 = getelementptr <vscale x 4 x i32>, ptr %alloc, i64 1
27 %gep2 = getelementptr <vscale x 4 x i32>, ptr %alloc, i64 1
28 load <vscale x 4 x i32>, ptr %alloc
29 load <vscale x 4 x i32>, ptr %gep1
30 load <vscale x 4 x i32>, ptr %gep2
34 ; CHECK-LABEL: gep_alloca_const_offset_3
35 ; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep1
36 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, i32* %gep2
37 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, i32* %gep2
38 define void @gep_alloca_const_offset_3() {
39 %alloc = alloca <vscale x 4 x i32>
40 %gep1 = getelementptr <vscale x 4 x i32>, ptr %alloc, i64 0
41 %gep2 = getelementptr <vscale x 4 x i32>, ptr %alloc, i64 0, i64 1
42 load <vscale x 4 x i32>, ptr %alloc
43 load <vscale x 4 x i32>, ptr %gep1
48 ; CHECK-LABEL: gep_alloca_const_offset_4
49 ; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep1
50 ; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %alloc, i32* %gep2
51 ; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %gep1, i32* %gep2
52 define void @gep_alloca_const_offset_4() {
53 %alloc = alloca <vscale x 4 x i32>
54 %gep1 = getelementptr <vscale x 4 x i32>, ptr %alloc, i64 0
55 %gep2 = getelementptr <vscale x 4 x i32>, ptr %alloc, i64 0, i64 0
56 load <vscale x 4 x i32>, ptr %alloc
57 load <vscale x 4 x i32>, ptr %gep1
62 ; CHECK-LABEL: gep_alloca_symbolic_offset
63 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep1
64 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %alloc, <vscale x 4 x i32>* %gep2
65 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep2
66 define void @gep_alloca_symbolic_offset(i64 %idx1, i64 %idx2) {
67 %alloc = alloca <vscale x 4 x i32>
68 %gep1 = getelementptr <vscale x 4 x i32>, ptr %alloc, i64 %idx1
69 %gep2 = getelementptr <vscale x 4 x i32>, ptr %alloc, i64 %idx2
70 load <vscale x 4 x i32>, ptr %alloc
71 load <vscale x 4 x i32>, ptr %gep1
72 load <vscale x 4 x i32>, ptr %gep2
76 ; CHECK-LABEL: gep_same_base_const_offset
77 ; CHECK-DAG: MayAlias: i32* %gep1, <vscale x 4 x i32>* %p
78 ; CHECK-DAG: MayAlias: i32* %gep2, <vscale x 4 x i32>* %p
79 ; TODO: AliasResult for gep1,gep2 can be improved as NoAlias
80 ; CHECK-DAG: MayAlias: i32* %gep1, i32* %gep2
81 define void @gep_same_base_const_offset(ptr %p) {
82 %gep1 = getelementptr <vscale x 4 x i32>, ptr %p, i64 1, i64 0
83 %gep2 = getelementptr <vscale x 4 x i32>, ptr %p, i64 1, i64 1
84 load <vscale x 4 x i32>, ptr %p
90 ; CHECK-LABEL: gep_same_base_symbolic_offset
91 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %p
92 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep2, <vscale x 4 x i32>* %p
93 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep2
94 define void @gep_same_base_symbolic_offset(ptr %p, i64 %idx1, i64 %idx2) {
95 %gep1 = getelementptr <vscale x 4 x i32>, ptr %p, i64 %idx1
96 %gep2 = getelementptr <vscale x 4 x i32>, ptr %p, i64 %idx2
97 load <vscale x 4 x i32>, ptr %p
98 load <vscale x 4 x i32>, ptr %gep1
99 load <vscale x 4 x i32>, ptr %gep2
103 ; CHECK-LABEL: gep_different_base_const_offset
104 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %p1
105 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep2, <vscale x 4 x i32>* %p2
106 ; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %p1, <vscale x 4 x i32>* %p2
107 ; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %p2
108 ; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %gep2, <vscale x 4 x i32>* %p1
109 ; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep2
110 define void @gep_different_base_const_offset(ptr noalias %p1, ptr noalias %p2) {
111 %gep1 = getelementptr <vscale x 4 x i32>, ptr %p1, i64 1
112 %gep2 = getelementptr <vscale x 4 x i32>, ptr %p2, i64 1
113 load <vscale x 4 x i32>, ptr %p1
114 load <vscale x 4 x i32>, ptr %p2
115 load <vscale x 4 x i32>, ptr %gep1
116 load <vscale x 4 x i32>, ptr %gep2
120 ; getelementptr @llvm.vscale tests
121 ; CHECK-LABEL: gep_llvm_vscale_no_alias
122 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep2
123 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep3
124 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep2, <vscale x 4 x i32>* %gep3
125 define void @gep_llvm_vscale_no_alias(ptr %p) {
126 %t1 = tail call i64 @llvm.vscale.i64()
127 %t2 = shl nuw nsw i64 %t1, 3
128 %gep1 = getelementptr i32, ptr %p, i64 %t2
129 %gep2 = getelementptr <vscale x 4 x i32>, ptr %p, i64 1
130 %gep3 = getelementptr <vscale x 4 x i32>, ptr %p, i64 2
131 load <vscale x 4 x i32>, ptr %gep1
132 load <vscale x 4 x i32>, ptr %gep2
133 load <vscale x 4 x i32>, ptr %gep3
137 declare i64 @llvm.vscale.i64()
139 ; CHECK-LABEL: gep_llvm_vscale_squared_may_alias
140 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %gep1, <vscale x 4 x i32>* %gep2
141 define void @gep_llvm_vscale_squared_may_alias(ptr %p) {
142 %t1 = tail call i64 @llvm.vscale.i64()
143 %gep1 = getelementptr <vscale x 4 x i32>, ptr %p, i64 %t1
144 %gep2 = getelementptr i32, ptr %p, i64 1
145 load <vscale x 4 x i32>, ptr %gep1
146 load <vscale x 4 x i32>, ptr %gep2
150 ; getelementptr + bitcast
152 ; CHECK-LABEL: gep_bitcast_1
153 ; CHECK-DAG: MustAlias: i32* %p, <vscale x 4 x i32>* %p
154 ; CHECK-DAG: MayAlias: i32* %gep1, <vscale x 4 x i32>* %p
155 ; CHECK-DAG: MayAlias: i32* %gep1, i32* %p
156 ; CHECK-DAG: MayAlias: i32* %gep2, <vscale x 4 x i32>* %p
157 ; CHECK-DAG: MayAlias: i32* %gep1, i32* %gep2
158 ; CHECK-DAG: NoAlias: i32* %gep2, i32* %p
159 define void @gep_bitcast_1(ptr %p) {
160 %gep1 = getelementptr <vscale x 4 x i32>, ptr %p, i64 1, i64 0
161 %gep2 = getelementptr i32, ptr %p, i64 4
162 load <vscale x 4 x i32>, ptr %p
169 ; CHECK-LABEL: gep_bitcast_2
170 ; CHECK-DAG: MustAlias: <vscale x 4 x float>* %p, <vscale x 4 x i32>* %p
171 ; CHECK-DAG: MayAlias: i32* %gep1, <vscale x 4 x i32>* %p
172 ; CHECK-DAG: MayAlias: i32* %gep1, <vscale x 4 x float>* %p
173 ; CHECK-DAG: MayAlias: float* %gep2, <vscale x 4 x i32>* %p
174 ; CHECK-DAG: MayAlias: i32* %gep1, float* %gep2
175 ; CHECK-DAG: MayAlias: float* %gep2, <vscale x 4 x float>* %p
176 define void @gep_bitcast_2(ptr %p) {
177 %gep1 = getelementptr <vscale x 4 x i32>, ptr %p, i64 1, i64 0
178 %gep2 = getelementptr <vscale x 4 x float>, ptr %p, i64 1, i64 0
180 load float, ptr %gep2
181 load <vscale x 4 x i32>, ptr %p
182 load <vscale x 4 x float>, ptr %p
186 ; negative offset tests
188 ; CHECK-LABEL: gep_neg_notscalable
189 ; CHECK-DAG: MayAlias: <4 x i32>* %p, <4 x i32>* %vm16
190 ; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %p
191 ; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %vm16
192 ; CHECK-DAG: MayAlias: <4 x i32>* %p, <4 x i32>* %vm16m16
193 ; CHECK-DAG: NoAlias: <4 x i32>* %vm16, <4 x i32>* %vm16m16
194 ; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %vm16m16
195 ; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %p
196 ; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %vm16
197 ; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %m16pv16
198 ; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %vm16m16
199 define void @gep_neg_notscalable(ptr %p) vscale_range(1,16) {
200 %vm16 = getelementptr <vscale x 4 x i32>, ptr %p, i64 -1
201 %m16 = getelementptr <4 x i32>, ptr %p, i64 -1
202 %vm16m16 = getelementptr <4 x i32>, ptr %vm16, i64 -1
203 %m16pv16 = getelementptr <vscale x 4 x i32>, ptr %m16, i64 1
204 load <4 x i32>, ptr %p
205 load <4 x i32>, ptr %vm16
206 load <4 x i32>, ptr %m16
207 load <4 x i32>, ptr %vm16m16
208 load <4 x i32>, ptr %m16pv16
212 ; CHECK-LABEL: gep_neg_scalable
213 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16
214 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %p
215 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16
216 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16m16
217 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %vm16, <vscale x 4 x i32>* %vm16m16
218 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16m16
219 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %p
220 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %vm16
221 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %m16pv16
222 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %vm16m16
223 define void @gep_neg_scalable(ptr %p) vscale_range(1,16) {
224 %vm16 = getelementptr <vscale x 4 x i32>, ptr %p, i64 -1
225 %m16 = getelementptr <4 x i32>, ptr %p, i64 -1
226 %vm16m16 = getelementptr <4 x i32>, ptr %vm16, i64 -1
227 %m16pv16 = getelementptr <vscale x 4 x i32>, ptr %vm16, i64 1
228 load <vscale x 4 x i32>, ptr %p
229 load <vscale x 4 x i32>, ptr %vm16
230 load <vscale x 4 x i32>, ptr %m16
231 load <vscale x 4 x i32>, ptr %vm16m16
232 load <vscale x 4 x i32>, ptr %m16pv16
236 ; CHECK-LABEL: gep_pos_notscalable
237 ; CHECK-DAG: MayAlias: <4 x i32>* %p, <4 x i32>* %vm16
238 ; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %p
239 ; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %vm16
240 ; CHECK-DAG: MayAlias: <4 x i32>* %p, <4 x i32>* %vm16m16
241 ; CHECK-DAG: NoAlias: <4 x i32>* %vm16, <4 x i32>* %vm16m16
242 ; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %vm16m16
243 ; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %p
244 ; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %vm16
245 ; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %m16pv16
246 ; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %vm16m16
247 define void @gep_pos_notscalable(ptr %p) vscale_range(1,16) {
248 %vm16 = getelementptr <vscale x 4 x i32>, ptr %p, i64 1
249 %m16 = getelementptr <4 x i32>, ptr %p, i64 1
250 %vm16m16 = getelementptr <4 x i32>, ptr %vm16, i64 1
251 %m16pv16 = getelementptr <vscale x 4 x i32>, ptr %vm16, i64 -1
252 load <4 x i32>, ptr %p
253 load <4 x i32>, ptr %vm16
254 load <4 x i32>, ptr %m16
255 load <4 x i32>, ptr %vm16m16
256 load <4 x i32>, ptr %m16pv16
260 ; CHECK-LABEL: gep_pos_scalable
261 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16
262 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %p
263 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16
264 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16m16
265 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %vm16, <vscale x 4 x i32>* %vm16m16
266 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16m16
267 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %p
268 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %vm16
269 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %m16pv16
270 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %vm16m16
271 define void @gep_pos_scalable(ptr %p) vscale_range(1,16) {
272 %vm16 = getelementptr <vscale x 4 x i32>, ptr %p, i64 1
273 %m16 = getelementptr <4 x i32>, ptr %p, i64 1
274 %vm16m16 = getelementptr <4 x i32>, ptr %vm16, i64 1
275 %m16pv16 = getelementptr <vscale x 4 x i32>, ptr %vm16, i64 -1
276 load <vscale x 4 x i32>, ptr %p
277 load <vscale x 4 x i32>, ptr %vm16
278 load <vscale x 4 x i32>, ptr %m16
279 load <vscale x 4 x i32>, ptr %vm16m16
280 load <vscale x 4 x i32>, ptr %m16pv16
284 ; CHECK-LABEL: v1v2types
285 ; CHECK-DAG: MustAlias: <4 x i32>* %p, <vscale x 4 x i32>* %p
286 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16
287 ; CHECK-DAG: MayAlias: <4 x i32>* %p, <vscale x 4 x i32>* %vm16
288 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <4 x i32>* %vm16
289 ; CHECK-DAG: MayAlias: <4 x i32>* %p, <4 x i32>* %vm16
290 ; CHECK-DAG: MustAlias: <4 x i32>* %vm16, <vscale x 4 x i32>* %vm16
291 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %p
292 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <4 x i32>* %p
293 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16
294 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <4 x i32>* %vm16
295 ; CHECK-DAG: NoAlias: <4 x i32>* %m16, <vscale x 4 x i32>* %p
296 ; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %p
297 ; CHECK-DAG: MayAlias: <4 x i32>* %m16, <vscale x 4 x i32>* %vm16
298 ; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %vm16
299 ; CHECK-DAG: MustAlias: <4 x i32>* %m16, <vscale x 4 x i32>* %m16
300 define void @v1v2types(ptr %p) vscale_range(1,16) {
301 %vm16 = getelementptr <vscale x 4 x i32>, ptr %p, i64 -1
302 %m16 = getelementptr <4 x i32>, ptr %p, i64 -1
303 load <vscale x 4 x i32>, ptr %p
304 load <4 x i32>, ptr %p
305 load <vscale x 4 x i32>, ptr %vm16
306 load <4 x i32>, ptr %vm16
307 load <vscale x 4 x i32>, ptr %m16
308 load <4 x i32>, ptr %m16
312 ; VScale intrinsic offset tests
314 ; CHECK-LABEL: vscale_neg_notscalable
315 ; CHECK-DAG: NoAlias: <4 x i32>* %p, <4 x i32>* %vm16
316 ; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %p
317 ; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %vm16
318 ; CHECK-DAG: MayAlias: <4 x i32>* %p, <4 x i32>* %vm16m16
319 ; CHECK-DAG: NoAlias: <4 x i32>* %vm16, <4 x i32>* %vm16m16
320 ; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %vm16m16
321 ; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %p
322 ; CHECK-DAG: NoAlias: <4 x i32>* %m16pv16, <4 x i32>* %vm16
323 ; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %m16pv16
324 ; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %vm16m16
325 define void @vscale_neg_notscalable(ptr %p) {
326 %v = call i64 @llvm.vscale.i64()
327 %vp = mul nsw i64 %v, 16
328 %vm = mul nsw i64 %v, -16
329 %vm16 = getelementptr i8, ptr %p, i64 %vm
330 %m16 = getelementptr <4 x i32>, ptr %p, i64 -1
331 %vm16m16 = getelementptr <4 x i32>, ptr %vm16, i64 -1
332 %m16pv16 = getelementptr i8, ptr %m16, i64 %vp
333 load <4 x i32>, ptr %p
334 load <4 x i32>, ptr %vm16
335 load <4 x i32>, ptr %m16
336 load <4 x i32>, ptr %vm16m16
337 load <4 x i32>, ptr %m16pv16
341 ; CHECK-LABEL: vscale_neg_scalable
342 ; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16
343 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %p
344 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16
345 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16m16
346 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %vm16, <vscale x 4 x i32>* %vm16m16
347 ; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16m16
348 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %p
349 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %vm16
350 ; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %m16pv16
351 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %vm16m16
352 define void @vscale_neg_scalable(ptr %p) {
353 %v = call i64 @llvm.vscale.i64()
354 %vp = mul nsw i64 %v, 16
355 %vm = mul nsw i64 %v, -16
356 %vm16 = getelementptr i8, ptr %p, i64 %vm
357 %m16 = getelementptr <4 x i32>, ptr %p, i64 -1
358 %vm16m16 = getelementptr <4 x i32>, ptr %vm16, i64 -1
359 %m16pv16 = getelementptr i8, ptr %m16, i64 %vp
360 load <vscale x 4 x i32>, ptr %p
361 load <vscale x 4 x i32>, ptr %vm16
362 load <vscale x 4 x i32>, ptr %m16
363 load <vscale x 4 x i32>, ptr %vm16m16
364 load <vscale x 4 x i32>, ptr %m16pv16
368 ; CHECK-LABEL: vscale_pos_notscalable
369 ; CHECK-DAG: NoAlias: <4 x i32>* %p, <4 x i32>* %vm16
370 ; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %p
371 ; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %vm16
372 ; CHECK-DAG: MayAlias: <4 x i32>* %p, <4 x i32>* %vm16m16
373 ; CHECK-DAG: NoAlias: <4 x i32>* %vm16, <4 x i32>* %vm16m16
374 ; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %vm16m16
375 ; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %p
376 ; CHECK-DAG: NoAlias: <4 x i32>* %m16pv16, <4 x i32>* %vm16
377 ; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %m16pv16
378 ; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %vm16m16
379 define void @vscale_pos_notscalable(ptr %p) {
380 %v = call i64 @llvm.vscale.i64()
381 %vp = mul nsw i64 %v, 16
382 %vm = mul nsw i64 %v, -16
383 %vm16 = getelementptr i8, ptr %p, i64 %vp
384 %m16 = getelementptr <4 x i32>, ptr %p, i64 1
385 %vm16m16 = getelementptr <4 x i32>, ptr %vm16, i64 1
386 %m16pv16 = getelementptr i8, ptr %m16, i64 %vm
387 load <4 x i32>, ptr %p
388 load <4 x i32>, ptr %vm16
389 load <4 x i32>, ptr %m16
390 load <4 x i32>, ptr %vm16m16
391 load <4 x i32>, ptr %m16pv16
395 ; CHECK-LABEL: vscale_pos_scalable
396 ; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16
397 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %p
398 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16
399 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16m16
400 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %vm16, <vscale x 4 x i32>* %vm16m16
401 ; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16m16
402 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %p
403 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %vm16
404 ; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %m16pv16
405 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %vm16m16
406 define void @vscale_pos_scalable(ptr %p) {
407 %v = call i64 @llvm.vscale.i64()
408 %vp = mul nsw i64 %v, 16
409 %vm = mul nsw i64 %v, -16
410 %vm16 = getelementptr i8, ptr %p, i64 %vp
411 %m16 = getelementptr <4 x i32>, ptr %p, i64 1
412 %vm16m16 = getelementptr <4 x i32>, ptr %vm16, i64 1
413 %m16pv16 = getelementptr i8, ptr %m16, i64 %vm
414 load <vscale x 4 x i32>, ptr %p
415 load <vscale x 4 x i32>, ptr %vm16
416 load <vscale x 4 x i32>, ptr %m16
417 load <vscale x 4 x i32>, ptr %vm16m16
418 load <vscale x 4 x i32>, ptr %m16pv16
422 ; CHECK-LABEL: vscale_v1v2types
423 ; CHECK-DAG: MustAlias: <4 x i32>* %p, <vscale x 4 x i32>* %p
424 ; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16
425 ; CHECK-DAG: NoAlias: <4 x i32>* %p, <vscale x 4 x i32>* %vm16
426 ; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %p, <4 x i32>* %vm16
427 ; CHECK-DAG: NoAlias: <4 x i32>* %p, <4 x i32>* %vm16
428 ; CHECK-DAG: MustAlias: <4 x i32>* %vm16, <vscale x 4 x i32>* %vm16
429 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %p
430 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <4 x i32>* %p
431 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16
432 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <4 x i32>* %vm16
433 ; CHECK-DAG: NoAlias: <4 x i32>* %m16, <vscale x 4 x i32>* %p
434 ; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %p
435 ; CHECK-DAG: MayAlias: <4 x i32>* %m16, <vscale x 4 x i32>* %vm16
436 ; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %vm16
437 ; CHECK-DAG: MustAlias: <4 x i32>* %m16, <vscale x 4 x i32>* %m16
438 ; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vp16
439 ; CHECK-DAG: NoAlias: <4 x i32>* %p, <vscale x 4 x i32>* %vp16
440 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %vm16, <vscale x 4 x i32>* %vp16
441 ; CHECK-DAG: MayAlias: <4 x i32>* %vm16, <vscale x 4 x i32>* %vp16
442 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vp16
443 ; CHECK-DAG: MayAlias: <4 x i32>* %m16, <vscale x 4 x i32>* %vp16
444 define void @vscale_v1v2types(ptr %p) {
445 %v = call i64 @llvm.vscale.i64()
446 %vp = mul nsw i64 %v, 16
447 %vm = mul nsw i64 %v, -16
448 %vp16 = getelementptr i8, ptr %p, i64 %vp
449 %vm16 = getelementptr i8, ptr %p, i64 %vm
450 %m16 = getelementptr <4 x i32>, ptr %p, i64 -1
451 load <vscale x 4 x i32>, ptr %p
452 load <4 x i32>, ptr %p
453 load <vscale x 4 x i32>, ptr %vm16
454 load <4 x i32>, ptr %vm16
455 load <vscale x 4 x i32>, ptr %m16
456 load <4 x i32>, ptr %m16
457 load <vscale x 4 x i32>, ptr %vp16
461 ; CHECK-LABEL: vscale_negativescale
462 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16
463 define void @vscale_negativescale(ptr %p) vscale_range(1,16) {
464 %v = call i64 @llvm.vscale.i64()
465 %vm = mul nsw i64 %v, -15
466 %vm16 = getelementptr i8, ptr %p, i64 %vm
467 load <vscale x 4 x i32>, ptr %vm16
468 load <vscale x 4 x i32>, ptr %p
472 ; CHECK-LABEL: onevscale
473 ; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %vp161, <vscale x 4 x i32>* %vp162
474 ; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %vp161, <vscale x 4 x i32>* %vp161b
475 ; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %vp161b, <vscale x 4 x i32>* %vp162
476 define void @onevscale(ptr %p) vscale_range(1,16) {
477 %v1 = call i64 @llvm.vscale.i64()
478 %vp1 = mul nsw i64 %v1, 16
479 %vp2 = mul nsw i64 %v1, 16
480 %vp3 = mul nsw i64 %v1, 17
481 %vp161 = getelementptr i8, ptr %p, i64 %vp1
482 %vp162 = getelementptr i8, ptr %p, i64 %vp2
483 %vp161b = getelementptr i8, ptr %vp161, i64 %vp3
484 load <vscale x 4 x i32>, ptr %vp161
485 load <vscale x 4 x i32>, ptr %vp162
486 load <vscale x 4 x i32>, ptr %vp161b
490 ; CHECK-LABEL: twovscales
491 ; CHECK-DAG: MustAlias: <vscale x 4 x i32>* %vp161, <vscale x 4 x i32>* %vp162
492 ; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %vp161, <vscale x 4 x i32>* %vp161b
493 ; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %vp161b, <vscale x 4 x i32>* %vp162
494 define void @twovscales(ptr %p) vscale_range(1,16) {
495 %v1 = call i64 @llvm.vscale.i64()
496 %v2 = call i64 @llvm.vscale.i64()
497 %vp1 = mul nsw i64 %v1, 16
498 %vp2 = mul nsw i64 %v2, 16
499 %vp3 = mul nsw i64 %v1, 17
500 %vp161 = getelementptr i8, ptr %p, i64 %vp1
501 %vp162 = getelementptr i8, ptr %p, i64 %vp2
502 %vp161b = getelementptr i8, ptr %vp161, i64 %vp3
503 load <vscale x 4 x i32>, ptr %vp161
504 load <vscale x 4 x i32>, ptr %vp162
505 load <vscale x 4 x i32>, ptr %vp161b
509 ; getelementptr recursion
511 ; CHECK-LABEL: gep_recursion_level_1
512 ; CHECK-DAG: MayAlias: i32* %a, <vscale x 4 x i32>* %p
513 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep
514 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_1
515 ; CHECK-DAG: MayAlias: i32* %gep, <vscale x 4 x i32>* %p
516 ; CHECK-DAG: MayAlias: i32* %gep_rec_1, <vscale x 4 x i32>* %p
517 ; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_1
518 define void @gep_recursion_level_1(ptr %a, ptr %p) {
519 %gep = getelementptr <vscale x 4 x i32>, ptr %p, i64 1, i64 2
520 %gep_rec_1 = getelementptr i32, ptr %gep, i64 1
521 load <vscale x 4 x i32>, ptr %p
524 load i32, ptr %gep_rec_1
528 ; CHECK-LABEL: gep_recursion_level_1_bitcast
529 ; CHECK-DAG: MustAlias: i32* %a, <vscale x 4 x i32>* %a
530 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep
531 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_1
532 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %a, i32* %gep
533 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %a, i32* %gep_rec_1
534 ; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_1
535 define void @gep_recursion_level_1_bitcast(ptr %a) {
536 %gep = getelementptr <vscale x 4 x i32>, ptr %a, i64 1, i64 2
537 %gep_rec_1 = getelementptr i32, ptr %gep, i64 1
538 load <vscale x 4 x i32>, ptr %a
541 load i32, ptr %gep_rec_1
545 ; CHECK-LABEL: gep_recursion_level_2
546 ; CHECK-DAG: MayAlias: i32* %a, <vscale x 4 x i32>* %p
547 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep
548 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_1
549 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_2
550 ; CHECK-DAG: MayAlias: i32* %gep, <vscale x 4 x i32>* %p
551 ; CHECK-DAG: MayAlias: i32* %gep_rec_1, <vscale x 4 x i32>* %p
552 ; CHECK-DAG: MayAlias: i32* %gep_rec_2, <vscale x 4 x i32>* %p
553 ; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_1
554 ; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_2
555 ; CHECK-DAG: NoAlias: i32* %gep_rec_1, i32* %gep_rec_2
556 define void @gep_recursion_level_2(ptr %a, ptr %p) {
557 %gep = getelementptr <vscale x 4 x i32>, ptr %p, i64 1, i64 2
558 %gep_rec_1 = getelementptr i32, ptr %gep, i64 1
559 %gep_rec_2 = getelementptr i32, ptr %gep_rec_1, i64 1
560 load <vscale x 4 x i32>, ptr %p
563 load i32, ptr %gep_rec_1
564 load i32, ptr %gep_rec_2
568 ; CHECK-LABEL: gep_recursion_max_lookup_depth_reached
569 ; CHECK-DAG: MayAlias: i32* %a, <vscale x 4 x i32>* %p
570 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep
571 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_1
572 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_2
573 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_3
574 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_4
575 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_5
576 ; CHECK-DAG: MayAlias: i32* %a, i32* %gep_rec_6
577 ; CHECK-DAG: MayAlias: i32* %gep, <vscale x 4 x i32>* %p
578 ; CHECK-DAG: MayAlias: i32* %gep_rec_1, <vscale x 4 x i32>* %p
579 ; CHECK-DAG: MayAlias: i32* %gep_rec_2, <vscale x 4 x i32>* %p
580 ; CHECK-DAG: MayAlias: i32* %gep_rec_3, <vscale x 4 x i32>* %p
581 ; CHECK-DAG: MayAlias: i32* %gep_rec_4, <vscale x 4 x i32>* %p
582 ; CHECK-DAG: MayAlias: i32* %gep_rec_5, <vscale x 4 x i32>* %p
583 ; CHECK-DAG: MayAlias: i32* %gep_rec_6, <vscale x 4 x i32>* %p
584 ; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_1
585 ; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_2
586 ; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_3
587 ; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_4
588 ; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_5
589 ; CHECK-DAG: NoAlias: i32* %gep, i32* %gep_rec_6
590 ; CHECK-DAG: NoAlias: i32* %gep_rec_1, i32* %gep_rec_2
591 ; CHECK-DAG: NoAlias: i32* %gep_rec_1, i32* %gep_rec_3
592 ; CHECK-DAG: NoAlias: i32* %gep_rec_1, i32* %gep_rec_4
593 ; CHECK-DAG: NoAlias: i32* %gep_rec_1, i32* %gep_rec_5
594 ; CHECK-DAG: NoAlias: i32* %gep_rec_1, i32* %gep_rec_6
595 ; CHECK-DAG: NoAlias: i32* %gep_rec_2, i32* %gep_rec_3
596 ; CHECK-DAG: NoAlias: i32* %gep_rec_2, i32* %gep_rec_4
597 ; CHECK-DAG: NoAlias: i32* %gep_rec_2, i32* %gep_rec_5
598 ; CHECK-DAG: NoAlias: i32* %gep_rec_2, i32* %gep_rec_6
599 ; CHECK-DAG: NoAlias: i32* %gep_rec_3, i32* %gep_rec_4
600 ; CHECK-DAG: NoAlias: i32* %gep_rec_3, i32* %gep_rec_5
601 ; CHECK-DAG: NoAlias: i32* %gep_rec_3, i32* %gep_rec_6
602 ; CHECK-DAG: NoAlias: i32* %gep_rec_4, i32* %gep_rec_5
603 ; CHECK-DAG: NoAlias: i32* %gep_rec_4, i32* %gep_rec_6
604 ; CHECK-DAG: NoAlias: i32* %gep_rec_5, i32* %gep_rec_6
605 ; GEP max lookup depth was set to 6.
606 define void @gep_recursion_max_lookup_depth_reached(ptr %a, ptr %p) {
607 %gep = getelementptr <vscale x 4 x i32>, ptr %p, i64 1, i64 2
608 %gep_rec_1 = getelementptr i32, ptr %gep, i64 1
609 %gep_rec_2 = getelementptr i32, ptr %gep_rec_1, i64 1
610 %gep_rec_3 = getelementptr i32, ptr %gep_rec_2, i64 1
611 %gep_rec_4 = getelementptr i32, ptr %gep_rec_3, i64 1
612 %gep_rec_5 = getelementptr i32, ptr %gep_rec_4, i64 1
613 %gep_rec_6 = getelementptr i32, ptr %gep_rec_5, i64 1
614 load <vscale x 4 x i32>, ptr %p
617 load i32, ptr %gep_rec_1
618 load i32, ptr %gep_rec_2
619 load i32, ptr %gep_rec_3
620 load i32, ptr %gep_rec_4
621 load i32, ptr %gep_rec_5
622 load i32, ptr %gep_rec_6
626 ; CHECK-LABEL: gep_2048
627 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %off255, <vscale x 4 x i32>* %p
628 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff255, <vscale x 4 x i32>* %p
629 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff255, <vscale x 4 x i32>* %off255
630 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %off256, <vscale x 4 x i32>* %p
631 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %off255, <vscale x 4 x i32>* %off256
632 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff255, <vscale x 4 x i32>* %off256
633 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff256, <vscale x 4 x i32>* %p
634 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff256, <vscale x 4 x i32>* %off255
635 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff255, <vscale x 4 x i32>* %noff256
636 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff256, <vscale x 4 x i32>* %off256
637 define void @gep_2048(ptr %p) {
638 %off255 = getelementptr i8, ptr %p, i64 255
639 %noff255 = getelementptr i8, ptr %p, i64 -255
640 %off256 = getelementptr i8, ptr %p, i64 256
641 %noff256 = getelementptr i8, ptr %p, i64 -256
642 load <vscale x 4 x i32>, ptr %p
643 load <vscale x 4 x i32>, ptr %off255
644 load <vscale x 4 x i32>, ptr %noff255
645 load <vscale x 4 x i32>, ptr %off256
646 load <vscale x 4 x i32>, ptr %noff256
650 ; CHECK-LABEL: gep_2048_vscalerange
651 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %off255, <vscale x 4 x i32>* %p
652 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff255, <vscale x 4 x i32>* %p
653 ; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %noff255, <vscale x 4 x i32>* %off255
654 ; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %off256, <vscale x 4 x i32>* %p
655 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %off255, <vscale x 4 x i32>* %off256
656 ; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %noff255, <vscale x 4 x i32>* %off256
657 ; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %noff256, <vscale x 4 x i32>* %p
658 ; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %noff256, <vscale x 4 x i32>* %off255
659 ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff255, <vscale x 4 x i32>* %noff256
660 ; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %noff256, <vscale x 4 x i32>* %off256
661 define void @gep_2048_vscalerange(ptr %p) vscale_range(1,16) {
662 %off255 = getelementptr i8, ptr %p, i64 255
663 %noff255 = getelementptr i8, ptr %p, i64 -255
664 %off256 = getelementptr i8, ptr %p, i64 256
665 %noff256 = getelementptr i8, ptr %p, i64 -256
666 load <vscale x 4 x i32>, ptr %p
667 load <vscale x 4 x i32>, ptr %off255
668 load <vscale x 4 x i32>, ptr %noff255
669 load <vscale x 4 x i32>, ptr %off256
670 load <vscale x 4 x i32>, ptr %noff256