| //===-- GCNHazardRecognizers.h - GCN Hazard Recognizers ---------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file defines hazard recognizers for scheduling on GCN processors. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_LIB_TARGET_AMDGPUHAZARDRECOGNIZERS_H |
| #define LLVM_LIB_TARGET_AMDGPUHAZARDRECOGNIZERS_H |
| |
| #include "llvm/ADT/STLExtras.h" |
| #include "llvm/CodeGen/ScheduleHazardRecognizer.h" |
| #include <list> |
| |
| namespace llvm { |
| |
| class MachineFunction; |
| class MachineInstr; |
| class ScheduleDAG; |
| class SIInstrInfo; |
| class SISubtarget; |
| |
| class GCNHazardRecognizer final : public ScheduleHazardRecognizer { |
| // This variable stores the instruction that has been emitted this cycle. It |
| // will be added to EmittedInstrs, when AdvanceCycle() or RecedeCycle() is |
| // called. |
| MachineInstr *CurrCycleInstr; |
| std::list<MachineInstr*> EmittedInstrs; |
| const MachineFunction &MF; |
| const SISubtarget &ST; |
| |
| int getWaitStatesSinceDef(unsigned Reg, |
| function_ref<bool(MachineInstr *)> IsHazardDef = |
| [](MachineInstr *) { return true; }); |
| |
| int checkSMEMSoftClauseHazards(MachineInstr *SMEM); |
| int checkSMRDHazards(MachineInstr *SMRD); |
| int checkVMEMHazards(MachineInstr* VMEM); |
| int checkDPPHazards(MachineInstr *DPP); |
| public: |
| GCNHazardRecognizer(const MachineFunction &MF); |
| // We can only issue one instruction per cycle. |
| bool atIssueLimit() const override { return true; } |
| void EmitInstruction(SUnit *SU) override; |
| void EmitInstruction(MachineInstr *MI) override; |
| HazardType getHazardType(SUnit *SU, int Stalls) override; |
| void EmitNoop() override; |
| unsigned PreEmitNoops(SUnit *SU) override; |
| unsigned PreEmitNoops(MachineInstr *) override; |
| void AdvanceCycle() override; |
| void RecedeCycle() override; |
| }; |
| |
| } // end namespace llvm |
| |
| #endif //LLVM_LIB_TARGET_AMDGPUHAZARDRECOGNIZERS_H |