diff options
author | Tom Stellard <thomas.stellard@amd.com> | 2016-10-27 23:50:21 +0000 |
---|---|---|
committer | Tom Stellard <thomas.stellard@amd.com> | 2016-10-27 23:50:21 +0000 |
commit | aea899e2a097375118e7b1726247015b79df0379 (patch) | |
tree | c1bbf53a0487fe64a7d869aed70ed31571390207 /llvm/lib/Target/AMDGPU/GCNHazardRecognizer.cpp | |
parent | 04051b5fad96e340d6de5a028356530f881b2bcc (diff) | |
download | bcm5719-llvm-aea899e2a097375118e7b1726247015b79df0379.tar.gz bcm5719-llvm-aea899e2a097375118e7b1726247015b79df0379.zip |
AMDGPU/SI: Handle hazard with s_rfe_b64
Reviewers: arsenm
Subscribers: kzhuravl, wdng, nhaehnle, yaxunl, llvm-commits, tony-tye
Differential Revision: https://reviews.llvm.org/D25638
llvm-svn: 285368
Diffstat (limited to 'llvm/lib/Target/AMDGPU/GCNHazardRecognizer.cpp')
-rw-r--r-- | llvm/lib/Target/AMDGPU/GCNHazardRecognizer.cpp | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/llvm/lib/Target/AMDGPU/GCNHazardRecognizer.cpp b/llvm/lib/Target/AMDGPU/GCNHazardRecognizer.cpp index 1df397b918e..70b7b6b2671 100644 --- a/llvm/lib/Target/AMDGPU/GCNHazardRecognizer.cpp +++ b/llvm/lib/Target/AMDGPU/GCNHazardRecognizer.cpp @@ -54,7 +54,11 @@ static bool isRWLane(unsigned Opcode) { return Opcode == AMDGPU::V_READLANE_B32 || Opcode == AMDGPU::V_WRITELANE_B32; } -static bool getHWReg(const SIInstrInfo *TII, const MachineInstr &RegInstr) { +static bool isRFE(unsigned Opcode) { + return Opcode == AMDGPU::S_RFE_B64; +} + +static unsigned getHWReg(const SIInstrInfo *TII, const MachineInstr &RegInstr) { const MachineOperand *RegOp = TII->getNamedOperand(RegInstr, AMDGPU::OpName::simm16); @@ -89,6 +93,9 @@ GCNHazardRecognizer::getHazardType(SUnit *SU, int Stalls) { if (isSSetReg(MI->getOpcode()) && checkSetRegHazards(MI) > 0) return NoopHazard; + if (isRFE(MI->getOpcode()) && checkRFEHazards(MI) > 0) + return NoopHazard; + return NoHazard; } @@ -124,6 +131,9 @@ unsigned GCNHazardRecognizer::PreEmitNoops(MachineInstr *MI) { if (isSSetReg(MI->getOpcode())) return std::max(0, checkSetRegHazards(MI)); + if (isRFE(MI->getOpcode())) + return std::max(0, checkRFEHazards(MI)); + return 0; } @@ -470,3 +480,19 @@ int GCNHazardRecognizer::checkRWLaneHazards(MachineInstr *RWLane) { int WaitStatesSince = getWaitStatesSinceDef(LaneSelectReg, IsHazardFn); return RWLaneWaitStates - WaitStatesSince; } + +int GCNHazardRecognizer::checkRFEHazards(MachineInstr *RFE) { + + if (ST.getGeneration() < AMDGPUSubtarget::VOLCANIC_ISLANDS) + return 0; + + const SIInstrInfo *TII = ST.getInstrInfo(); + + const int RFEWaitStates = 1; + + auto IsHazardFn = [TII] (MachineInstr *MI) { + return getHWReg(TII, *MI) == AMDGPU::Hwreg::ID_TRAPSTS; + }; + int WaitStatesNeeded = getWaitStatesSinceSetReg(IsHazardFn); + return RFEWaitStates - WaitStatesNeeded; +} |