xref: /llvm-project/llvm/test/Analysis/BasicAA/vscale.ll (revision 5e6b4be5cbddbc7538cdae0f0889b116e386fcca)
1; RUN: opt < %s -aa-pipeline=basic-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
2
3; getelementptr
4
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
9define 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
17}
18
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
24define 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
32}
33
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
38define 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
46}
47
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
52define 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
60}
61
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
66define 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
74}
75
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
81define 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
88}
89
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
94define 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
101}
102
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
110define 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
118}
119
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
125define 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
135}
136
137declare i64 @llvm.vscale.i64()
138
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
141define 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
148}
149
150; getelementptr + bitcast
151
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
159define 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
167}
168
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
176define 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
184}
185
186; negative offset tests
187
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
199define 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
210}
211
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
223define 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
234}
235
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
247define 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
258}
259
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
271define 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
282}
283
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
300define 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
310}
311
312; VScale intrinsic offset tests
313
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
325define 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
339}
340
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
352define 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
366}
367
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
379define 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
393}
394
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
406define 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
420}
421
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
444define 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
459}
460
461; CHECK-LABEL: vscale_negativescale
462; CHECK-DAG:   MayAlias:    <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16
463define 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
470}
471
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
476define 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
488}
489
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
494define 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
507}
508
509; getelementptr recursion
510
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
518define 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
526}
527
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
535define 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
543}
544
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
556define 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
566}
567
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.
606define 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
624}
625
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
637define 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
648}
649
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
661define 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
672}
673