Skip to content

Commit 75d6737

Browse files
authored
AMDGPU: Fix clobbering temp reg for large frame indexes in VOP3 users (#114924)
For a VOP3 instruction that does not permit a literal operand with an SGPR operand, this would re-use the same scratch register for both operands, clobbering the original value.
1 parent 44f49b5 commit 75d6737

File tree

3 files changed

+215
-6
lines changed

3 files changed

+215
-6
lines changed

llvm/lib/Target/AMDGPU/SIRegisterInfo.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2628,8 +2628,10 @@ bool SIRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator MI,
26282628
std::swap(FIOperandNum, OtherOpIdx);
26292629
}
26302630

2631-
for (unsigned SrcIdx : {Src1Idx, Src0Idx}) {
2632-
// Depending on operand constraints we may need to insert another copy.
2631+
// We need at most one mov to satisfy the operand constraints. Prefer to
2632+
// move the FI operand first, as it may be a literal in a VOP3
2633+
// instruction.
2634+
for (unsigned SrcIdx : {FIOperandNum, OtherOpIdx}) {
26332635
if (!TII->isOperandLegal(*MI, SrcIdx)) {
26342636
// If commuting didn't make the operands legal, we need to materialize
26352637
// in a register.
@@ -2648,6 +2650,7 @@ bool SIRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator MI,
26482650

26492651
Src.ChangeToRegister(ScavengedVGPR, false);
26502652
Src.setIsKill(true);
2653+
break;
26512654
}
26522655
}
26532656

llvm/test/CodeGen/AMDGPU/eliminate-frame-index-v-add-co-u32.mir

Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1828,3 +1828,211 @@ body: |
18281828
SI_RETURN implicit $vgpr0, implicit $sgpr4_sgpr5
18291829
18301830
...
1831+
1832+
---
1833+
name: v_add_co_u32_e64_fi_sgpr_clobbered_register
1834+
tracksRegLiveness: true
1835+
stack:
1836+
- { id: 0, size: 32768, alignment: 4, local-offset: 0 }
1837+
- { id: 1, size: 32768, alignment: 4, local-offset: 32768 }
1838+
machineFunctionInfo:
1839+
isEntryFunction: true
1840+
scratchRSrcReg: '$sgpr96_sgpr97_sgpr98_sgpr99'
1841+
stackPtrOffsetReg: '$sgpr32'
1842+
body: |
1843+
bb.0:
1844+
liveins: $sgpr2_sgpr3, $sgpr4_sgpr5_sgpr6_sgpr7:0x000000000000003C
1845+
1846+
; GFX7-LABEL: name: v_add_co_u32_e64_fi_sgpr_clobbered_register
1847+
; GFX7: liveins: $sgpr2_sgpr3, $sgpr4_sgpr5_sgpr6_sgpr7:0x000000000000003C, $sgpr0_sgpr1_sgpr2_sgpr3
1848+
; GFX7-NEXT: {{ $}}
1849+
; GFX7-NEXT: $sgpr8_sgpr9_sgpr10_sgpr11 = COPY killed $sgpr0_sgpr1_sgpr2_sgpr3
1850+
; GFX7-NEXT: $sgpr8 = S_ADD_U32 $sgpr8, $noreg, implicit-def $scc, implicit-def $sgpr8_sgpr9_sgpr10_sgpr11
1851+
; GFX7-NEXT: $sgpr9 = S_ADDC_U32 $sgpr9, 0, implicit-def dead $scc, implicit $scc, implicit-def $sgpr8_sgpr9_sgpr10_sgpr11
1852+
; GFX7-NEXT: renamable $sgpr0 = S_LSHL_B32 renamable $sgpr6, 2, implicit-def dead $scc
1853+
; GFX7-NEXT: $vgpr1 = V_MOV_B32_e32 32772, implicit $exec
1854+
; GFX7-NEXT: renamable $vgpr0, dead renamable $vcc = V_ADD_CO_U32_e64 killed $vgpr1, killed $sgpr0, 0, implicit $exec
1855+
; GFX7-NEXT: renamable $vgpr0 = BUFFER_LOAD_DWORD_OFFEN killed renamable $vgpr0, $sgpr8_sgpr9_sgpr10_sgpr11, 0, 0, 0, 0, implicit $exec :: (load (s32), addrspace 5)
1856+
; GFX7-NEXT: S_ENDPGM 0
1857+
;
1858+
; GFX8-LABEL: name: v_add_co_u32_e64_fi_sgpr_clobbered_register
1859+
; GFX8: liveins: $sgpr2_sgpr3, $sgpr4_sgpr5_sgpr6_sgpr7:0x000000000000003C, $sgpr0_sgpr1_sgpr2_sgpr3
1860+
; GFX8-NEXT: {{ $}}
1861+
; GFX8-NEXT: $sgpr8_sgpr9_sgpr10_sgpr11 = COPY killed $sgpr0_sgpr1_sgpr2_sgpr3
1862+
; GFX8-NEXT: $sgpr8 = S_ADD_U32 $sgpr8, $noreg, implicit-def $scc, implicit-def $sgpr8_sgpr9_sgpr10_sgpr11
1863+
; GFX8-NEXT: $sgpr9 = S_ADDC_U32 $sgpr9, 0, implicit-def dead $scc, implicit $scc, implicit-def $sgpr8_sgpr9_sgpr10_sgpr11
1864+
; GFX8-NEXT: renamable $sgpr0 = S_LSHL_B32 renamable $sgpr6, 2, implicit-def dead $scc
1865+
; GFX8-NEXT: $vgpr1 = V_MOV_B32_e32 32772, implicit $exec
1866+
; GFX8-NEXT: renamable $vgpr0, dead renamable $vcc = V_ADD_CO_U32_e64 killed $vgpr1, killed $sgpr0, 0, implicit $exec
1867+
; GFX8-NEXT: renamable $vgpr0 = BUFFER_LOAD_DWORD_OFFEN killed renamable $vgpr0, $sgpr8_sgpr9_sgpr10_sgpr11, 0, 0, 0, 0, implicit $exec :: (load (s32), addrspace 5)
1868+
; GFX8-NEXT: S_ENDPGM 0
1869+
;
1870+
; GFX900-LABEL: name: v_add_co_u32_e64_fi_sgpr_clobbered_register
1871+
; GFX900: liveins: $sgpr2_sgpr3, $sgpr4_sgpr5_sgpr6_sgpr7:0x000000000000003C, $sgpr0_sgpr1_sgpr2_sgpr3
1872+
; GFX900-NEXT: {{ $}}
1873+
; GFX900-NEXT: $sgpr8_sgpr9_sgpr10_sgpr11 = COPY killed $sgpr0_sgpr1_sgpr2_sgpr3
1874+
; GFX900-NEXT: $sgpr8 = S_ADD_U32 $sgpr8, $noreg, implicit-def $scc, implicit-def $sgpr8_sgpr9_sgpr10_sgpr11
1875+
; GFX900-NEXT: $sgpr9 = S_ADDC_U32 $sgpr9, 0, implicit-def dead $scc, implicit $scc, implicit-def $sgpr8_sgpr9_sgpr10_sgpr11
1876+
; GFX900-NEXT: renamable $sgpr0 = S_LSHL_B32 renamable $sgpr6, 2, implicit-def dead $scc
1877+
; GFX900-NEXT: $vgpr1 = V_MOV_B32_e32 32772, implicit $exec
1878+
; GFX900-NEXT: renamable $vgpr0, dead renamable $vcc = V_ADD_CO_U32_e64 killed $vgpr1, killed $sgpr0, 0, implicit $exec
1879+
; GFX900-NEXT: renamable $vgpr0 = BUFFER_LOAD_DWORD_OFFEN killed renamable $vgpr0, $sgpr8_sgpr9_sgpr10_sgpr11, 0, 0, 0, 0, implicit $exec :: (load (s32), addrspace 5)
1880+
; GFX900-NEXT: S_ENDPGM 0
1881+
;
1882+
; GFX90A-LABEL: name: v_add_co_u32_e64_fi_sgpr_clobbered_register
1883+
; GFX90A: liveins: $sgpr2_sgpr3, $sgpr4_sgpr5_sgpr6_sgpr7:0x000000000000003C, $sgpr0_sgpr1_sgpr2_sgpr3
1884+
; GFX90A-NEXT: {{ $}}
1885+
; GFX90A-NEXT: $sgpr8_sgpr9_sgpr10_sgpr11 = COPY killed $sgpr0_sgpr1_sgpr2_sgpr3
1886+
; GFX90A-NEXT: $sgpr8 = S_ADD_U32 $sgpr8, $noreg, implicit-def $scc, implicit-def $sgpr8_sgpr9_sgpr10_sgpr11
1887+
; GFX90A-NEXT: $sgpr9 = S_ADDC_U32 $sgpr9, 0, implicit-def dead $scc, implicit $scc, implicit-def $sgpr8_sgpr9_sgpr10_sgpr11
1888+
; GFX90A-NEXT: renamable $sgpr0 = S_LSHL_B32 renamable $sgpr6, 2, implicit-def dead $scc
1889+
; GFX90A-NEXT: $vgpr1 = V_MOV_B32_e32 32772, implicit $exec
1890+
; GFX90A-NEXT: renamable $vgpr0, dead renamable $vcc = V_ADD_CO_U32_e64 killed $vgpr1, killed $sgpr0, 0, implicit $exec
1891+
; GFX90A-NEXT: renamable $vgpr0 = BUFFER_LOAD_DWORD_OFFEN killed renamable $vgpr0, $sgpr8_sgpr9_sgpr10_sgpr11, 0, 0, 0, 0, implicit $exec :: (load (s32), addrspace 5)
1892+
; GFX90A-NEXT: S_ENDPGM 0
1893+
;
1894+
; GFX10-LABEL: name: v_add_co_u32_e64_fi_sgpr_clobbered_register
1895+
; GFX10: liveins: $sgpr2_sgpr3, $sgpr4_sgpr5_sgpr6_sgpr7:0x000000000000003C, $sgpr0_sgpr1_sgpr2_sgpr3
1896+
; GFX10-NEXT: {{ $}}
1897+
; GFX10-NEXT: $sgpr96_sgpr97_sgpr98_sgpr99 = COPY killed $sgpr0_sgpr1_sgpr2_sgpr3
1898+
; GFX10-NEXT: $sgpr96 = S_ADD_U32 $sgpr96, $noreg, implicit-def $scc, implicit-def $sgpr96_sgpr97_sgpr98_sgpr99
1899+
; GFX10-NEXT: $sgpr97 = S_ADDC_U32 $sgpr97, 0, implicit-def dead $scc, implicit $scc, implicit-def $sgpr96_sgpr97_sgpr98_sgpr99
1900+
; GFX10-NEXT: renamable $sgpr0 = S_LSHL_B32 renamable $sgpr6, 2, implicit-def dead $scc
1901+
; GFX10-NEXT: renamable $vgpr0, dead renamable $vcc = V_ADD_CO_U32_e64 32772, killed $sgpr0, 0, implicit $exec
1902+
; GFX10-NEXT: renamable $vgpr0 = BUFFER_LOAD_DWORD_OFFEN killed renamable $vgpr0, $sgpr96_sgpr97_sgpr98_sgpr99, 0, 0, 0, 0, implicit $exec :: (load (s32), addrspace 5)
1903+
; GFX10-NEXT: S_ENDPGM 0
1904+
;
1905+
; GFX940-LABEL: name: v_add_co_u32_e64_fi_sgpr_clobbered_register
1906+
; GFX940: liveins: $sgpr2_sgpr3, $sgpr4_sgpr5_sgpr6_sgpr7:0x000000000000003C
1907+
; GFX940-NEXT: {{ $}}
1908+
; GFX940-NEXT: renamable $sgpr0 = S_LSHL_B32 renamable $sgpr6, 2, implicit-def dead $scc
1909+
; GFX940-NEXT: $vgpr1 = V_MOV_B32_e32 32772, implicit $exec
1910+
; GFX940-NEXT: renamable $vgpr0, dead renamable $vcc = V_ADD_CO_U32_e64 killed $vgpr1, killed $sgpr0, 0, implicit $exec
1911+
; GFX940-NEXT: renamable $vgpr0 = BUFFER_LOAD_DWORD_OFFEN killed renamable $vgpr0, $sgpr96_sgpr97_sgpr98_sgpr99, 0, 0, 0, 0, implicit $exec :: (load (s32), addrspace 5)
1912+
; GFX940-NEXT: S_ENDPGM 0
1913+
;
1914+
; GFX11-LABEL: name: v_add_co_u32_e64_fi_sgpr_clobbered_register
1915+
; GFX11: liveins: $sgpr2_sgpr3, $sgpr4_sgpr5_sgpr6_sgpr7:0x000000000000003C
1916+
; GFX11-NEXT: {{ $}}
1917+
; GFX11-NEXT: renamable $sgpr0 = S_LSHL_B32 renamable $sgpr6, 2, implicit-def dead $scc
1918+
; GFX11-NEXT: renamable $vgpr0, dead renamable $vcc = V_ADD_CO_U32_e64 32772, killed $sgpr0, 0, implicit $exec
1919+
; GFX11-NEXT: renamable $vgpr0 = BUFFER_LOAD_DWORD_OFFEN killed renamable $vgpr0, $sgpr96_sgpr97_sgpr98_sgpr99, 0, 0, 0, 0, implicit $exec :: (load (s32), addrspace 5)
1920+
; GFX11-NEXT: S_ENDPGM 0
1921+
;
1922+
; GFX12-LABEL: name: v_add_co_u32_e64_fi_sgpr_clobbered_register
1923+
; GFX12: liveins: $sgpr2_sgpr3, $sgpr4_sgpr5_sgpr6_sgpr7:0x000000000000003C
1924+
; GFX12-NEXT: {{ $}}
1925+
; GFX12-NEXT: renamable $sgpr0 = S_LSHL_B32 renamable $sgpr6, 2, implicit-def dead $scc
1926+
; GFX12-NEXT: renamable $vgpr0, dead renamable $vcc = V_ADD_CO_U32_e64 32768, killed $sgpr0, 0, implicit $exec
1927+
; GFX12-NEXT: renamable $vgpr0 = BUFFER_LOAD_DWORD_OFFEN killed renamable $vgpr0, $sgpr96_sgpr97_sgpr98_sgpr99, 0, 0, 0, 0, implicit $exec :: (load (s32), addrspace 5)
1928+
; GFX12-NEXT: S_ENDPGM 0
1929+
renamable $sgpr0 = S_LSHL_B32 renamable $sgpr6, 2, implicit-def dead $scc
1930+
renamable $vgpr0, dead renamable $vcc = V_ADD_CO_U32_e64 %stack.1, killed $sgpr0, 0, implicit $exec
1931+
renamable $vgpr0 = BUFFER_LOAD_DWORD_OFFEN killed renamable $vgpr0, $sgpr96_sgpr97_sgpr98_sgpr99, 0, 0, 0, 0, implicit $exec :: (load (s32), addrspace 5)
1932+
S_ENDPGM 0
1933+
1934+
...
1935+
1936+
---
1937+
name: v_add_co_u32_e64_sgpr_fi_clobbered_register
1938+
tracksRegLiveness: true
1939+
stack:
1940+
- { id: 0, size: 32768, alignment: 4, local-offset: 0 }
1941+
- { id: 1, size: 32768, alignment: 4, local-offset: 32768 }
1942+
machineFunctionInfo:
1943+
isEntryFunction: true
1944+
scratchRSrcReg: '$sgpr96_sgpr97_sgpr98_sgpr99'
1945+
stackPtrOffsetReg: '$sgpr32'
1946+
body: |
1947+
bb.0:
1948+
liveins: $sgpr2_sgpr3, $sgpr4_sgpr5_sgpr6_sgpr7:0x000000000000003C
1949+
1950+
; GFX7-LABEL: name: v_add_co_u32_e64_sgpr_fi_clobbered_register
1951+
; GFX7: liveins: $sgpr2_sgpr3, $sgpr4_sgpr5_sgpr6_sgpr7:0x000000000000003C, $sgpr0_sgpr1_sgpr2_sgpr3
1952+
; GFX7-NEXT: {{ $}}
1953+
; GFX7-NEXT: $sgpr8_sgpr9_sgpr10_sgpr11 = COPY killed $sgpr0_sgpr1_sgpr2_sgpr3
1954+
; GFX7-NEXT: $sgpr8 = S_ADD_U32 $sgpr8, $noreg, implicit-def $scc, implicit-def $sgpr8_sgpr9_sgpr10_sgpr11
1955+
; GFX7-NEXT: $sgpr9 = S_ADDC_U32 $sgpr9, 0, implicit-def dead $scc, implicit $scc, implicit-def $sgpr8_sgpr9_sgpr10_sgpr11
1956+
; GFX7-NEXT: renamable $sgpr0 = S_LSHL_B32 renamable $sgpr6, 2, implicit-def dead $scc
1957+
; GFX7-NEXT: $vgpr1 = V_MOV_B32_e32 32772, implicit $exec
1958+
; GFX7-NEXT: renamable $vgpr0, dead renamable $vcc = V_ADD_CO_U32_e64 killed $vgpr1, killed $sgpr0, 0, implicit $exec
1959+
; GFX7-NEXT: renamable $vgpr0 = BUFFER_LOAD_DWORD_OFFEN killed renamable $vgpr0, $sgpr8_sgpr9_sgpr10_sgpr11, 0, 0, 0, 0, implicit $exec :: (load (s32), addrspace 5)
1960+
; GFX7-NEXT: S_ENDPGM 0
1961+
;
1962+
; GFX8-LABEL: name: v_add_co_u32_e64_sgpr_fi_clobbered_register
1963+
; GFX8: liveins: $sgpr2_sgpr3, $sgpr4_sgpr5_sgpr6_sgpr7:0x000000000000003C, $sgpr0_sgpr1_sgpr2_sgpr3
1964+
; GFX8-NEXT: {{ $}}
1965+
; GFX8-NEXT: $sgpr8_sgpr9_sgpr10_sgpr11 = COPY killed $sgpr0_sgpr1_sgpr2_sgpr3
1966+
; GFX8-NEXT: $sgpr8 = S_ADD_U32 $sgpr8, $noreg, implicit-def $scc, implicit-def $sgpr8_sgpr9_sgpr10_sgpr11
1967+
; GFX8-NEXT: $sgpr9 = S_ADDC_U32 $sgpr9, 0, implicit-def dead $scc, implicit $scc, implicit-def $sgpr8_sgpr9_sgpr10_sgpr11
1968+
; GFX8-NEXT: renamable $sgpr0 = S_LSHL_B32 renamable $sgpr6, 2, implicit-def dead $scc
1969+
; GFX8-NEXT: $vgpr1 = V_MOV_B32_e32 32772, implicit $exec
1970+
; GFX8-NEXT: renamable $vgpr0, dead renamable $vcc = V_ADD_CO_U32_e64 killed $vgpr1, killed $sgpr0, 0, implicit $exec
1971+
; GFX8-NEXT: renamable $vgpr0 = BUFFER_LOAD_DWORD_OFFEN killed renamable $vgpr0, $sgpr8_sgpr9_sgpr10_sgpr11, 0, 0, 0, 0, implicit $exec :: (load (s32), addrspace 5)
1972+
; GFX8-NEXT: S_ENDPGM 0
1973+
;
1974+
; GFX900-LABEL: name: v_add_co_u32_e64_sgpr_fi_clobbered_register
1975+
; GFX900: liveins: $sgpr2_sgpr3, $sgpr4_sgpr5_sgpr6_sgpr7:0x000000000000003C, $sgpr0_sgpr1_sgpr2_sgpr3
1976+
; GFX900-NEXT: {{ $}}
1977+
; GFX900-NEXT: $sgpr8_sgpr9_sgpr10_sgpr11 = COPY killed $sgpr0_sgpr1_sgpr2_sgpr3
1978+
; GFX900-NEXT: $sgpr8 = S_ADD_U32 $sgpr8, $noreg, implicit-def $scc, implicit-def $sgpr8_sgpr9_sgpr10_sgpr11
1979+
; GFX900-NEXT: $sgpr9 = S_ADDC_U32 $sgpr9, 0, implicit-def dead $scc, implicit $scc, implicit-def $sgpr8_sgpr9_sgpr10_sgpr11
1980+
; GFX900-NEXT: renamable $sgpr0 = S_LSHL_B32 renamable $sgpr6, 2, implicit-def dead $scc
1981+
; GFX900-NEXT: $vgpr1 = V_MOV_B32_e32 32772, implicit $exec
1982+
; GFX900-NEXT: renamable $vgpr0, dead renamable $vcc = V_ADD_CO_U32_e64 killed $vgpr1, killed $sgpr0, 0, implicit $exec
1983+
; GFX900-NEXT: renamable $vgpr0 = BUFFER_LOAD_DWORD_OFFEN killed renamable $vgpr0, $sgpr8_sgpr9_sgpr10_sgpr11, 0, 0, 0, 0, implicit $exec :: (load (s32), addrspace 5)
1984+
; GFX900-NEXT: S_ENDPGM 0
1985+
;
1986+
; GFX90A-LABEL: name: v_add_co_u32_e64_sgpr_fi_clobbered_register
1987+
; GFX90A: liveins: $sgpr2_sgpr3, $sgpr4_sgpr5_sgpr6_sgpr7:0x000000000000003C, $sgpr0_sgpr1_sgpr2_sgpr3
1988+
; GFX90A-NEXT: {{ $}}
1989+
; GFX90A-NEXT: $sgpr8_sgpr9_sgpr10_sgpr11 = COPY killed $sgpr0_sgpr1_sgpr2_sgpr3
1990+
; GFX90A-NEXT: $sgpr8 = S_ADD_U32 $sgpr8, $noreg, implicit-def $scc, implicit-def $sgpr8_sgpr9_sgpr10_sgpr11
1991+
; GFX90A-NEXT: $sgpr9 = S_ADDC_U32 $sgpr9, 0, implicit-def dead $scc, implicit $scc, implicit-def $sgpr8_sgpr9_sgpr10_sgpr11
1992+
; GFX90A-NEXT: renamable $sgpr0 = S_LSHL_B32 renamable $sgpr6, 2, implicit-def dead $scc
1993+
; GFX90A-NEXT: $vgpr1 = V_MOV_B32_e32 32772, implicit $exec
1994+
; GFX90A-NEXT: renamable $vgpr0, dead renamable $vcc = V_ADD_CO_U32_e64 killed $vgpr1, killed $sgpr0, 0, implicit $exec
1995+
; GFX90A-NEXT: renamable $vgpr0 = BUFFER_LOAD_DWORD_OFFEN killed renamable $vgpr0, $sgpr8_sgpr9_sgpr10_sgpr11, 0, 0, 0, 0, implicit $exec :: (load (s32), addrspace 5)
1996+
; GFX90A-NEXT: S_ENDPGM 0
1997+
;
1998+
; GFX10-LABEL: name: v_add_co_u32_e64_sgpr_fi_clobbered_register
1999+
; GFX10: liveins: $sgpr2_sgpr3, $sgpr4_sgpr5_sgpr6_sgpr7:0x000000000000003C, $sgpr0_sgpr1_sgpr2_sgpr3
2000+
; GFX10-NEXT: {{ $}}
2001+
; GFX10-NEXT: $sgpr96_sgpr97_sgpr98_sgpr99 = COPY killed $sgpr0_sgpr1_sgpr2_sgpr3
2002+
; GFX10-NEXT: $sgpr96 = S_ADD_U32 $sgpr96, $noreg, implicit-def $scc, implicit-def $sgpr96_sgpr97_sgpr98_sgpr99
2003+
; GFX10-NEXT: $sgpr97 = S_ADDC_U32 $sgpr97, 0, implicit-def dead $scc, implicit $scc, implicit-def $sgpr96_sgpr97_sgpr98_sgpr99
2004+
; GFX10-NEXT: renamable $sgpr0 = S_LSHL_B32 renamable $sgpr6, 2, implicit-def dead $scc
2005+
; GFX10-NEXT: renamable $vgpr0, dead renamable $vcc = V_ADD_CO_U32_e64 32772, killed $sgpr0, 0, implicit $exec
2006+
; GFX10-NEXT: renamable $vgpr0 = BUFFER_LOAD_DWORD_OFFEN killed renamable $vgpr0, $sgpr96_sgpr97_sgpr98_sgpr99, 0, 0, 0, 0, implicit $exec :: (load (s32), addrspace 5)
2007+
; GFX10-NEXT: S_ENDPGM 0
2008+
;
2009+
; GFX940-LABEL: name: v_add_co_u32_e64_sgpr_fi_clobbered_register
2010+
; GFX940: liveins: $sgpr2_sgpr3, $sgpr4_sgpr5_sgpr6_sgpr7:0x000000000000003C
2011+
; GFX940-NEXT: {{ $}}
2012+
; GFX940-NEXT: renamable $sgpr0 = S_LSHL_B32 renamable $sgpr6, 2, implicit-def dead $scc
2013+
; GFX940-NEXT: $vgpr1 = V_MOV_B32_e32 32772, implicit $exec
2014+
; GFX940-NEXT: renamable $vgpr0, dead renamable $vcc = V_ADD_CO_U32_e64 killed $vgpr1, killed $sgpr0, 0, implicit $exec
2015+
; GFX940-NEXT: renamable $vgpr0 = BUFFER_LOAD_DWORD_OFFEN killed renamable $vgpr0, $sgpr96_sgpr97_sgpr98_sgpr99, 0, 0, 0, 0, implicit $exec :: (load (s32), addrspace 5)
2016+
; GFX940-NEXT: S_ENDPGM 0
2017+
;
2018+
; GFX11-LABEL: name: v_add_co_u32_e64_sgpr_fi_clobbered_register
2019+
; GFX11: liveins: $sgpr2_sgpr3, $sgpr4_sgpr5_sgpr6_sgpr7:0x000000000000003C
2020+
; GFX11-NEXT: {{ $}}
2021+
; GFX11-NEXT: renamable $sgpr0 = S_LSHL_B32 renamable $sgpr6, 2, implicit-def dead $scc
2022+
; GFX11-NEXT: renamable $vgpr0, dead renamable $vcc = V_ADD_CO_U32_e64 32772, killed $sgpr0, 0, implicit $exec
2023+
; GFX11-NEXT: renamable $vgpr0 = BUFFER_LOAD_DWORD_OFFEN killed renamable $vgpr0, $sgpr96_sgpr97_sgpr98_sgpr99, 0, 0, 0, 0, implicit $exec :: (load (s32), addrspace 5)
2024+
; GFX11-NEXT: S_ENDPGM 0
2025+
;
2026+
; GFX12-LABEL: name: v_add_co_u32_e64_sgpr_fi_clobbered_register
2027+
; GFX12: liveins: $sgpr2_sgpr3, $sgpr4_sgpr5_sgpr6_sgpr7:0x000000000000003C
2028+
; GFX12-NEXT: {{ $}}
2029+
; GFX12-NEXT: renamable $sgpr0 = S_LSHL_B32 renamable $sgpr6, 2, implicit-def dead $scc
2030+
; GFX12-NEXT: renamable $vgpr0, dead renamable $vcc = V_ADD_CO_U32_e64 32768, killed $sgpr0, 0, implicit $exec
2031+
; GFX12-NEXT: renamable $vgpr0 = BUFFER_LOAD_DWORD_OFFEN killed renamable $vgpr0, $sgpr96_sgpr97_sgpr98_sgpr99, 0, 0, 0, 0, implicit $exec :: (load (s32), addrspace 5)
2032+
; GFX12-NEXT: S_ENDPGM 0
2033+
renamable $sgpr0 = S_LSHL_B32 renamable $sgpr6, 2, implicit-def dead $scc
2034+
renamable $vgpr0, dead renamable $vcc = V_ADD_CO_U32_e64 %stack.1, killed $sgpr0, 0, implicit $exec
2035+
renamable $vgpr0 = BUFFER_LOAD_DWORD_OFFEN killed renamable $vgpr0, $sgpr96_sgpr97_sgpr98_sgpr99, 0, 0, 0, 0, implicit $exec :: (load (s32), addrspace 5)
2036+
S_ENDPGM 0
2037+
2038+
...

llvm/test/CodeGen/AMDGPU/eliminate-frame-index-v-add-u32.mir

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1220,9 +1220,8 @@ body: |
12201220
; MUBUF-NEXT: {{ $}}
12211221
; MUBUF-NEXT: $sgpr0 = S_ADD_U32 $sgpr0, $noreg, implicit-def $scc, implicit-def $sgpr0_sgpr1_sgpr2_sgpr3
12221222
; MUBUF-NEXT: $sgpr1 = S_ADDC_U32 $sgpr1, 0, implicit-def dead $scc, implicit $scc, implicit-def $sgpr0_sgpr1_sgpr2_sgpr3
1223-
; MUBUF-NEXT: $vgpr1 = V_MOV_B32_e32 $sgpr8, implicit $exec
12241223
; MUBUF-NEXT: $vgpr1 = V_MOV_B32_e32 72, implicit $exec
1225-
; MUBUF-NEXT: renamable $vgpr0 = V_ADD_U32_e64 killed $vgpr1, killed $vgpr1, 0, implicit $exec
1224+
; MUBUF-NEXT: renamable $vgpr0 = V_ADD_U32_e64 killed $vgpr1, $sgpr8, 0, implicit $exec
12261225
; MUBUF-NEXT: SI_RETURN implicit $vgpr0, implicit $sgpr8
12271226
;
12281227
; MUBUFW32-LABEL: name: v_add_u32_e64__kernel_fi_offset72__sgpr_live_after
@@ -1236,9 +1235,8 @@ body: |
12361235
; FLATSCRW64-LABEL: name: v_add_u32_e64__kernel_fi_offset72__sgpr_live_after
12371236
; FLATSCRW64: liveins: $sgpr8
12381237
; FLATSCRW64-NEXT: {{ $}}
1239-
; FLATSCRW64-NEXT: $vgpr1 = V_MOV_B32_e32 $sgpr8, implicit $exec
12401238
; FLATSCRW64-NEXT: $vgpr1 = V_MOV_B32_e32 72, implicit $exec
1241-
; FLATSCRW64-NEXT: renamable $vgpr0 = V_ADD_U32_e64 killed $vgpr1, killed $vgpr1, 0, implicit $exec
1239+
; FLATSCRW64-NEXT: renamable $vgpr0 = V_ADD_U32_e64 killed $vgpr1, $sgpr8, 0, implicit $exec
12421240
; FLATSCRW64-NEXT: SI_RETURN implicit $vgpr0, implicit $sgpr8
12431241
;
12441242
; FLATSCRW32-LABEL: name: v_add_u32_e64__kernel_fi_offset72__sgpr_live_after

0 commit comments

Comments
 (0)