blob: b6e83414941536c7d269ea702228ba2e2fd11a6c [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
; RUN: llc -mtriple=amdgpu9.00-amd-amdhsa < %s | FileCheck %s
; All allocatable VGPRs are clobbered while several large SGPR values remain
; live. Verify end-to-end that SGPR spills use scratch when no WWM VGPR pool is
; available, without relying on register-allocation stress options.
define amdgpu_kernel void @repro(i32 %in) {
; CHECK-LABEL: repro:
; CHECK: ; %bb.0: ; %entry
; CHECK-NEXT: s_mov_b64 s[70:71], s[2:3]
; CHECK-NEXT: s_mov_b64 s[68:69], s[0:1]
; CHECK-NEXT: s_load_dword s0, s[8:9], 0x0
; CHECK-NEXT: s_add_u32 s68, s68, s17
; CHECK-NEXT: s_addc_u32 s69, s69, 0
; CHECK-NEXT: s_mov_b64 s[2:3], exec
; CHECK-NEXT: ;;#ASMSTART
; CHECK-NEXT: ;;#ASMEND
; CHECK-NEXT: ;;#ASMSTART
; CHECK-NEXT: ; VGPR clobbers
; CHECK-NEXT: ;;#ASMEND
; CHECK-NEXT: s_mov_b64 exec, 0xffffffff
; CHECK-NEXT: buffer_store_dword v0, off, s[68:71], 0 offset:256
; CHECK-NEXT: v_writelane_b32 v0, s36, 0
; CHECK-NEXT: v_writelane_b32 v0, s37, 1
; CHECK-NEXT: v_writelane_b32 v0, s38, 2
; CHECK-NEXT: v_writelane_b32 v0, s39, 3
; CHECK-NEXT: v_writelane_b32 v0, s40, 4
; CHECK-NEXT: v_writelane_b32 v0, s41, 5
; CHECK-NEXT: v_writelane_b32 v0, s42, 6
; CHECK-NEXT: v_writelane_b32 v0, s43, 7
; CHECK-NEXT: v_writelane_b32 v0, s44, 8
; CHECK-NEXT: v_writelane_b32 v0, s45, 9
; CHECK-NEXT: v_writelane_b32 v0, s46, 10
; CHECK-NEXT: v_writelane_b32 v0, s47, 11
; CHECK-NEXT: v_writelane_b32 v0, s48, 12
; CHECK-NEXT: v_writelane_b32 v0, s49, 13
; CHECK-NEXT: v_writelane_b32 v0, s50, 14
; CHECK-NEXT: v_writelane_b32 v0, s51, 15
; CHECK-NEXT: v_writelane_b32 v0, s52, 16
; CHECK-NEXT: v_writelane_b32 v0, s53, 17
; CHECK-NEXT: v_writelane_b32 v0, s54, 18
; CHECK-NEXT: v_writelane_b32 v0, s55, 19
; CHECK-NEXT: v_writelane_b32 v0, s56, 20
; CHECK-NEXT: v_writelane_b32 v0, s57, 21
; CHECK-NEXT: v_writelane_b32 v0, s58, 22
; CHECK-NEXT: v_writelane_b32 v0, s59, 23
; CHECK-NEXT: v_writelane_b32 v0, s60, 24
; CHECK-NEXT: v_writelane_b32 v0, s61, 25
; CHECK-NEXT: v_writelane_b32 v0, s62, 26
; CHECK-NEXT: v_writelane_b32 v0, s63, 27
; CHECK-NEXT: v_writelane_b32 v0, s64, 28
; CHECK-NEXT: v_writelane_b32 v0, s65, 29
; CHECK-NEXT: v_writelane_b32 v0, s66, 30
; CHECK-NEXT: v_writelane_b32 v0, s67, 31
; CHECK-NEXT: buffer_store_dword v0, off, s[68:71], 0 ; 4-byte Folded Spill
; CHECK-NEXT: buffer_load_dword v0, off, s[68:71], 0 offset:256
; CHECK-NEXT: s_waitcnt vmcnt(0)
; CHECK-NEXT: s_mov_b64 exec, s[2:3]
; CHECK-NEXT: s_waitcnt lgkmcnt(0)
; CHECK-NEXT: s_cmp_lg_u32 s0, 0
; CHECK-NEXT: ;;#ASMSTART
; CHECK-NEXT: ; VGPR clobbers
; CHECK-NEXT: ;;#ASMEND
; CHECK-NEXT: ;;#ASMSTART
; CHECK-NEXT: ; VGPR clobbers
; CHECK-NEXT: ;;#ASMEND
; CHECK-NEXT: s_cbranch_scc0 .LBB0_2
; CHECK-NEXT: ; %bb.1: ; %exit
; CHECK-NEXT: s_endpgm
; CHECK-NEXT: .LBB0_2: ; %use
; CHECK-NEXT: s_mov_b64 s[34:35], exec
; CHECK-NEXT: s_mov_b64 exec, 0xffffffff
; CHECK-NEXT: buffer_store_dword v0, off, s[68:71], 0 offset:256
; CHECK-NEXT: v_writelane_b32 v0, s36, 0
; CHECK-NEXT: v_writelane_b32 v0, s37, 1
; CHECK-NEXT: v_writelane_b32 v0, s38, 2
; CHECK-NEXT: v_writelane_b32 v0, s39, 3
; CHECK-NEXT: v_writelane_b32 v0, s40, 4
; CHECK-NEXT: v_writelane_b32 v0, s41, 5
; CHECK-NEXT: v_writelane_b32 v0, s42, 6
; CHECK-NEXT: v_writelane_b32 v0, s43, 7
; CHECK-NEXT: v_writelane_b32 v0, s44, 8
; CHECK-NEXT: v_writelane_b32 v0, s45, 9
; CHECK-NEXT: v_writelane_b32 v0, s46, 10
; CHECK-NEXT: v_writelane_b32 v0, s47, 11
; CHECK-NEXT: v_writelane_b32 v0, s48, 12
; CHECK-NEXT: v_writelane_b32 v0, s49, 13
; CHECK-NEXT: v_writelane_b32 v0, s50, 14
; CHECK-NEXT: v_writelane_b32 v0, s51, 15
; CHECK-NEXT: v_writelane_b32 v0, s52, 16
; CHECK-NEXT: v_writelane_b32 v0, s53, 17
; CHECK-NEXT: v_writelane_b32 v0, s54, 18
; CHECK-NEXT: v_writelane_b32 v0, s55, 19
; CHECK-NEXT: v_writelane_b32 v0, s56, 20
; CHECK-NEXT: v_writelane_b32 v0, s57, 21
; CHECK-NEXT: v_writelane_b32 v0, s58, 22
; CHECK-NEXT: v_writelane_b32 v0, s59, 23
; CHECK-NEXT: v_writelane_b32 v0, s60, 24
; CHECK-NEXT: v_writelane_b32 v0, s61, 25
; CHECK-NEXT: v_writelane_b32 v0, s62, 26
; CHECK-NEXT: v_writelane_b32 v0, s63, 27
; CHECK-NEXT: v_writelane_b32 v0, s64, 28
; CHECK-NEXT: v_writelane_b32 v0, s65, 29
; CHECK-NEXT: v_writelane_b32 v0, s66, 30
; CHECK-NEXT: v_writelane_b32 v0, s67, 31
; CHECK-NEXT: buffer_store_dword v0, off, s[68:71], 0 offset:128 ; 4-byte Folded Spill
; CHECK-NEXT: buffer_load_dword v0, off, s[68:71], 0 offset:256
; CHECK-NEXT: s_waitcnt vmcnt(0)
; CHECK-NEXT: s_mov_b64 exec, s[34:35]
; CHECK-NEXT: s_mov_b64 s[34:35], exec
; CHECK-NEXT: s_mov_b64 exec, 0xffffffff
; CHECK-NEXT: buffer_store_dword v0, off, s[68:71], 0 offset:256
; CHECK-NEXT: buffer_load_dword v0, off, s[68:71], 0 ; 4-byte Folded Reload
; CHECK-NEXT: s_waitcnt vmcnt(0)
; CHECK-NEXT: v_readlane_b32 s36, v0, 0
; CHECK-NEXT: v_readlane_b32 s37, v0, 1
; CHECK-NEXT: v_readlane_b32 s38, v0, 2
; CHECK-NEXT: v_readlane_b32 s39, v0, 3
; CHECK-NEXT: v_readlane_b32 s40, v0, 4
; CHECK-NEXT: v_readlane_b32 s41, v0, 5
; CHECK-NEXT: v_readlane_b32 s42, v0, 6
; CHECK-NEXT: v_readlane_b32 s43, v0, 7
; CHECK-NEXT: v_readlane_b32 s44, v0, 8
; CHECK-NEXT: v_readlane_b32 s45, v0, 9
; CHECK-NEXT: v_readlane_b32 s46, v0, 10
; CHECK-NEXT: v_readlane_b32 s47, v0, 11
; CHECK-NEXT: v_readlane_b32 s48, v0, 12
; CHECK-NEXT: v_readlane_b32 s49, v0, 13
; CHECK-NEXT: v_readlane_b32 s50, v0, 14
; CHECK-NEXT: v_readlane_b32 s51, v0, 15
; CHECK-NEXT: v_readlane_b32 s52, v0, 16
; CHECK-NEXT: v_readlane_b32 s53, v0, 17
; CHECK-NEXT: v_readlane_b32 s54, v0, 18
; CHECK-NEXT: v_readlane_b32 s55, v0, 19
; CHECK-NEXT: v_readlane_b32 s56, v0, 20
; CHECK-NEXT: v_readlane_b32 s57, v0, 21
; CHECK-NEXT: v_readlane_b32 s58, v0, 22
; CHECK-NEXT: v_readlane_b32 s59, v0, 23
; CHECK-NEXT: v_readlane_b32 s60, v0, 24
; CHECK-NEXT: v_readlane_b32 s61, v0, 25
; CHECK-NEXT: v_readlane_b32 s62, v0, 26
; CHECK-NEXT: v_readlane_b32 s63, v0, 27
; CHECK-NEXT: v_readlane_b32 s64, v0, 28
; CHECK-NEXT: v_readlane_b32 s65, v0, 29
; CHECK-NEXT: v_readlane_b32 s66, v0, 30
; CHECK-NEXT: v_readlane_b32 s67, v0, 31
; CHECK-NEXT: buffer_load_dword v0, off, s[68:71], 0 offset:256
; CHECK-NEXT: s_waitcnt vmcnt(0)
; CHECK-NEXT: s_mov_b64 exec, s[34:35]
; CHECK-NEXT: ;;#ASMSTART
; CHECK-NEXT: ; VGPR clobbers
; CHECK-NEXT: ;;#ASMEND
; CHECK-NEXT: ;;#ASMSTART
; CHECK-NEXT: ; VGPR clobbers
; CHECK-NEXT: ;;#ASMEND
; CHECK-NEXT: s_mov_b64 s[34:35], exec
; CHECK-NEXT: s_mov_b64 exec, 0xffffffff
; CHECK-NEXT: buffer_store_dword v0, off, s[68:71], 0 offset:256
; CHECK-NEXT: buffer_load_dword v0, off, s[68:71], 0 offset:128 ; 4-byte Folded Reload
; CHECK-NEXT: s_waitcnt vmcnt(0)
; CHECK-NEXT: v_readlane_b32 s0, v0, 0
; CHECK-NEXT: v_readlane_b32 s1, v0, 1
; CHECK-NEXT: v_readlane_b32 s2, v0, 2
; CHECK-NEXT: v_readlane_b32 s3, v0, 3
; CHECK-NEXT: v_readlane_b32 s4, v0, 4
; CHECK-NEXT: v_readlane_b32 s5, v0, 5
; CHECK-NEXT: v_readlane_b32 s6, v0, 6
; CHECK-NEXT: v_readlane_b32 s7, v0, 7
; CHECK-NEXT: v_readlane_b32 s8, v0, 8
; CHECK-NEXT: v_readlane_b32 s9, v0, 9
; CHECK-NEXT: v_readlane_b32 s10, v0, 10
; CHECK-NEXT: v_readlane_b32 s11, v0, 11
; CHECK-NEXT: v_readlane_b32 s12, v0, 12
; CHECK-NEXT: v_readlane_b32 s13, v0, 13
; CHECK-NEXT: v_readlane_b32 s14, v0, 14
; CHECK-NEXT: v_readlane_b32 s15, v0, 15
; CHECK-NEXT: v_readlane_b32 s16, v0, 16
; CHECK-NEXT: v_readlane_b32 s17, v0, 17
; CHECK-NEXT: v_readlane_b32 s18, v0, 18
; CHECK-NEXT: v_readlane_b32 s19, v0, 19
; CHECK-NEXT: v_readlane_b32 s20, v0, 20
; CHECK-NEXT: v_readlane_b32 s21, v0, 21
; CHECK-NEXT: v_readlane_b32 s22, v0, 22
; CHECK-NEXT: v_readlane_b32 s23, v0, 23
; CHECK-NEXT: v_readlane_b32 s24, v0, 24
; CHECK-NEXT: v_readlane_b32 s25, v0, 25
; CHECK-NEXT: v_readlane_b32 s26, v0, 26
; CHECK-NEXT: v_readlane_b32 s27, v0, 27
; CHECK-NEXT: v_readlane_b32 s28, v0, 28
; CHECK-NEXT: v_readlane_b32 s29, v0, 29
; CHECK-NEXT: v_readlane_b32 s30, v0, 30
; CHECK-NEXT: v_readlane_b32 s31, v0, 31
; CHECK-NEXT: buffer_load_dword v0, off, s[68:71], 0 offset:256
; CHECK-NEXT: s_waitcnt vmcnt(0)
; CHECK-NEXT: s_mov_b64 exec, s[34:35]
; CHECK-NEXT: ;;#ASMSTART
; CHECK-NEXT: ; VGPR clobbers
; CHECK-NEXT: ;;#ASMEND
; CHECK-NEXT: s_endpgm
entry:
call void asm sideeffect "", "~{v[0:7]},~{v[8:15]},~{v[16:23]},~{v[24:31]},~{v[32:39]},~{v[40:47]},~{v[48:55]},~{v[56:63]}" ()
%s0 = call <32 x i32> asm sideeffect "; VGPR clobbers", "=s" ()
%s1 = call <32 x i32> asm sideeffect "; VGPR clobbers", "=s" ()
%s2 = call <32 x i32> asm sideeffect "; VGPR clobbers", "=s" ()
%cmp = icmp eq i32 %in, 0
br i1 %cmp, label %use, label %exit
use:
call void asm sideeffect "; VGPR clobbers", "s"(<32 x i32> %s0)
call void asm sideeffect "; VGPR clobbers", "s"(<32 x i32> %s1)
call void asm sideeffect "; VGPR clobbers", "s"(<32 x i32> %s2)
br label %exit
exit:
ret void
}