@@ -80,12 +80,12 @@ define ptr addrspace(1) @ptrmask_combine_consecutive_preserve_attrs_todo2(ptr ad
80
80
define ptr @ptrmask_combine_add_nonnull (ptr %p ) {
81
81
; CHECK-LABEL: define ptr @ptrmask_combine_add_nonnull
82
82
; CHECK-SAME: (ptr [[P:%.*]]) {
83
- ; CHECK-NEXT: [[PM0:%.*]] = call align 64 ptr @llvm.ptrmask.p0.i64(ptr [[P]], i64 -64 )
84
- ; CHECK-NEXT: [[PGEP :%.*]] = getelementptr i8, ptr [[PM0]], i64 33
85
- ; CHECK-NEXT: [[R:%.*]] = call nonnull align 32 ptr @llvm.ptrmask.p0.i64(ptr [[PGEP ]], i64 -32)
83
+ ; CHECK-NEXT: [[PM0:%.*]] = call align 4 ptr @llvm.ptrmask.p0.i64(ptr [[P]], i64 -60 )
84
+ ; CHECK-NEXT: [[PGEP1 :%.*]] = getelementptr i8, ptr [[PM0]], i64 32
85
+ ; CHECK-NEXT: [[R:%.*]] = call nonnull align 32 ptr @llvm.ptrmask.p0.i64(ptr [[PGEP1 ]], i64 -32)
86
86
; CHECK-NEXT: ret ptr [[R]]
87
87
;
88
- %pm0 = call ptr @llvm.ptrmask.p0.i64 (ptr %p , i64 -64 )
88
+ %pm0 = call ptr @llvm.ptrmask.p0.i64 (ptr %p , i64 -60 )
89
89
%pgep = getelementptr i8 , ptr %pm0 , i64 33
90
90
%r = call ptr @llvm.ptrmask.p0.i64 (ptr %pgep , i64 -16 )
91
91
ret ptr %r
@@ -287,6 +287,114 @@ define ptr addrspace(1) @ptrmask_maintain_provenance_i32(ptr addrspace(1) %p0) {
287
287
ret ptr addrspace (1 ) %r
288
288
}
289
289
290
+ define ptr @ptrmask_is_nop0 (ptr align 8 %p ) {
291
+ ; CHECK-LABEL: define ptr @ptrmask_is_nop0
292
+ ; CHECK-SAME: (ptr align 8 [[P:%.*]]) {
293
+ ; CHECK-NEXT: ret ptr [[P]]
294
+ ;
295
+ %pm = call ptr @llvm.ptrmask.p0.i64 (ptr %p , i64 -8 )
296
+ ret ptr %pm
297
+ }
298
+
299
+ define ptr @ptrmask_is_nop1 (ptr align 8 %p ) {
300
+ ; CHECK-LABEL: define ptr @ptrmask_is_nop1
301
+ ; CHECK-SAME: (ptr align 8 [[P:%.*]]) {
302
+ ; CHECK-NEXT: ret ptr [[P]]
303
+ ;
304
+ %pm = call ptr @llvm.ptrmask.p0.i64 (ptr %p , i64 -4 )
305
+ ret ptr %pm
306
+ }
307
+
308
+ define ptr @ptrmask_to_modified_gep0 (ptr align 8 %p ) {
309
+ ; CHECK-LABEL: define ptr @ptrmask_to_modified_gep0
310
+ ; CHECK-SAME: (ptr align 8 [[P:%.*]]) {
311
+ ; CHECK-NEXT: [[PM:%.*]] = call align 16 ptr @llvm.ptrmask.p0.i64(ptr [[P]], i64 -16)
312
+ ; CHECK-NEXT: ret ptr [[PM]]
313
+ ;
314
+ %gep = getelementptr i8 , ptr %p , i32 5
315
+ %pm = call ptr @llvm.ptrmask.p0.i64 (ptr %gep , i64 -16 )
316
+ ret ptr %pm
317
+ }
318
+
319
+ define ptr @ptrmask_to_modified_gep1 (ptr align 8 %p ) {
320
+ ; CHECK-LABEL: define ptr @ptrmask_to_modified_gep1
321
+ ; CHECK-SAME: (ptr align 8 [[P:%.*]]) {
322
+ ; CHECK-NEXT: ret ptr [[P]]
323
+ ;
324
+ %gep = getelementptr i8 , ptr %p , i32 6
325
+ %pm = call ptr @llvm.ptrmask.p0.i64 (ptr %gep , i64 -8 )
326
+ ret ptr %pm
327
+ }
328
+
329
+ define ptr @ptrmask_to_modified_gep2 (ptr align 16 %p ) {
330
+ ; CHECK-LABEL: define ptr @ptrmask_to_modified_gep2
331
+ ; CHECK-SAME: (ptr align 16 [[P:%.*]]) {
332
+ ; CHECK-NEXT: [[GEP1:%.*]] = getelementptr i8, ptr [[P]], i64 12
333
+ ; CHECK-NEXT: ret ptr [[GEP1]]
334
+ ;
335
+ %gep = getelementptr i8 , ptr %p , i32 15
336
+ %pm = call ptr @llvm.ptrmask.p0.i64 (ptr %gep , i64 -4 )
337
+ ret ptr %pm
338
+ }
339
+
340
+ define ptr @ptrmask_to_modified_gep4 (ptr align 8 %p ) {
341
+ ; CHECK-LABEL: define ptr @ptrmask_to_modified_gep4
342
+ ; CHECK-SAME: (ptr align 8 [[P:%.*]]) {
343
+ ; CHECK-NEXT: [[GEP1:%.*]] = getelementptr i8, ptr [[P]], i64 24
344
+ ; CHECK-NEXT: [[PM:%.*]] = call align 16 ptr @llvm.ptrmask.p0.i64(ptr [[GEP1]], i64 -16)
345
+ ; CHECK-NEXT: ret ptr [[PM]]
346
+ ;
347
+ %gep = getelementptr i8 , ptr %p , i32 29
348
+ %pm = call ptr @llvm.ptrmask.p0.i64 (ptr %gep , i64 -16 )
349
+ ret ptr %pm
350
+ }
351
+
352
+ define ptr @ptrmask_to_modified_gep5 (ptr align 8 %p ) {
353
+ ; CHECK-LABEL: define ptr @ptrmask_to_modified_gep5
354
+ ; CHECK-SAME: (ptr align 8 [[P:%.*]]) {
355
+ ; CHECK-NEXT: [[GEP1:%.*]] = getelementptr i8, ptr [[P]], i64 24
356
+ ; CHECK-NEXT: ret ptr [[GEP1]]
357
+ ;
358
+ %gep = getelementptr i8 , ptr %p , i32 30
359
+ %pm = call ptr @llvm.ptrmask.p0.i64 (ptr %gep , i64 -8 )
360
+ ret ptr %pm
361
+ }
362
+
363
+ define ptr @ptrmask_to_modified_gep6 (ptr align 16 %p ) {
364
+ ; CHECK-LABEL: define ptr @ptrmask_to_modified_gep6
365
+ ; CHECK-SAME: (ptr align 16 [[P:%.*]]) {
366
+ ; CHECK-NEXT: [[GEP1:%.*]] = getelementptr i8, ptr [[P]], i64 28
367
+ ; CHECK-NEXT: ret ptr [[GEP1]]
368
+ ;
369
+ %gep = getelementptr i8 , ptr %p , i32 31
370
+ %pm = call ptr @llvm.ptrmask.p0.i64 (ptr %gep , i64 -4 )
371
+ ret ptr %pm
372
+ }
373
+
374
+ define ptr @ptrmask_of_gep_requires_i8 (ptr align 8 %p ) {
375
+ ; CHECK-LABEL: define ptr @ptrmask_of_gep_requires_i8
376
+ ; CHECK-SAME: (ptr align 8 [[P:%.*]]) {
377
+ ; CHECK-NEXT: [[GEP1:%.*]] = getelementptr i8, ptr [[P]], i64 8
378
+ ; CHECK-NEXT: [[PM:%.*]] = call align 16 ptr @llvm.ptrmask.p0.i64(ptr [[GEP1]], i64 -16)
379
+ ; CHECK-NEXT: ret ptr [[PM]]
380
+ ;
381
+ %gep = getelementptr i16 , ptr %p , i32 5
382
+ %pm = call ptr @llvm.ptrmask.p0.i64 (ptr %gep , i64 -16 )
383
+ ret ptr %pm
384
+ }
385
+
386
+ define <2 x ptr > @ptrmask_of_gep_vector_type_unimplemented (<2 x ptr > align 8 %p ) {
387
+ ; CHECK-LABEL: define <2 x ptr> @ptrmask_of_gep_vector_type_unimplemented
388
+ ; CHECK-SAME: (<2 x ptr> align 8 [[P:%.*]]) {
389
+ ; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, <2 x ptr> [[P]], i64 17
390
+ ; CHECK-NEXT: [[PM:%.*]] = call align 32 <2 x ptr> @llvm.ptrmask.v2p0.v2i64(<2 x ptr> [[GEP]], <2 x i64> <i64 -96, i64 -96>)
391
+ ; CHECK-NEXT: ret <2 x ptr> [[PM]]
392
+ ;
393
+ %gep = getelementptr i8 , <2 x ptr > %p , i32 17
394
+ %pm = call <2 x ptr > @llvm.ptrmask.v2p0.v2i64 (<2 x ptr > %gep , <2 x i64 > <i64 -96 , i64 -96 >)
395
+ ret <2 x ptr > %pm
396
+ }
397
+
290
398
define ptr @ptrmask_is_useless0 (i64 %i , i64 %m ) {
291
399
; CHECK-LABEL: define ptr @ptrmask_is_useless0
292
400
; CHECK-SAME: (i64 [[I:%.*]], i64 [[M:%.*]]) {
0 commit comments