Index: lib/Target/AMDGPU/AMDGPUAsmPrinter.h =================================================================== --- lib/Target/AMDGPU/AMDGPUAsmPrinter.h +++ lib/Target/AMDGPU/AMDGPUAsmPrinter.h @@ -69,7 +69,10 @@ uint32_t LDSSize; bool FlatUsed; + // If ReservedVGPRCount is 0 then must be 0. Otherwise, this is the first + // fixed VGPR number reserved. uint16_t ReservedVGPRFirst; + // The number of consecutive VGPRs reserved. uint16_t ReservedVGPRCount; // Bonus information for debugging. Index: lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp =================================================================== --- lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp +++ lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp @@ -478,11 +478,11 @@ MaxSGPR += ExtraSGPRs; // Update necessary Reserved* fields and max VGPRs used if - // "amdgpu-debugger-reserved-trap-regs" was specified. + // "amdgpu-debugger-reserve-trap-regs" attribute was specified. if (STM.debuggerReserveTrapVGPRs()) { ProgInfo.ReservedVGPRFirst = MaxVGPR + 1; - ProgInfo.ReservedVGPRCount = STM.debuggerReserveTrapVGPRCount(); - MaxVGPR += STM.debuggerReserveTrapVGPRCount(); + ProgInfo.ReservedVGPRCount = MFI->getDebuggerReserveTrapVGPRCount(); + MaxVGPR += MFI->getDebuggerReserveTrapVGPRCount(); } // We found the maximum register index. They start at 0, so add one to get the Index: lib/Target/AMDGPU/AMDGPUSubtarget.h =================================================================== --- lib/Target/AMDGPU/AMDGPUSubtarget.h +++ lib/Target/AMDGPU/AMDGPUSubtarget.h @@ -314,10 +314,6 @@ return DebuggerReserveTrapVGPRs; } - unsigned debuggerReserveTrapVGPRCount() const { - return debuggerReserveTrapVGPRs() ? 4 : 0; - } - bool dumpCode() const { return DumpCode; } Index: lib/Target/AMDGPU/SIMachineFunctionInfo.h =================================================================== --- lib/Target/AMDGPU/SIMachineFunctionInfo.h +++ lib/Target/AMDGPU/SIMachineFunctionInfo.h @@ -62,6 +62,9 @@ unsigned MaximumWorkGroupSize; + // Number of reserved VGPRs for trap handler usage. + unsigned DebuggerReserveTrapVGPRCount; + public: // FIXME: Make private unsigned LDSWaveSpillSize; @@ -326,6 +329,10 @@ ReturnsVoid = Value; } + unsigned getDebuggerReserveTrapVGPRCount() const { + return DebuggerReserveTrapVGPRCount; + } + unsigned getMaximumWorkGroupSize(const MachineFunction &MF) const; }; Index: lib/Target/AMDGPU/SIMachineFunctionInfo.cpp =================================================================== --- lib/Target/AMDGPU/SIMachineFunctionInfo.cpp +++ lib/Target/AMDGPU/SIMachineFunctionInfo.cpp @@ -49,6 +49,7 @@ PSInputAddr(0), ReturnsVoid(true), MaximumWorkGroupSize(0), + DebuggerReserveTrapVGPRCount(0), LDSWaveSpillSize(0), PSInputEna(0), NumUserSGPRs(0), @@ -132,6 +133,9 @@ MaximumWorkGroupSize = AMDGPU::getMaximumWorkGroupSize(*F); else MaximumWorkGroupSize = ST.getWavefrontSize(); + + if (ST.debuggerReserveTrapVGPRs()) + DebuggerReserveTrapVGPRCount = 4; } unsigned SIMachineFunctionInfo::addPrivateSegmentBuffer( Index: lib/Target/AMDGPU/SIRegisterInfo.cpp =================================================================== --- lib/Target/AMDGPU/SIRegisterInfo.cpp +++ lib/Target/AMDGPU/SIRegisterInfo.cpp @@ -197,8 +197,9 @@ // attribute was specified. const AMDGPUSubtarget &ST = MF.getSubtarget(); if (ST.debuggerReserveTrapVGPRs()) { - for (unsigned i = MaxWorkGroupVGPRCount - ST.debuggerReserveTrapVGPRCount(); - i < MaxWorkGroupVGPRCount; ++i) { + unsigned ReservedVGPRFirst = + MaxWorkGroupVGPRCount - MFI->getDebuggerReserveTrapVGPRCount(); + for (unsigned i = ReservedVGPRFirst; i < MaxWorkGroupVGPRCount; ++i) { unsigned Reg = AMDGPU::VGPR_32RegClass.getRegister(i); reserveRegisterTuples(Reserved, Reg); }