Index: lib/Target/AMDGPU/SIInstrInfo.cpp =================================================================== --- lib/Target/AMDGPU/SIInstrInfo.cpp +++ lib/Target/AMDGPU/SIInstrInfo.cpp @@ -379,7 +379,8 @@ return; } - if (RC == &AMDGPU::SReg_64RegClass) { + if (RC == &AMDGPU::SReg_64_XEXECRegClass || + RC == &AMDGPU::SReg_64RegClass) { if (DestReg == AMDGPU::VCC) { if (AMDGPU::SReg_64RegClass.contains(SrcReg)) { BuildMI(MBB, MI, DL, get(AMDGPU::S_MOV_B64), AMDGPU::VCC) @@ -540,9 +541,18 @@ // The SGPR spill/restore instructions only work on number sgprs, so we need // to make sure we are using the correct register class. - if (TargetRegisterInfo::isVirtualRegister(SrcReg) && RC->getSize() == 4) { + if (TargetRegisterInfo::isVirtualRegister(SrcReg)) { + unsigned Size = RC->getSize(); MachineRegisterInfo &MRI = MF->getRegInfo(); - MRI.constrainRegClass(SrcReg, &AMDGPU::SReg_32_XM0RegClass); + + switch (Size) { + case 4: + MRI.constrainRegClass(SrcReg, &AMDGPU::SReg_32_XM0RegClass); + break; + case 8: + MRI.constrainRegClass(SrcReg, &AMDGPU::SReg_64_XEXECRegClass); + break; + } } MachineInstrBuilder Spill = BuildMI(MBB, MI, DL, OpDesc) @@ -644,9 +654,18 @@ // FIXME: Maybe this should not include a memoperand because it will be // lowered to non-memory instructions. const MCInstrDesc &OpDesc = get(getSGPRSpillRestoreOpcode(RC->getSize())); - if (TargetRegisterInfo::isVirtualRegister(DestReg) && RC->getSize() == 4) { + if (TargetRegisterInfo::isVirtualRegister(DestReg)) { + unsigned Size = RC->getSize(); MachineRegisterInfo &MRI = MF->getRegInfo(); - MRI.constrainRegClass(DestReg, &AMDGPU::SReg_32_XM0RegClass); + + switch (Size) { + case 4: + MRI.constrainRegClass(DestReg, &AMDGPU::SReg_32_XM0RegClass); + break; + case 8: + MRI.constrainRegClass(DestReg, &AMDGPU::SReg_64_XEXECRegClass); + break; + } } MachineInstrBuilder Spill = BuildMI(MBB, MI, DL, OpDesc, DestReg) Index: lib/Target/AMDGPU/SIInstructions.td =================================================================== --- lib/Target/AMDGPU/SIInstructions.td +++ lib/Target/AMDGPU/SIInstructions.td @@ -328,7 +328,7 @@ // be able to spill the physical register m0, so allow it for // SI_SPILL_32_* instructions. defm SI_SPILL_S32 : SI_SPILL_SGPR ; -defm SI_SPILL_S64 : SI_SPILL_SGPR ; +defm SI_SPILL_S64 : SI_SPILL_SGPR ; defm SI_SPILL_S128 : SI_SPILL_SGPR ; defm SI_SPILL_S256 : SI_SPILL_SGPR ; defm SI_SPILL_S512 : SI_SPILL_SGPR ; Index: lib/Target/AMDGPU/SIRegisterInfo.td =================================================================== --- lib/Target/AMDGPU/SIRegisterInfo.td +++ lib/Target/AMDGPU/SIRegisterInfo.td @@ -277,8 +277,13 @@ let isAllocatable = 0; } +def SReg_64_XEXEC : RegisterClass<"AMDGPU", [v2i32, i64, f64, i1], 32, + (add SGPR_64, VCC, FLAT_SCR, TTMP_64, TBA, TMA)> { + let AllocationPriority = 2; +} + def SReg_64 : RegisterClass<"AMDGPU", [v2i32, i64, f64, i1], 32, - (add SGPR_64, VCC, EXEC, FLAT_SCR, TTMP_64, TBA, TMA)> { + (add SReg_64_XEXEC, EXEC)> { let AllocationPriority = 2; } Index: lib/Target/AMDGPU/SIWholeQuadMode.cpp =================================================================== --- lib/Target/AMDGPU/SIWholeQuadMode.cpp +++ lib/Target/AMDGPU/SIWholeQuadMode.cpp @@ -676,7 +676,7 @@ MachineBasicBlock::iterator EntryMI = Entry.getFirstNonPHI(); if (GlobalFlags & StateExact || !LiveMaskQueries.empty()) { - LiveMaskReg = MRI->createVirtualRegister(&AMDGPU::SReg_64RegClass); + LiveMaskReg = MRI->createVirtualRegister(&AMDGPU::SReg_64_XEXECRegClass); MachineInstr *MI = BuildMI(Entry, EntryMI, DebugLoc(), TII->get(AMDGPU::COPY), LiveMaskReg) .addReg(AMDGPU::EXEC); Index: lib/Target/AMDGPU/SMInstructions.td =================================================================== --- lib/Target/AMDGPU/SMInstructions.td +++ lib/Target/AMDGPU/SMInstructions.td @@ -182,7 +182,7 @@ >; defm S_STORE_DWORD : SM_Pseudo_Stores <"s_store_dword", SReg_64, SReg_32_XM0>; -defm S_STORE_DWORDX2 : SM_Pseudo_Stores <"s_store_dwordx2", SReg_64, SReg_64>; +defm S_STORE_DWORDX2 : SM_Pseudo_Stores <"s_store_dwordx2", SReg_64, SReg_64_XEXEC>; defm S_STORE_DWORDX4 : SM_Pseudo_Stores <"s_store_dwordx4", SReg_64, SReg_128>; defm S_BUFFER_STORE_DWORD : SM_Pseudo_Stores < Index: lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp =================================================================== --- lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp +++ lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp @@ -363,6 +363,7 @@ case AMDGPU::SGPR_64RegClassID: case AMDGPU::VS_64RegClassID: case AMDGPU::SReg_64RegClassID: + case AMDGPU::SReg_64_XEXECRegClassID: case AMDGPU::VReg_64RegClassID: return 64; case AMDGPU::VReg_96RegClassID: