Index: lib/Target/AMDGPU/GCNSchedStrategy.h =================================================================== --- lib/Target/AMDGPU/GCNSchedStrategy.h +++ lib/Target/AMDGPU/GCNSchedStrategy.h @@ -43,6 +43,9 @@ std::vector Pressure; std::vector MaxPressure; + unsigned SGPRPressureSetID; + unsigned VGPRPressureSetID; + unsigned SGPRExcessLimit; unsigned VGPRExcessLimit; unsigned SGPRCriticalLimit; Index: lib/Target/AMDGPU/GCNSchedStrategy.cpp =================================================================== --- lib/Target/AMDGPU/GCNSchedStrategy.cpp +++ lib/Target/AMDGPU/GCNSchedStrategy.cpp @@ -34,6 +34,9 @@ MF = &DAG->MF; + SGPRPressureSetID = SRI->getSGPRPressureSet(); + VGPRPressureSetID = SRI->getVGPRPressureSet(); + const GCNSubtarget &ST = MF->getSubtarget(); // FIXME: This is also necessary, because some passes that run after @@ -48,10 +51,8 @@ SGPRCriticalLimit = ST.getMaxNumSGPRs(TargetOccupancy, true); VGPRCriticalLimit = ST.getMaxNumVGPRs(TargetOccupancy); } else { - SGPRCriticalLimit = SRI->getRegPressureSetLimit(DAG->MF, - SRI->getSGPRPressureSet()); - VGPRCriticalLimit = SRI->getRegPressureSetLimit(DAG->MF, - SRI->getVGPRPressureSet()); + SGPRCriticalLimit = SRI->getRegPressureSetLimit(DAG->MF, SGPRPressureSetID); + VGPRCriticalLimit = SRI->getRegPressureSetLimit(DAG->MF, VGPRPressureSetID); } SGPRCriticalLimit -= ErrorMargin; @@ -82,8 +83,8 @@ TempTracker.getUpwardPressure(SU->getInstr(), Pressure, MaxPressure); } - unsigned NewSGPRPressure = Pressure[SRI->getSGPRPressureSet()]; - unsigned NewVGPRPressure = Pressure[SRI->getVGPRPressureSet()]; + unsigned NewSGPRPressure = Pressure[SGPRPressureSetID]; + unsigned NewVGPRPressure = Pressure[VGPRPressureSetID]; // If two instructions increase the pressure of different register sets // by the same amount, the generic scheduler will prefer to schedule the @@ -108,12 +109,12 @@ // marked as RegExcess in tryCandidate() when they are compared with // instructions that increase the register pressure. if (ShouldTrackVGPRs && NewVGPRPressure >= VGPRExcessLimit) { - Cand.RPDelta.Excess = PressureChange(SRI->getVGPRPressureSet()); + Cand.RPDelta.Excess = PressureChange(VGPRPressureSetID); Cand.RPDelta.Excess.setUnitInc(NewVGPRPressure - VGPRExcessLimit); } if (ShouldTrackSGPRs && NewSGPRPressure >= SGPRExcessLimit) { - Cand.RPDelta.Excess = PressureChange(SRI->getSGPRPressureSet()); + Cand.RPDelta.Excess = PressureChange(SGPRPressureSetID); Cand.RPDelta.Excess.setUnitInc(NewSGPRPressure - SGPRExcessLimit); } @@ -127,10 +128,10 @@ if (SGPRDelta >= 0 || VGPRDelta >= 0) { if (SGPRDelta > VGPRDelta) { - Cand.RPDelta.CriticalMax = PressureChange(SRI->getSGPRPressureSet()); + Cand.RPDelta.CriticalMax = PressureChange(SGPRPressureSetID); Cand.RPDelta.CriticalMax.setUnitInc(SGPRDelta); } else { - Cand.RPDelta.CriticalMax = PressureChange(SRI->getVGPRPressureSet()); + Cand.RPDelta.CriticalMax = PressureChange(VGPRPressureSetID); Cand.RPDelta.CriticalMax.setUnitInc(VGPRDelta); } } @@ -144,8 +145,8 @@ SchedCandidate &Cand) { const SIRegisterInfo *SRI = static_cast(TRI); ArrayRef Pressure = RPTracker.getRegSetPressureAtPos(); - unsigned SGPRPressure = Pressure[SRI->getSGPRPressureSet()]; - unsigned VGPRPressure = Pressure[SRI->getVGPRPressureSet()]; + unsigned SGPRPressure = Pressure[SGPRPressureSetID]; + unsigned VGPRPressure = Pressure[VGPRPressureSetID]; ReadyQueue &Q = Zone.Available; for (SUnit *SU : Q) {