mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-01 00:33:09 +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,15 +259,18 @@ bool SIFixSGPRCopies::runOnMachineFunction(MachineFunction &MF) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case AMDGPU::INSERT_SUBREG: {
|
case AMDGPU::INSERT_SUBREG: {
|
||||||
const TargetRegisterClass *DstRC, *SrcRC;
|
const TargetRegisterClass *DstRC, *Src0RC, *Src1RC;
|
||||||
DstRC = MRI.getRegClass(MI.getOperand(0).getReg());
|
DstRC = MRI.getRegClass(MI.getOperand(0).getReg());
|
||||||
SrcRC = MRI.getRegClass(MI.getOperand(1).getReg());
|
Src0RC = MRI.getRegClass(MI.getOperand(1).getReg());
|
||||||
if (!TRI->isSGPRClass(DstRC) || !TRI->hasVGPRs(SrcRC))
|
Src1RC = MRI.getRegClass(MI.getOperand(2).getReg());
|
||||||
break;
|
if (TRI->isSGPRClass(DstRC) &&
|
||||||
|
(TRI->hasVGPRs(Src0RC) || TRI->hasVGPRs(Src1RC))) {
|
||||||
DEBUG(dbgs() << " Fixing INSERT_SUBREG:\n");
|
DEBUG(dbgs() << " Fixing INSERT_SUBREG:\n");
|
||||||
DEBUG(MI.print(dbgs()));
|
DEBUG(MI.print(dbgs()));
|
||||||
TII->moveToVALU(MI);
|
TII->moveToVALU(MI);
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -691,6 +691,7 @@ bool SIInstrInfo::canReadVGPR(const MachineInstr &MI, unsigned OpNo) const {
|
|||||||
case AMDGPU::COPY:
|
case AMDGPU::COPY:
|
||||||
case AMDGPU::REG_SEQUENCE:
|
case AMDGPU::REG_SEQUENCE:
|
||||||
case AMDGPU::PHI:
|
case AMDGPU::PHI:
|
||||||
|
case AMDGPU::INSERT_SUBREG:
|
||||||
return RI.hasVGPRs(getOpRegClass(MI, 0));
|
return RI.hasVGPRs(getOpRegClass(MI, 0));
|
||||||
default:
|
default:
|
||||||
return RI.hasVGPRs(getOpRegClass(MI, OpNo));
|
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
|
// Legalize MUBUF* instructions
|
||||||
// FIXME: If we start using the non-addr64 instructions for compute, we
|
// FIXME: If we start using the non-addr64 instructions for compute, we
|
||||||
// may need to legalize them here.
|
// may need to legalize them here.
|
||||||
|
Loading…
Reference in New Issue
Block a user