//===-- 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/BitVector.h" #include "llvm/ADT/STLExtras.h" #include "llvm/CodeGen/ScheduleHazardRecognizer.h" #include namespace llvm { class MachineFunction; class MachineInstr; class MachineOperand; class MachineRegisterInfo; class ScheduleDAG; class SIInstrInfo; class SIRegisterInfo; class GCNSubtarget; 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 EmittedInstrs; const MachineFunction &MF; const GCNSubtarget &ST; const SIInstrInfo &TII; const SIRegisterInfo &TRI; /// RegUnits of uses in the current soft memory clause. BitVector ClauseUses; /// RegUnits of defs in the current soft memory clause. BitVector ClauseDefs; void resetClause() { ClauseUses.reset(); ClauseDefs.reset(); } void addClauseInst(const MachineInstr &MI); int getWaitStatesSince(function_ref IsHazard); int getWaitStatesSinceDef(unsigned Reg, function_ref IsHazardDef = [](MachineInstr *) { return true; }); int getWaitStatesSinceSetReg(function_ref IsHazard); int checkSoftClauseHazards(MachineInstr *SMEM); int checkSMRDHazards(MachineInstr *SMRD); int checkVMEMHazards(MachineInstr* VMEM); int checkDPPHazards(MachineInstr *DPP); int checkDivFMasHazards(MachineInstr *DivFMas); int checkGetRegHazards(MachineInstr *GetRegInstr); int checkSetRegHazards(MachineInstr *SetRegInstr); int createsVALUHazard(const MachineInstr &MI); int checkVALUHazards(MachineInstr *VALU); int checkVALUHazardsHelper(const MachineOperand &Def, const MachineRegisterInfo &MRI); int checkRWLaneHazards(MachineInstr *RWLane); int checkRFEHazards(MachineInstr *RFE); int checkInlineAsmHazards(MachineInstr *IA); int checkAnyInstHazards(MachineInstr *MI); int checkReadM0Hazards(MachineInstr *SMovRel); 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