diff options
| author | Stanislav Mekhanoshin <Stanislav.Mekhanoshin@amd.com> | 2018-05-12 01:41:56 +0000 |
|---|---|---|
| committer | Stanislav Mekhanoshin <Stanislav.Mekhanoshin@amd.com> | 2018-05-12 01:41:56 +0000 |
| commit | 7012c246c10b456ee0b317b41d04c7addc3eb35b (patch) | |
| tree | 807b339fe611f9e3bf39afda154ccd72e65a4c41 /llvm/lib | |
| parent | 1e6a01fc87164fbcb6d73187ea9e3bd212f2df45 (diff) | |
| download | bcm5719-llvm-7012c246c10b456ee0b317b41d04c7addc3eb35b.tar.gz bcm5719-llvm-7012c246c10b456ee0b317b41d04c7addc3eb35b.zip | |
[AMDGPU] Fix amdgpu-waves-per-eu accounting in scheduler
We cannot query this attribute from a subtarget given a machine function.
At this point attribute itself is already unavailable and can only be
obtained through MFI.
Differential Revision: https://reviews.llvm.org/D46781
llvm-svn: 332166
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/AMDGPU/GCNIterativeScheduler.cpp | 3 | ||||
| -rw-r--r-- | llvm/lib/Target/AMDGPU/GCNSchedStrategy.cpp | 7 |
2 files changed, 7 insertions, 3 deletions
diff --git a/llvm/lib/Target/AMDGPU/GCNIterativeScheduler.cpp b/llvm/lib/Target/AMDGPU/GCNIterativeScheduler.cpp index bf8413921d4..182ce1e4f63 100644 --- a/llvm/lib/Target/AMDGPU/GCNIterativeScheduler.cpp +++ b/llvm/lib/Target/AMDGPU/GCNIterativeScheduler.cpp @@ -566,8 +566,9 @@ void GCNIterativeScheduler::scheduleMinReg(bool force) { void GCNIterativeScheduler::scheduleILP( bool TryMaximizeOccupancy) { const auto &ST = MF.getSubtarget<SISubtarget>(); + const SIMachineFunctionInfo *MFI = MF.getInfo<SIMachineFunctionInfo>(); auto TgtOcc = std::min(ST.getOccupancyWithLocalMemSize(MF), - ST.getWavesPerEU(MF.getFunction()).second); + MFI->getMaxWavesPerEU()); sortRegionsByPressure(TgtOcc); auto Occ = Regions.front()->MaxPressure.getOccupancy(ST); diff --git a/llvm/lib/Target/AMDGPU/GCNSchedStrategy.cpp b/llvm/lib/Target/AMDGPU/GCNSchedStrategy.cpp index f92788ebaa7..12305446fa4 100644 --- a/llvm/lib/Target/AMDGPU/GCNSchedStrategy.cpp +++ b/llvm/lib/Target/AMDGPU/GCNSchedStrategy.cpp @@ -314,8 +314,9 @@ GCNScheduleDAGMILive::GCNScheduleDAGMILive(MachineSchedContext *C, ScheduleDAGMILive(C, std::move(S)), ST(MF.getSubtarget<SISubtarget>()), MFI(*MF.getInfo<SIMachineFunctionInfo>()), - StartingOccupancy(ST.getOccupancyWithLocalMemSize(MFI.getLDSSize(), - MF.getFunction())), + StartingOccupancy(std::min(ST.getOccupancyWithLocalMemSize(MFI.getLDSSize(), + MF.getFunction()), + MFI.getMaxWavesPerEU())), MinOccupancy(StartingOccupancy), Stage(0), RegionIdx(0) { DEBUG(dbgs() << "Starting occupancy is " << StartingOccupancy << ".\n"); @@ -368,6 +369,8 @@ void GCNScheduleDAGMILive::schedule() { PressureAfter.getVGPRNum(), MF); unsigned WavesBefore = getMaxWaves(PressureBefore.getSGPRNum(), PressureBefore.getVGPRNum(), MF); + WavesAfter = std::min(WavesAfter, MFI.getMaxWavesPerEU()); + WavesBefore = std::min(WavesBefore, MFI.getMaxWavesPerEU()); DEBUG(dbgs() << "Occupancy before scheduling: " << WavesBefore << ", after " << WavesAfter << ".\n"); |

