diff options
| author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2016-05-18 23:35:53 +0000 |
|---|---|---|
| committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2016-05-18 23:35:53 +0000 |
| commit | c5bebac934d8455039b21e3fb1f5c58192585ae7 (patch) | |
| tree | 7f4f667b0bebcab420f0c09ee92a189151c0be45 /llvm/lib/Target/AMDGPU/SIRegisterInfo.cpp | |
| parent | 23b8937536214986715868c93582cfc9825fa594 (diff) | |
| download | bcm5719-llvm-c5bebac934d8455039b21e3fb1f5c58192585ae7.tar.gz bcm5719-llvm-c5bebac934d8455039b21e3fb1f5c58192585ae7.zip | |
AMDGPU: Fix verifier error when spilling undef subreg
llvm-svn: 270002
Diffstat (limited to 'llvm/lib/Target/AMDGPU/SIRegisterInfo.cpp')
| -rw-r--r-- | llvm/lib/Target/AMDGPU/SIRegisterInfo.cpp | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/llvm/lib/Target/AMDGPU/SIRegisterInfo.cpp b/llvm/lib/Target/AMDGPU/SIRegisterInfo.cpp index ac569d967c1..ee371177494 100644 --- a/llvm/lib/Target/AMDGPU/SIRegisterInfo.cpp +++ b/llvm/lib/Target/AMDGPU/SIRegisterInfo.cpp @@ -505,9 +505,11 @@ void SIRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator MI, unsigned NumSubRegs = getNumSubRegsForSpillOp(MI->getOpcode()); unsigned TmpReg = MRI.createVirtualRegister(&AMDGPU::VGPR_32RegClass); + unsigned SuperReg = MI->getOperand(0).getReg(); for (unsigned i = 0, e = NumSubRegs; i < e; ++i) { - unsigned SubReg = getPhysRegSubReg(MI->getOperand(0).getReg(), + unsigned SubReg = getPhysRegSubReg(SuperReg, &AMDGPU::SGPR_32RegClass, i); + struct SIMachineFunctionInfo::SpilledReg Spill = MFI->getSpilledReg(MF, Index, i); @@ -524,8 +526,14 @@ void SIRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator MI, } else { // Spill SGPR to a frame index. // FIXME we should use S_STORE_DWORD here for VI. - BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_MOV_B32_e32), TmpReg) - .addReg(SubReg); + MachineInstrBuilder Mov + = BuildMI(*MBB, MI, DL, TII->get(AMDGPU::V_MOV_B32_e32), TmpReg) + .addReg(SubReg); + + // There could be undef components of a spilled super register. + // TODO: Can we detect this and skip the spill? + if (NumSubRegs > 1) + Mov.addReg(SuperReg, RegState::Implicit); unsigned Size = FrameInfo->getObjectSize(Index); unsigned Align = FrameInfo->getObjectAlignment(Index); |

