| ; 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 | |
| } |