Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Analysis / BasicAA / vscale.ll
blob05b9b6b3c3a9706257067997f9fb8f657c5a8834
1 ; RUN: opt < %s -aa-pipeline=basic-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
3 ; getelementptr
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
16   ret void
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
31   ret void
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
44   load i32, ptr %gep2
45   ret void
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
58   load i32, ptr %gep2
59   ret void
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
73   ret void
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
85   load i32, ptr %gep1
86   load i32, ptr %gep2
87   ret void
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
100   ret void
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
117   ret void
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
134   ret void
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
147   ret void
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
163   load i32, ptr %gep1
164   load i32, ptr %gep2
165   load i32, ptr %p
166   ret void
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
179   load i32, ptr %gep1
180   load float, ptr %gep2
181   load <vscale x 4 x i32>, ptr %p
182   load <vscale x 4 x float>, ptr %p
183   ret void
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
209   ret void
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
233   ret void
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
257   ret void
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
281   ret void
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
309   ret void
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
338   ret void
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
365   ret void
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
392   ret void
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
419   ret void
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
458   ret void
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
469   ret void
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
487   ret void
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
506   ret void
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
522   load i32, ptr %a
523   load i32, ptr %gep
524   load i32, ptr %gep_rec_1
525   ret void
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
539   load i32, ptr %a
540   load i32, ptr %gep
541   load i32, ptr %gep_rec_1
542   ret void
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
561   load i32, ptr %a
562   load i32, ptr %gep
563   load i32, ptr %gep_rec_1
564   load i32, ptr %gep_rec_2
565   ret void
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
615   load i32, ptr %a
616   load i32, ptr %gep
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
623   ret void
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
647   ret void
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
671   ret void