mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-28 19:31:58 +00:00
R600/SI: Fix a bug with handling of INSERT_SUBREG in SIFixSGPRCopies
This prevents a future commit from regressing the load-i1.ll test. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@208887 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c1de569ce8
commit
704fe35d88
@ -259,14 +259,17 @@ bool SIFixSGPRCopies::runOnMachineFunction(MachineFunction &MF) {
|
||||
break;
|
||||
}
|
||||
case AMDGPU::INSERT_SUBREG: {
|
||||
const TargetRegisterClass *DstRC, *SrcRC;
|
||||
const TargetRegisterClass *DstRC, *Src0RC, *Src1RC;
|
||||
DstRC = MRI.getRegClass(MI.getOperand(0).getReg());
|
||||
SrcRC = MRI.getRegClass(MI.getOperand(1).getReg());
|
||||
if (!TRI->isSGPRClass(DstRC) || !TRI->hasVGPRs(SrcRC))
|
||||
break;
|
||||
DEBUG(dbgs() << " Fixing INSERT_SUBREG:\n");
|
||||
DEBUG(MI.print(dbgs()));
|
||||
TII->moveToVALU(MI);
|
||||
Src0RC = MRI.getRegClass(MI.getOperand(1).getReg());
|
||||
Src1RC = MRI.getRegClass(MI.getOperand(2).getReg());
|
||||
if (TRI->isSGPRClass(DstRC) &&
|
||||
(TRI->hasVGPRs(Src0RC) || TRI->hasVGPRs(Src1RC))) {
|
||||
DEBUG(dbgs() << " Fixing INSERT_SUBREG:\n");
|
||||
DEBUG(MI.print(dbgs()));
|
||||
TII->moveToVALU(MI);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -691,6 +691,7 @@ bool SIInstrInfo::canReadVGPR(const MachineInstr &MI, unsigned OpNo) const {
|
||||
case AMDGPU::COPY:
|
||||
case AMDGPU::REG_SEQUENCE:
|
||||
case AMDGPU::PHI:
|
||||
case AMDGPU::INSERT_SUBREG:
|
||||
return RI.hasVGPRs(getOpRegClass(MI, 0));
|
||||
default:
|
||||
return RI.hasVGPRs(getOpRegClass(MI, OpNo));
|
||||
@ -924,6 +925,23 @@ void SIInstrInfo::legalizeOperands(MachineInstr *MI) const {
|
||||
}
|
||||
}
|
||||
|
||||
// Legalize INSERT_SUBREG
|
||||
// src0 must have the same register class as dst
|
||||
if (MI->getOpcode() == AMDGPU::INSERT_SUBREG) {
|
||||
unsigned Dst = MI->getOperand(0).getReg();
|
||||
unsigned Src0 = MI->getOperand(1).getReg();
|
||||
const TargetRegisterClass *DstRC = MRI.getRegClass(Dst);
|
||||
const TargetRegisterClass *Src0RC = MRI.getRegClass(Src0);
|
||||
if (DstRC != Src0RC) {
|
||||
MachineBasicBlock &MBB = *MI->getParent();
|
||||
unsigned NewSrc0 = MRI.createVirtualRegister(DstRC);
|
||||
BuildMI(MBB, MI, MI->getDebugLoc(), get(AMDGPU::COPY), NewSrc0)
|
||||
.addReg(Src0);
|
||||
MI->getOperand(1).setReg(NewSrc0);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Legalize MUBUF* instructions
|
||||
// FIXME: If we start using the non-addr64 instructions for compute, we
|
||||
// may need to legalize them here.
|
||||
|
Loading…
Reference in New Issue
Block a user