diff options
Diffstat (limited to 'llvm/lib/Target/AMDGPU/GCNSchedStrategy.cpp')
| -rw-r--r-- | llvm/lib/Target/AMDGPU/GCNSchedStrategy.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/llvm/lib/Target/AMDGPU/GCNSchedStrategy.cpp b/llvm/lib/Target/AMDGPU/GCNSchedStrategy.cpp index 254b75b784e7..ae553da22e50 100644 --- a/llvm/lib/Target/AMDGPU/GCNSchedStrategy.cpp +++ b/llvm/lib/Target/AMDGPU/GCNSchedStrategy.cpp @@ -1150,6 +1150,40 @@ void UnclusteredHighRPStage::finalizeGCNSchedStage() { GCNSchedStage::finalizeGCNSchedStage(); } +bool ILPInitialScheduleStage::initGCNSchedStage() { + if (!GCNSchedStage::initGCNSchedStage()) + return false; + + const SIInstrInfo *TII = ST.getInstrInfo(); + OriginalLoadLatencyScaleFactor = TII->getLoadLatencyScaleFactor(); + OriginalDSReadLatencyScaleFactor = TII->getDSReadLatencyScaleFactor(); + OriginalVMEMLoadLatencyScaleFactor = TII->getVMEMLoadLatencyScaleFactor(); + const unsigned ILPLoadLatencyScaleFactorDefault = 300; + if (ILPLoadLatencyScaleFactorDefault > TII->getLoadLatencyScaleFactor()) + TII->setLoadLatencyScaleFactor(ILPLoadLatencyScaleFactorDefault); + if (ILPLoadLatencyScaleFactorDefault > TII->getDSReadLatencyScaleFactor()) + TII->setDSReadLatencyScaleFactor(ILPLoadLatencyScaleFactorDefault); + if (ILPLoadLatencyScaleFactorDefault > TII->getVMEMLoadLatencyScaleFactor()) + TII->setVMEMLoadLatencyScaleFactor(ILPLoadLatencyScaleFactorDefault); + + LLVM_DEBUG(dbgs() << "ILP Initial Schedule: Set load latency scale factor to " + << TII->getLoadLatencyScaleFactor() << '\n'); + return true; +} + +void ILPInitialScheduleStage::finalizeGCNSchedStage() { + const SIInstrInfo *TII = ST.getInstrInfo(); + TII->setLoadLatencyScaleFactor(OriginalLoadLatencyScaleFactor); + TII->setDSReadLatencyScaleFactor(OriginalDSReadLatencyScaleFactor); + TII->setVMEMLoadLatencyScaleFactor(OriginalVMEMLoadLatencyScaleFactor); + + LLVM_DEBUG( + dbgs() << "ILP Initial Schedule: Restored load latency scale factor to " + << OriginalLoadLatencyScaleFactor << "\n"); + + GCNSchedStage::finalizeGCNSchedStage(); +} + bool GCNSchedStage::initGCNRegion() { // Check whether this new region is also a new block. if (DAG.RegionBegin->getParent() != CurrentMBB) |
