@@ -424,4 +424,115 @@ vector.body.i.i.i.i: ; preds = %.shuffle.then.i.i.i
424424 ret void
425425}
426426
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+
427538attributes #0 = { nounwind }
0 commit comments