| //===- HexagonPacketizer.h - VLIW packetizer --------------------*- C++ -*-===// | 
 | // | 
 | //                     The LLVM Compiler Infrastructure | 
 | // | 
 | // This file is distributed under the University of Illinois Open Source | 
 | // License. See LICENSE.TXT for details. | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 |  | 
 | #ifndef LLVM_LIB_TARGET_HEXAGON_HEXAGONVLIWPACKETIZER_H | 
 | #define LLVM_LIB_TARGET_HEXAGON_HEXAGONVLIWPACKETIZER_H | 
 |  | 
 | #include "llvm/CodeGen/DFAPacketizer.h" | 
 | #include "llvm/CodeGen/MachineBasicBlock.h" | 
 | #include "llvm/CodeGen/ScheduleDAG.h" | 
 | #include <vector> | 
 |  | 
 | namespace llvm { | 
 |  | 
 | class HexagonInstrInfo; | 
 | class HexagonRegisterInfo; | 
 | class MachineBranchProbabilityInfo; | 
 | class MachineFunction; | 
 | class MachineInstr; | 
 | class MachineLoopInfo; | 
 | class TargetRegisterClass; | 
 |  | 
 | class HexagonPacketizerList : public VLIWPacketizerList { | 
 |   // Vector of instructions assigned to the packet that has just been created. | 
 |   std::vector<MachineInstr *> OldPacketMIs; | 
 |  | 
 |   // Has the instruction been promoted to a dot-new instruction. | 
 |   bool PromotedToDotNew; | 
 |  | 
 |   // Has the instruction been glued to allocframe. | 
 |   bool GlueAllocframeStore; | 
 |  | 
 |   // Has the feeder instruction been glued to new value jump. | 
 |   bool GlueToNewValueJump; | 
 |  | 
 |   // This holds the offset value, when pruning the dependences. | 
 |   int64_t ChangedOffset; | 
 |  | 
 |   // Check if there is a dependence between some instruction already in this | 
 |   // packet and this instruction. | 
 |   bool Dependence; | 
 |  | 
 |   // Only check for dependence if there are resources available to | 
 |   // schedule this instruction. | 
 |   bool FoundSequentialDependence; | 
 |  | 
 |   bool MemShufDisabled = false; | 
 |  | 
 |   // Track MIs with ignored dependence. | 
 |   std::vector<MachineInstr*> IgnoreDepMIs; | 
 |  | 
 |   // Set to true if the packet contains an instruction that stalls with an | 
 |   // instruction from the previous packet. | 
 |   bool PacketStalls = false; | 
 |  | 
 | protected: | 
 |   /// A handle to the branch probability pass. | 
 |   const MachineBranchProbabilityInfo *MBPI; | 
 |   const MachineLoopInfo *MLI; | 
 |  | 
 | private: | 
 |   const HexagonInstrInfo *HII; | 
 |   const HexagonRegisterInfo *HRI; | 
 |  | 
 | public: | 
 |   HexagonPacketizerList(MachineFunction &MF, MachineLoopInfo &MLI, | 
 |                         AliasAnalysis *AA, | 
 |                         const MachineBranchProbabilityInfo *MBPI); | 
 |  | 
 |   // initPacketizerState - initialize some internal flags. | 
 |   void initPacketizerState() override; | 
 |  | 
 |   // ignorePseudoInstruction - Ignore bundling of pseudo instructions. | 
 |   bool ignorePseudoInstruction(const MachineInstr &MI, | 
 |                                const MachineBasicBlock *MBB) override; | 
 |  | 
 |   // isSoloInstruction - return true if instruction MI can not be packetized | 
 |   // with any other instruction, which means that MI itself is a packet. | 
 |   bool isSoloInstruction(const MachineInstr &MI) override; | 
 |  | 
 |   // isLegalToPacketizeTogether - Is it legal to packetize SUI and SUJ | 
 |   // together. | 
 |   bool isLegalToPacketizeTogether(SUnit *SUI, SUnit *SUJ) override; | 
 |  | 
 |   // isLegalToPruneDependencies - Is it legal to prune dependece between SUI | 
 |   // and SUJ. | 
 |   bool isLegalToPruneDependencies(SUnit *SUI, SUnit *SUJ) override; | 
 |  | 
 |   bool foundLSInPacket(); | 
 |   MachineBasicBlock::iterator addToPacket(MachineInstr &MI) override; | 
 |   void endPacket(MachineBasicBlock *MBB, | 
 |                  MachineBasicBlock::iterator MI) override; | 
 |   bool shouldAddToPacket(const MachineInstr &MI) override; | 
 |  | 
 |   void unpacketizeSoloInstrs(MachineFunction &MF); | 
 |  | 
 | protected: | 
 |   bool getmemShufDisabled() { | 
 |     return MemShufDisabled; | 
 |   }; | 
 |   void setmemShufDisabled(bool val) { | 
 |     MemShufDisabled = val; | 
 |   }; | 
 |   bool isCallDependent(const MachineInstr &MI, SDep::Kind DepType, | 
 |                        unsigned DepReg); | 
 |   bool promoteToDotCur(MachineInstr &MI, SDep::Kind DepType, | 
 |                        MachineBasicBlock::iterator &MII, | 
 |                        const TargetRegisterClass *RC); | 
 |   bool canPromoteToDotCur(const MachineInstr &MI, const SUnit *PacketSU, | 
 |                           unsigned DepReg, MachineBasicBlock::iterator &MII, | 
 |                           const TargetRegisterClass *RC); | 
 |   void cleanUpDotCur(); | 
 |  | 
 |   bool promoteToDotNew(MachineInstr &MI, SDep::Kind DepType, | 
 |                        MachineBasicBlock::iterator &MII, | 
 |                        const TargetRegisterClass *RC); | 
 |   bool canPromoteToDotNew(const MachineInstr &MI, const SUnit *PacketSU, | 
 |                           unsigned DepReg, MachineBasicBlock::iterator &MII, | 
 |                           const TargetRegisterClass *RC); | 
 |   bool canPromoteToNewValue(const MachineInstr &MI, const SUnit *PacketSU, | 
 |                             unsigned DepReg, MachineBasicBlock::iterator &MII); | 
 |   bool canPromoteToNewValueStore(const MachineInstr &MI, | 
 |                                  const MachineInstr &PacketMI, unsigned DepReg); | 
 |   bool demoteToDotOld(MachineInstr &MI); | 
 |   bool useCallersSP(MachineInstr &MI); | 
 |   void useCalleesSP(MachineInstr &MI); | 
 |   bool updateOffset(SUnit *SUI, SUnit *SUJ); | 
 |   void undoChangedOffset(MachineInstr &MI); | 
 |   bool arePredicatesComplements(MachineInstr &MI1, MachineInstr &MI2); | 
 |   bool restrictingDepExistInPacket(MachineInstr&, unsigned); | 
 |   bool isNewifiable(const MachineInstr &MI, const TargetRegisterClass *NewRC); | 
 |   bool isCurifiable(MachineInstr &MI); | 
 |   bool cannotCoexist(const MachineInstr &MI, const MachineInstr &MJ); | 
 |  | 
 |   bool isPromotedToDotNew() const { | 
 |     return PromotedToDotNew; | 
 |   } | 
 |  | 
 |   bool tryAllocateResourcesForConstExt(bool Reserve); | 
 |   bool canReserveResourcesForConstExt(); | 
 |   void reserveResourcesForConstExt(); | 
 |   bool hasDeadDependence(const MachineInstr &I, const MachineInstr &J); | 
 |   bool hasControlDependence(const MachineInstr &I, const MachineInstr &J); | 
 |   bool hasRegMaskDependence(const MachineInstr &I, const MachineInstr &J); | 
 |   bool hasV4SpecificDependence(const MachineInstr &I, const MachineInstr &J); | 
 |   bool producesStall(const MachineInstr &MI); | 
 | }; | 
 |  | 
 | } // end namespace llvm | 
 |  | 
 | #endif // LLVM_LIB_TARGET_HEXAGON_HEXAGONVLIWPACKETIZER_H |