diff --git a/llvm/lib/Target/AMDGPU/GCNSchedStrategy.h b/llvm/lib/Target/AMDGPU/GCNSchedStrategy.h --- a/llvm/lib/Target/AMDGPU/GCNSchedStrategy.h +++ b/llvm/lib/Target/AMDGPU/GCNSchedStrategy.h @@ -36,10 +36,10 @@ const RegPressureTracker &RPTracker, SchedCandidate &Cand); - void initCandidate(SchedCandidate &Cand, SUnit *SU, - bool AtTop, const RegPressureTracker &RPTracker, - const SIRegisterInfo *SRI, - unsigned SGPRPressure, unsigned VGPRPressure); + void initRPTracker(SchedCandidate &Cand, SUnit *SU, bool AtTop, + const RegPressureTracker &RPTracker, + const SIRegisterInfo *SRI, unsigned SGPRPressure, + unsigned VGPRPressure); std::vector Pressure; std::vector MaxPressure; diff --git a/llvm/lib/Target/AMDGPU/GCNSchedStrategy.cpp b/llvm/lib/Target/AMDGPU/GCNSchedStrategy.cpp --- a/llvm/lib/Target/AMDGPU/GCNSchedStrategy.cpp +++ b/llvm/lib/Target/AMDGPU/GCNSchedStrategy.cpp @@ -59,14 +59,12 @@ VGPRExcessLimit = std::min(VGPRExcessLimit - ErrorMargin, VGPRExcessLimit); } -void GCNMaxOccupancySchedStrategy::initCandidate(SchedCandidate &Cand, SUnit *SU, - bool AtTop, const RegPressureTracker &RPTracker, - const SIRegisterInfo *SRI, - unsigned SGPRPressure, - unsigned VGPRPressure) { - - Cand.SU = SU; - Cand.AtTop = AtTop; +void GCNMaxOccupancySchedStrategy::initRPTracker( + SchedCandidate &Cand, SUnit *SU, bool AtTop, + const RegPressureTracker &RPTracker, const SIRegisterInfo *SRI, + unsigned SGPRPressure, unsigned VGPRPressure) { + assert(Pressure.size() >= 3 && + "RegSetPressure array is empty at current position!"); // getDownwardPressure() and getUpwardPressure() make temporary changes to // the tracker, so we need to pass those function a non-const copy. @@ -150,14 +148,17 @@ SchedCandidate &Cand) { const SIRegisterInfo *SRI = static_cast(TRI); ArrayRef Pressure = RPTracker.getRegSetPressureAtPos(); - unsigned SGPRPressure = Pressure[AMDGPU::RegisterPressureSets::SReg_32]; - unsigned VGPRPressure = Pressure[AMDGPU::RegisterPressureSets::VGPR_32]; ReadyQueue &Q = Zone.Available; for (SUnit *SU : Q) { - SchedCandidate TryCand(ZonePolicy); - initCandidate(TryCand, SU, Zone.isTop(), RPTracker, SRI, - SGPRPressure, VGPRPressure); + TryCand.SU = SU; + TryCand.AtTop = Zone.isTop(); + + if (!Pressure.empty()) + initRPTracker(TryCand, SU, Zone.isTop(), RPTracker, SRI, + Pressure[AMDGPU::RegisterPressureSets::SReg_32], + Pressure[AMDGPU::RegisterPressureSets::VGPR_32]); + // Pass SchedBoundary only when comparing nodes from the same boundary. SchedBoundary *ZoneArg = Cand.AtTop == TryCand.AtTop ? &Zone : nullptr; GenericScheduler::tryCandidate(Cand, TryCand, ZoneArg);