diff options
author | Tom Stellard <thomas.stellard@amd.com> | 2016-10-27 20:39:09 +0000 |
---|---|---|
committer | Tom Stellard <thomas.stellard@amd.com> | 2016-10-27 20:39:09 +0000 |
commit | 30d30824b4087b1716e5b6dbe2480029793a336f (patch) | |
tree | 873eea2de24f0fe479e1f066f6759fa53ab65b06 /llvm/lib/Target/AMDGPU/GCNHazardRecognizer.cpp | |
parent | af67fd1dbd93c34f6ad2f59f977ea47d9b01245c (diff) | |
download | bcm5719-llvm-30d30824b4087b1716e5b6dbe2480029793a336f.tar.gz bcm5719-llvm-30d30824b4087b1716e5b6dbe2480029793a336f.zip |
AMDGPU/SI: Handle s_setreg hazard in GCNHazardRecognizer
Reviewers: arsenm
Subscribers: kzhuravl, wdng, nhaehnle, yaxunl, llvm-commits, tony-tye
Differential Revision: https://reviews.llvm.org/D25528
llvm-svn: 285338
Diffstat (limited to 'llvm/lib/Target/AMDGPU/GCNHazardRecognizer.cpp')
-rw-r--r-- | llvm/lib/Target/AMDGPU/GCNHazardRecognizer.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/llvm/lib/Target/AMDGPU/GCNHazardRecognizer.cpp b/llvm/lib/Target/AMDGPU/GCNHazardRecognizer.cpp index 9e9f1904b26..100ea7e9a2d 100644 --- a/llvm/lib/Target/AMDGPU/GCNHazardRecognizer.cpp +++ b/llvm/lib/Target/AMDGPU/GCNHazardRecognizer.cpp @@ -76,6 +76,9 @@ GCNHazardRecognizer::getHazardType(SUnit *SU, int Stalls) { if (isSGetReg(MI->getOpcode()) && checkGetRegHazards(MI) > 0) return NoopHazard; + if (isSSetReg(MI->getOpcode()) && checkSetRegHazards(MI) > 0) + return NoopHazard; + return NoHazard; } @@ -99,6 +102,9 @@ unsigned GCNHazardRecognizer::PreEmitNoops(MachineInstr *MI) { if (isSGetReg(MI->getOpcode())) return std::max(0, checkGetRegHazards(MI)); + if (isSSetReg(MI->getOpcode())) + return std::max(0, checkSetRegHazards(MI)); + return 0; } @@ -331,3 +337,16 @@ int GCNHazardRecognizer::checkGetRegHazards(MachineInstr *GetRegInstr) { return GetRegWaitStates - WaitStatesNeeded; } + +int GCNHazardRecognizer::checkSetRegHazards(MachineInstr *SetRegInstr) { + const SIInstrInfo *TII = ST.getInstrInfo(); + unsigned HWReg = getHWReg(TII, *SetRegInstr); + + const int SetRegWaitStates = + ST.getGeneration() <= AMDGPUSubtarget::SEA_ISLANDS ? 1 : 2; + auto IsHazardFn = [TII, HWReg] (MachineInstr *MI) { + return HWReg == getHWReg(TII, *MI); + }; + int WaitStatesNeeded = getWaitStatesSinceSetReg(IsHazardFn); + return SetRegWaitStates - WaitStatesNeeded; +} |