Index: lib/Target/AMDGPU/SIRegisterInfo.h =================================================================== --- lib/Target/AMDGPU/SIRegisterInfo.h +++ lib/Target/AMDGPU/SIRegisterInfo.h @@ -24,7 +24,11 @@ struct SIRegisterInfo : public AMDGPURegisterInfo { private: + BitVector SGPRPressureSets; + BitVector VGPRPressureSets; void reserveRegisterTuples(BitVector &, unsigned Reg) const; + void classifyPressureSet(unsigned PSetID, unsigned Reg, + BitVector &PressureSets) const; public: SIRegisterInfo(); Index: lib/Target/AMDGPU/SIRegisterInfo.cpp =================================================================== --- lib/Target/AMDGPU/SIRegisterInfo.cpp +++ lib/Target/AMDGPU/SIRegisterInfo.cpp @@ -23,7 +23,35 @@ using namespace llvm; -SIRegisterInfo::SIRegisterInfo() : AMDGPURegisterInfo() {} +static bool hasPressureSet(const int *PSets, unsigned PSetID) { + for (unsigned i = 0; PSets[i] != -1; ++i) { + if (PSets[i] == (int)PSetID) + return true; + } + return false; +} + +void SIRegisterInfo::classifyPressureSet(unsigned PSetID, unsigned Reg, + BitVector &PressureSets) const { + for (MCRegUnitIterator U(Reg, this); U.isValid(); ++U) { + const int *PSets = getRegUnitPressureSets(*U); + if (hasPressureSet(PSets, PSetID)) { + PressureSets.set(PSetID); + break; + } + } +} + +SIRegisterInfo::SIRegisterInfo() : AMDGPURegisterInfo(), + SGPRPressureSets(getNumRegPressureSets()), + VGPRPressureSets(getNumRegPressureSets()) { + + for (unsigned PSetID = 0, NumPSets = getNumRegPressureSets(); + PSetID != NumPSets; ++PSetID) { + classifyPressureSet(PSetID, AMDGPU::SGPR0, SGPRPressureSets); + classifyPressureSet(PSetID, AMDGPU::VGPR0, VGPRPressureSets); + } +} void SIRegisterInfo::reserveRegisterTuples(BitVector &Reserved, unsigned Reg) const { MCRegAliasIterator R(Reg, this, true); @@ -81,31 +109,16 @@ unsigned VSLimit = SGPRLimit + VGPRLimit; - for (regclass_iterator I = regclass_begin(), E = regclass_end(); - I != E; ++I) { - const TargetRegisterClass *RC = *I; - - unsigned NumSubRegs = std::max((int)RC->getSize() / 4, 1); - unsigned Limit; - - if (isPseudoRegClass(RC)) { - // FIXME: This is a hack. We should never be considering the pressure of - // these since no virtual register should ever have this class. - Limit = VSLimit; - } else if (isSGPRClass(RC)) { - Limit = SGPRLimit / NumSubRegs; - } else { - Limit = VGPRLimit / NumSubRegs; - } - - const int *Sets = getRegClassPressureSets(RC); - assert(Sets); - for (unsigned i = 0; Sets[i] != -1; ++i) { - if (Sets[i] == (int)Idx) - return Limit; - } + if (SGPRPressureSets.test(Idx) && VGPRPressureSets.test(Idx)) { + // FIXME: This is a hack. We should never be considering the pressure of + // these since no virtual register should ever have this class. + return VSLimit; } - return 256; + + if (SGPRPressureSets.test(Idx)) + return SGPRLimit; + + return VGPRLimit; } bool SIRegisterInfo::requiresRegisterScavenging(const MachineFunction &Fn) const {