Skip to content

Commit aac8eb8

Browse files
authored
AMDGPU: Fixes for regbankselecting copies of i1 physregs to sgprs (llvm#159283)
If the source register of a copy was a physical sgpr copied to an s1 value, this would assert.
1 parent 17e008d commit aac8eb8

File tree

2 files changed

+296
-42
lines changed

2 files changed

+296
-42
lines changed

llvm/lib/Target/AMDGPU/AMDGPURegisterBankInfo.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3845,21 +3845,27 @@ AMDGPURegisterBankInfo::getInstrMapping(const MachineInstr &MI) const {
38453845
// want the most straightforward mapping, so just directly handle this.
38463846
const RegisterBank *DstBank = getRegBank(DstReg, MRI, *TRI);
38473847
const RegisterBank *SrcBank = getRegBank(SrcReg, MRI, *TRI);
3848-
assert(SrcBank && "src bank should have been assigned already");
38493848

38503849
// For COPY between a physical reg and an s1, there is no type associated so
38513850
// we need to take the virtual register's type as a hint on how to interpret
38523851
// s1 values.
3852+
unsigned Size;
38533853
if (!SrcReg.isVirtual() && !DstBank &&
3854-
MRI.getType(DstReg) == LLT::scalar(1))
3854+
MRI.getType(DstReg) == LLT::scalar(1)) {
38553855
DstBank = &AMDGPU::VCCRegBank;
3856-
else if (!DstReg.isVirtual() && MRI.getType(SrcReg) == LLT::scalar(1))
3856+
Size = 1;
3857+
} else if (!DstReg.isVirtual() && MRI.getType(SrcReg) == LLT::scalar(1)) {
38573858
DstBank = &AMDGPU::VCCRegBank;
3859+
Size = 1;
3860+
} else {
3861+
Size = getSizeInBits(DstReg, MRI, *TRI);
3862+
}
38583863

38593864
if (!DstBank)
38603865
DstBank = SrcBank;
3866+
else if (!SrcBank)
3867+
SrcBank = DstBank;
38613868

3862-
unsigned Size = getSizeInBits(DstReg, MRI, *TRI);
38633869
if (MI.getOpcode() != AMDGPU::G_FREEZE &&
38643870
cannotCopy(*DstBank, *SrcBank, TypeSize::getFixed(Size)))
38653871
return getInvalidInstructionMapping();

0 commit comments

Comments
 (0)