@@ -117,6 +117,36 @@ define void @gep_different_base_const_offset(ptr noalias %p1, ptr noalias %p2) {
117
117
ret void
118
118
}
119
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
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
135
+ }
136
+
137
+ declare 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
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
148
+ }
149
+
120
150
; getelementptr + bitcast
121
151
122
152
; CHECK-LABEL: gep_bitcast_1
@@ -153,6 +183,132 @@ define void @gep_bitcast_2(ptr %p) {
153
183
ret void
154
184
}
155
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
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
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
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
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
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
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
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
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: MayAlias: <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
310
+ }
311
+
156
312
; getelementptr recursion
157
313
158
314
; CHECK-LABEL: gep_recursion_level_1
@@ -269,3 +425,51 @@ define void @gep_recursion_max_lookup_depth_reached(ptr %a, ptr %p) {
269
425
load i32 , ptr %gep_rec_6
270
426
ret void
271
427
}
428
+
429
+ ; CHECK-LABEL: gep_2048
430
+ ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %off255, <vscale x 4 x i32>* %p
431
+ ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff255, <vscale x 4 x i32>* %p
432
+ ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff255, <vscale x 4 x i32>* %off255
433
+ ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %off256, <vscale x 4 x i32>* %p
434
+ ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %off255, <vscale x 4 x i32>* %off256
435
+ ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff255, <vscale x 4 x i32>* %off256
436
+ ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff256, <vscale x 4 x i32>* %p
437
+ ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff256, <vscale x 4 x i32>* %off255
438
+ ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff255, <vscale x 4 x i32>* %noff256
439
+ ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff256, <vscale x 4 x i32>* %off256
440
+ define void @gep_2048 (ptr %p ) {
441
+ %off255 = getelementptr i8 , ptr %p , i64 255
442
+ %noff255 = getelementptr i8 , ptr %p , i64 -255
443
+ %off256 = getelementptr i8 , ptr %p , i64 256
444
+ %noff256 = getelementptr i8 , ptr %p , i64 -256
445
+ load <vscale x 4 x i32 >, ptr %p
446
+ load <vscale x 4 x i32 >, ptr %off255
447
+ load <vscale x 4 x i32 >, ptr %noff255
448
+ load <vscale x 4 x i32 >, ptr %off256
449
+ load <vscale x 4 x i32 >, ptr %noff256
450
+ ret void
451
+ }
452
+
453
+ ; CHECK-LABEL: gep_2048_vscalerange
454
+ ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %off255, <vscale x 4 x i32>* %p
455
+ ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff255, <vscale x 4 x i32>* %p
456
+ ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff255, <vscale x 4 x i32>* %off255
457
+ ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %off256, <vscale x 4 x i32>* %p
458
+ ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %off255, <vscale x 4 x i32>* %off256
459
+ ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff255, <vscale x 4 x i32>* %off256
460
+ ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff256, <vscale x 4 x i32>* %p
461
+ ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff256, <vscale x 4 x i32>* %off255
462
+ ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff255, <vscale x 4 x i32>* %noff256
463
+ ; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %noff256, <vscale x 4 x i32>* %off256
464
+ define void @gep_2048_vscalerange (ptr %p ) vscale_range(1 ,16 ) {
465
+ %off255 = getelementptr i8 , ptr %p , i64 255
466
+ %noff255 = getelementptr i8 , ptr %p , i64 -255
467
+ %off256 = getelementptr i8 , ptr %p , i64 256
468
+ %noff256 = getelementptr i8 , ptr %p , i64 -256
469
+ load <vscale x 4 x i32 >, ptr %p
470
+ load <vscale x 4 x i32 >, ptr %off255
471
+ load <vscale x 4 x i32 >, ptr %noff255
472
+ load <vscale x 4 x i32 >, ptr %off256
473
+ load <vscale x 4 x i32 >, ptr %noff256
474
+ ret void
475
+ }
0 commit comments