summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/AMDGPU/GCNHazardRecognizer.cpp
diff options
context:
space:
mode:
authorTom Stellard <thomas.stellard@amd.com>2016-10-27 20:39:09 +0000
committerTom Stellard <thomas.stellard@amd.com>2016-10-27 20:39:09 +0000
commit30d30824b4087b1716e5b6dbe2480029793a336f (patch)
tree873eea2de24f0fe479e1f066f6759fa53ab65b06 /llvm/lib/Target/AMDGPU/GCNHazardRecognizer.cpp
parentaf67fd1dbd93c34f6ad2f59f977ea47d9b01245c (diff)
downloadbcm5719-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.cpp19
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;
+}
OpenPOWER on IntegriCloud