@@ -424,4 +424,115 @@ vector.body.i.i.i.i: ; preds = %.shuffle.then.i.i.i
424
424
ret void
425
425
}
426
426
427
+ ; Check that we do not produce a verifier error after prolog
428
+ ; epilog. alloca1 and alloca2 will lower to literals.
429
+
430
+ ; GCN-LABEL: {{^}}s_multiple_frame_indexes_literal_offsets:
431
+ ; GCN: s_load_dword [[ARG0:s[0-9]+]]
432
+ ; GCN: s_movk_i32 [[ALLOCA1:s[0-9]+]], 0x44
433
+ ; GCN: s_cmp_eq_u32 [[ARG0]], 0
434
+ ; GCN: s_cselect_b32 [[SELECT:s[0-9]+]], [[ALLOCA1]], 0x48
435
+ ; GCN: s_mov_b32 [[ALLOCA0:s[0-9]+]], 0
436
+ ; GCN: ; use [[SELECT]], [[ALLOCA0]]
437
+ define amdgpu_kernel void @s_multiple_frame_indexes_literal_offsets (i32 inreg %arg0 ) #0 {
438
+ %alloca0 = alloca [17 x i32 ], align 8 , addrspace (5 )
439
+ %alloca1 = alloca i32 , align 4 , addrspace (5 )
440
+ %alloca2 = alloca i32 , align 4 , addrspace (5 )
441
+ %cmp = icmp eq i32 %arg0 , 0
442
+ %select = select i1 %cmp , ptr addrspace (5 ) %alloca1 , ptr addrspace (5 ) %alloca2
443
+ call void asm sideeffect "; use $0, $1" ,"s,s" (ptr addrspace (5 ) %select , ptr addrspace (5 ) %alloca0 )
444
+ ret void
445
+ }
446
+
447
+ ; %alloca1 or alloca2 will lower to an inline constant, and one will
448
+ ; be a literal, so we could fold both indexes into the instruction.
449
+
450
+ ; GCN-LABEL: {{^}}s_multiple_frame_indexes_one_imm_one_literal_offset:
451
+ ; GCN: s_load_dword [[ARG0:s[0-9]+]]
452
+ ; GCN: s_mov_b32 [[ALLOCA1:s[0-9]+]], 64
453
+ ; GCN: s_cmp_eq_u32 [[ARG0]], 0
454
+ ; GCN: s_cselect_b32 [[SELECT:s[0-9]+]], [[ALLOCA1]], 0x44
455
+ ; GCN: s_mov_b32 [[ALLOCA0:s[0-9]+]], 0
456
+ ; GCN: ; use [[SELECT]], [[ALLOCA0]]
457
+ define amdgpu_kernel void @s_multiple_frame_indexes_one_imm_one_literal_offset (i32 inreg %arg0 ) #0 {
458
+ %alloca0 = alloca [16 x i32 ], align 8 , addrspace (5 )
459
+ %alloca1 = alloca i32 , align 4 , addrspace (5 )
460
+ %alloca2 = alloca i32 , align 4 , addrspace (5 )
461
+ %cmp = icmp eq i32 %arg0 , 0
462
+ %select = select i1 %cmp , ptr addrspace (5 ) %alloca1 , ptr addrspace (5 ) %alloca2
463
+ call void asm sideeffect "; use $0, $1" ,"s,s" (ptr addrspace (5 ) %select , ptr addrspace (5 ) %alloca0 )
464
+ ret void
465
+ }
466
+
467
+ ; GCN-LABEL: {{^}}s_multiple_frame_indexes_imm_offsets:
468
+ ; GCN: s_load_dword [[ARG0:s[0-9]+]]
469
+ ; GCN: s_mov_b32 [[ALLOCA1:s[0-9]+]], 16
470
+ ; GCN: s_cmp_eq_u32 [[ARG0]], 0
471
+ ; GCN: s_cselect_b32 [[SELECT:s[0-9]+]], [[ALLOCA1]], 20
472
+ ; GCN: s_mov_b32 [[ALLOCA0:s[0-9]+]], 0
473
+ ; GCN: ; use [[SELECT]], [[ALLOCA0]]
474
+ define amdgpu_kernel void @s_multiple_frame_indexes_imm_offsets (i32 inreg %arg0 ) #0 {
475
+ %alloca0 = alloca [4 x i32 ], align 8 , addrspace (5 )
476
+ %alloca1 = alloca i32 , align 4 , addrspace (5 )
477
+ %alloca2 = alloca i32 , align 4 , addrspace (5 )
478
+ %cmp = icmp eq i32 %arg0 , 0
479
+ %select = select i1 %cmp , ptr addrspace (5 ) %alloca1 , ptr addrspace (5 ) %alloca2
480
+ call void asm sideeffect "; use $0, $1" ,"s,s" (ptr addrspace (5 ) %select , ptr addrspace (5 ) %alloca0 )
481
+ ret void
482
+ }
483
+
484
+ ; GCN-LABEL: {{^}}v_multiple_frame_indexes_literal_offsets:
485
+ ; GCN: v_mov_b32_e32 [[ALLOCA1:v[0-9]+]], 0x48
486
+ ; GCN: v_mov_b32_e32 [[ALLOCA2:v[0-9]+]], 0x44
487
+ ; GCN: v_cmp_eq_u32_e32 vcc, 0, v0
488
+ ; GCN: v_cndmask_b32_e32 [[SELECT:v[0-9]+]], [[ALLOCA1]], [[ALLOCA2]], vcc
489
+ ; GCN: v_mov_b32_e32 [[ALLOCA0:v[0-9]+]], 0{{$}}
490
+ ; GCN: ; use [[SELECT]], [[ALLOCA0]]
491
+ define amdgpu_kernel void @v_multiple_frame_indexes_literal_offsets () #0 {
492
+ %vgpr = call i32 @llvm.amdgcn.workitem.id.x ()
493
+ %alloca0 = alloca [17 x i32 ], align 8 , addrspace (5 )
494
+ %alloca1 = alloca i32 , align 4 , addrspace (5 )
495
+ %alloca2 = alloca i32 , align 4 , addrspace (5 )
496
+ %cmp = icmp eq i32 %vgpr , 0
497
+ %select = select i1 %cmp , ptr addrspace (5 ) %alloca1 , ptr addrspace (5 ) %alloca2
498
+ call void asm sideeffect "; use $0, $1" ,"v,v" (ptr addrspace (5 ) %select , ptr addrspace (5 ) %alloca0 )
499
+ ret void
500
+ }
501
+
502
+ ; GCN-LABEL: {{^}}v_multiple_frame_indexes_one_imm_one_literal_offset:
503
+ ; GCN: v_mov_b32_e32 [[ALLOCA1:v[0-9]+]], 0x44
504
+ ; GCN: v_mov_b32_e32 [[ALLOCA2:v[0-9]+]], 64
505
+ ; GCN: v_cmp_eq_u32_e32 vcc, 0, v0
506
+ ; GCN: v_cndmask_b32_e32 [[SELECT:v[0-9]+]], [[ALLOCA1]], [[ALLOCA2]], vcc
507
+ ; GCN: v_mov_b32_e32 [[ALLOCA0:v[0-9]+]], 0{{$}}
508
+ ; GCN: ; use [[SELECT]], [[ALLOCA0]]
509
+ define amdgpu_kernel void @v_multiple_frame_indexes_one_imm_one_literal_offset () #0 {
510
+ %vgpr = call i32 @llvm.amdgcn.workitem.id.x ()
511
+ %alloca0 = alloca [16 x i32 ], align 8 , addrspace (5 )
512
+ %alloca1 = alloca i32 , align 4 , addrspace (5 )
513
+ %alloca2 = alloca i32 , align 4 , addrspace (5 )
514
+ %cmp = icmp eq i32 %vgpr , 0
515
+ %select = select i1 %cmp , ptr addrspace (5 ) %alloca1 , ptr addrspace (5 ) %alloca2
516
+ call void asm sideeffect "; use $0, $1" ,"v,v" (ptr addrspace (5 ) %select , ptr addrspace (5 ) %alloca0 )
517
+ ret void
518
+ }
519
+
520
+ ; GCN-LABEL: {{^}}v_multiple_frame_indexes_imm_offsets:
521
+ ; GCN: v_mov_b32_e32 [[ALLOCA1:v[0-9]+]], 12
522
+ ; GCN: v_mov_b32_e32 [[ALLOCA2:v[0-9]+]], 8
523
+ ; GCN: v_cmp_eq_u32_e32 vcc, 0, v0
524
+ ; GCN: v_cndmask_b32_e32 [[SELECT:v[0-9]+]], [[ALLOCA1]], [[ALLOCA2]], vcc
525
+ ; GCN: v_mov_b32_e32 [[ALLOCA0:v[0-9]+]], 0{{$}}
526
+ ; GCN: ; use [[SELECT]], [[ALLOCA0]]
527
+ define amdgpu_kernel void @v_multiple_frame_indexes_imm_offsets () #0 {
528
+ %vgpr = call i32 @llvm.amdgcn.workitem.id.x ()
529
+ %alloca0 = alloca [2 x i32 ], align 8 , addrspace (5 )
530
+ %alloca1 = alloca i32 , align 4 , addrspace (5 )
531
+ %alloca2 = alloca i32 , align 4 , addrspace (5 )
532
+ %cmp = icmp eq i32 %vgpr , 0
533
+ %select = select i1 %cmp , ptr addrspace (5 ) %alloca1 , ptr addrspace (5 ) %alloca2
534
+ call void asm sideeffect "; use $0, $1" ,"v,v" (ptr addrspace (5 ) %select , ptr addrspace (5 ) %alloca0 )
535
+ ret void
536
+ }
537
+
427
538
attributes #0 = { nounwind }
0 commit comments