//===--- HexagonHazardRecognizer.h - Hexagon Post RA Hazard Recognizer ----===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // This file defines the hazard recognizer for scheduling on Hexagon. //===----------------------------------------------------------------------===// #ifndef LLVM_LIB_TARGET_HEXAGON_HEXAGONPROFITRECOGNIZER_H #define LLVM_LIB_TARGET_HEXAGON_HEXAGONPROFITRECOGNIZER_H #include "HexagonInstrInfo.h" #include "HexagonSubtarget.h" #include "llvm/ADT/SmallSet.h" #include "llvm/CodeGen/DFAPacketizer.h" #include "llvm/CodeGen/ScheduleHazardRecognizer.h" namespace llvm { class HexagonHazardRecognizer : public ScheduleHazardRecognizer { DFAPacketizer *Resources; const HexagonInstrInfo *TII; unsigned PacketNum; // If the packet contains a potential dot cur instruction. This is // used for the scheduling priority function. SUnit *UsesDotCur; // The packet number when a dor cur is emitted. If its use is not generated // in the same packet, then try to wait another cycle before emitting. int DotCurPNum; // The set of registers defined by instructions in the current packet. SmallSet RegDefs; public: HexagonHazardRecognizer(const InstrItineraryData *II, const HexagonInstrInfo *HII, const HexagonSubtarget &ST) : Resources(ST.createDFAPacketizer(II)), TII(HII), PacketNum(0), UsesDotCur(nullptr), DotCurPNum(-1) { } ~HexagonHazardRecognizer() override { if (Resources) delete Resources; } /// This callback is invoked when a new block of instructions is about to be /// scheduled. The hazard state is set to an initialized state. void Reset() override; /// Return the hazard type of emitting this node. There are three /// possible results. Either: /// * NoHazard: it is legal to issue this instruction on this cycle. /// * Hazard: issuing this instruction would stall the machine. If some /// other instruction is available, issue it first. HazardType getHazardType(SUnit *SU, int stalls) override; /// This callback is invoked when an instruction is emitted to be scheduled, /// to advance the hazard state. void EmitInstruction(SUnit *) override; /// This callback may be invoked if getHazardType returns NoHazard. If, even /// though there is no hazard, it would be better to schedule another /// available instruction, this callback should return true. bool ShouldPreferAnother(SUnit *) override; /// This callback is invoked whenever the next top-down instruction to be /// scheduled cannot issue in the current cycle, either because of latency /// or resource conflicts. This should increment the internal state of the /// hazard recognizer so that previously "Hazard" instructions will now not /// be hazards. void AdvanceCycle() override; }; } // end namespace llvm #endif // LLVM_LIB_TARGET_HEXAGON_HEXAGONPROFITRECOGNIZER_H