mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-21 03:29:40 +00:00
R600/SI: Move kill flag to second instruction when splitting SMRD
This fixes a machine verifier error in the salu-to-valu.ll, which would have been exposed by a future commit. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@231796 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
92811fa2c7
commit
c2e1ba5d21
@ -1915,6 +1915,8 @@ void SIInstrInfo::splitSMRD(MachineInstr *MI,
|
||||
|
||||
// The SMRD has an 8-bit offset in dwords on SI and a 20-bit offset in bytes
|
||||
// on VI.
|
||||
|
||||
bool IsKill = SBase->isKill();
|
||||
if (OffOp) {
|
||||
bool isVI = RI.ST.getGeneration() >= AMDGPUSubtarget::VOLCANIC_ISLANDS;
|
||||
unsigned OffScale = isVI ? 1 : 4;
|
||||
@ -1922,7 +1924,9 @@ void SIInstrInfo::splitSMRD(MachineInstr *MI,
|
||||
unsigned LoOffset = OffOp->getImm() * OffScale;
|
||||
unsigned HiOffset = LoOffset + HalfSize;
|
||||
Lo = BuildMI(*MBB, MI, DL, get(HalfImmOp), RegLo)
|
||||
.addOperand(*SBase)
|
||||
// Use addReg instead of addOperand
|
||||
// to make sure kill flag is cleared.
|
||||
.addReg(SBase->getReg(), 0, SBase->getSubReg())
|
||||
.addImm(LoOffset / OffScale);
|
||||
|
||||
if (!isUInt<20>(HiOffset) || (!isVI && !isUInt<8>(HiOffset / OffScale))) {
|
||||
@ -1931,25 +1935,28 @@ void SIInstrInfo::splitSMRD(MachineInstr *MI,
|
||||
BuildMI(*MBB, MI, DL, get(AMDGPU::S_MOV_B32), OffsetSGPR)
|
||||
.addImm(HiOffset); // The offset in register is in bytes.
|
||||
Hi = BuildMI(*MBB, MI, DL, get(HalfSGPROp), RegHi)
|
||||
.addOperand(*SBase)
|
||||
.addReg(SBase->getReg(), getKillRegState(IsKill),
|
||||
SBase->getSubReg())
|
||||
.addReg(OffsetSGPR);
|
||||
} else {
|
||||
Hi = BuildMI(*MBB, MI, DL, get(HalfImmOp), RegHi)
|
||||
.addOperand(*SBase)
|
||||
.addReg(SBase->getReg(), getKillRegState(IsKill),
|
||||
SBase->getSubReg())
|
||||
.addImm(HiOffset / OffScale);
|
||||
}
|
||||
} else {
|
||||
// Handle the _SGPR variant
|
||||
MachineOperand *SOff = getNamedOperand(*MI, AMDGPU::OpName::soff);
|
||||
Lo = BuildMI(*MBB, MI, DL, get(HalfSGPROp), RegLo)
|
||||
.addOperand(*SBase)
|
||||
.addReg(SBase->getReg(), 0, SBase->getSubReg())
|
||||
.addOperand(*SOff);
|
||||
unsigned OffsetSGPR = MRI.createVirtualRegister(&AMDGPU::SReg_32RegClass);
|
||||
BuildMI(*MBB, MI, DL, get(AMDGPU::S_ADD_I32), OffsetSGPR)
|
||||
.addOperand(*SOff)
|
||||
.addImm(HalfSize);
|
||||
Hi = BuildMI(*MBB, MI, DL, get(HalfSGPROp))
|
||||
.addOperand(*SBase)
|
||||
.addReg(SBase->getReg(), getKillRegState(IsKill),
|
||||
SBase->getSubReg())
|
||||
.addReg(OffsetSGPR);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user