summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/AMDGPU/GCNHazardRecognizer.cpp
diff options
context:
space:
mode:
authorConnor Abbott <cwabbott0@gmail.com>2017-08-04 01:09:43 +0000
committerConnor Abbott <cwabbott0@gmail.com>2017-08-04 01:09:43 +0000
commit00755362b9cd830a46446cf362b4ecb283ebb179 (patch)
tree49a1028d09a35b86c133831534df5ed640c65be0 /llvm/lib/Target/AMDGPU/GCNHazardRecognizer.cpp
parent846b985a92cb816dbf22637e98b7d6e726cf4acf (diff)
downloadbcm5719-llvm-00755362b9cd830a46446cf362b4ecb283ebb179.tar.gz
bcm5719-llvm-00755362b9cd830a46446cf362b4ecb283ebb179.zip
[AMDGPU] Add missing hazard for DPP-after-EXEC-write
Summary: Following the docs, we need at least 5 wait states between an EXEC write and an instruction that uses DPP. Reviewers: tstellar, arsenm Subscribers: kzhuravl, wdng, nhaehnle, yaxunl, dstuttard, tpr, t-tye, llvm-commits Differential Revision: https://reviews.llvm.org/D34849 llvm-svn: 310013
Diffstat (limited to 'llvm/lib/Target/AMDGPU/GCNHazardRecognizer.cpp')
-rw-r--r--llvm/lib/Target/AMDGPU/GCNHazardRecognizer.cpp9
1 files changed, 8 insertions, 1 deletions
diff --git a/llvm/lib/Target/AMDGPU/GCNHazardRecognizer.cpp b/llvm/lib/Target/AMDGPU/GCNHazardRecognizer.cpp
index cd9e7fb04f1..b601cfeded1 100644
--- a/llvm/lib/Target/AMDGPU/GCNHazardRecognizer.cpp
+++ b/llvm/lib/Target/AMDGPU/GCNHazardRecognizer.cpp
@@ -367,10 +367,13 @@ int GCNHazardRecognizer::checkVMEMHazards(MachineInstr* VMEM) {
int GCNHazardRecognizer::checkDPPHazards(MachineInstr *DPP) {
const SIRegisterInfo *TRI = ST.getRegisterInfo();
+ const SIInstrInfo *TII = ST.getInstrInfo();
- // Check for DPP VGPR read after VALU VGPR write.
+ // Check for DPP VGPR read after VALU VGPR write and EXEC write.
int DppVgprWaitStates = 2;
+ int DppExecWaitStates = 5;
int WaitStatesNeeded = 0;
+ auto IsHazardDefFn = [TII] (MachineInstr *MI) { return TII->isVALU(*MI); };
for (const MachineOperand &Use : DPP->uses()) {
if (!Use.isReg() || !TRI->isVGPR(MF.getRegInfo(), Use.getReg()))
@@ -380,6 +383,10 @@ int GCNHazardRecognizer::checkDPPHazards(MachineInstr *DPP) {
WaitStatesNeeded = std::max(WaitStatesNeeded, WaitStatesNeededForUse);
}
+ WaitStatesNeeded = std::max(
+ WaitStatesNeeded,
+ DppExecWaitStates - getWaitStatesSinceDef(AMDGPU::EXEC, IsHazardDefFn));
+
return WaitStatesNeeded;
}
OpenPOWER on IntegriCloud