[Hexagon] Update the Hexagon packetizer
[oota-llvm.git] / lib / Target / Hexagon / HexagonVLIWPacketizer.h
1 #ifndef HEXAGONVLIWPACKETIZER_H
2 #define HEXAGONVLIWPACKETIZER_H
3
4 #include "llvm/CodeGen/DFAPacketizer.h"
5 #include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
6 #include "llvm/CodeGen/ScheduleDAG.h"
7 #include "llvm/CodeGen/ScheduleDAGInstrs.h"
8
9 namespace llvm {
10 class HexagonPacketizerList : public VLIWPacketizerList {
11   // Vector of instructions assigned to the packet that has just been created.
12   std::vector<MachineInstr*> OldPacketMIs;
13
14   // Has the instruction been promoted to a dot-new instruction.
15   bool PromotedToDotNew;
16
17   // Has the instruction been glued to allocframe.
18   bool GlueAllocframeStore;
19
20   // Has the feeder instruction been glued to new value jump.
21   bool GlueToNewValueJump;
22
23   // Check if there is a dependence between some instruction already in this
24   // packet and this instruction.
25   bool Dependence;
26
27   // Only check for dependence if there are resources available to
28   // schedule this instruction.
29   bool FoundSequentialDependence;
30
31   // Track MIs with ignored dependence.
32   std::vector<MachineInstr*> IgnoreDepMIs;
33
34 protected:
35   /// \brief A handle to the branch probability pass.
36   const MachineBranchProbabilityInfo *MBPI;
37   const MachineLoopInfo *MLI;
38
39 private:
40   const HexagonInstrInfo *HII;
41   const HexagonRegisterInfo *HRI;
42
43 public:
44   // Ctor.
45   HexagonPacketizerList(MachineFunction &MF, MachineLoopInfo &MLI,
46                         AliasAnalysis *AA,
47                         const MachineBranchProbabilityInfo *MBPI);
48
49   // initPacketizerState - initialize some internal flags.
50   void initPacketizerState() override;
51
52   // ignorePseudoInstruction - Ignore bundling of pseudo instructions.
53   bool ignorePseudoInstruction(const MachineInstr *MI,
54                                const MachineBasicBlock *MBB) override;
55
56   // isSoloInstruction - return true if instruction MI can not be packetized
57   // with any other instruction, which means that MI itself is a packet.
58   bool isSoloInstruction(const MachineInstr *MI) override;
59
60   // isLegalToPacketizeTogether - Is it legal to packetize SUI and SUJ
61   // together.
62   bool isLegalToPacketizeTogether(SUnit *SUI, SUnit *SUJ) override;
63
64   // isLegalToPruneDependencies - Is it legal to prune dependece between SUI
65   // and SUJ.
66   bool isLegalToPruneDependencies(SUnit *SUI, SUnit *SUJ) override;
67
68   MachineBasicBlock::iterator addToPacket(MachineInstr *MI) override;
69   void endPacket(MachineBasicBlock *MBB, MachineInstr *MI) override;
70   bool shouldAddToPacket(const MachineInstr *MI) override;
71
72   void unpacketizeSoloInstrs(MachineFunction &MF);
73
74 protected:
75   bool isCallDependent(const MachineInstr* MI, SDep::Kind DepType,
76                        unsigned DepReg);
77   bool promoteToDotCur(MachineInstr* MI, SDep::Kind DepType,
78                        MachineBasicBlock::iterator &MII,
79                        const TargetRegisterClass* RC);
80   bool canPromoteToDotCur(const MachineInstr* MI, const SUnit* PacketSU,
81                           unsigned DepReg, MachineBasicBlock::iterator &MII,
82                           const TargetRegisterClass* RC);
83   void cleanUpDotCur();
84
85   bool promoteToDotNew(MachineInstr* MI, SDep::Kind DepType,
86                        MachineBasicBlock::iterator &MII,
87                        const TargetRegisterClass* RC);
88   bool canPromoteToDotNew(const MachineInstr* MI, const SUnit* PacketSU,
89                           unsigned DepReg, MachineBasicBlock::iterator &MII,
90                           const TargetRegisterClass* RC);
91   bool canPromoteToNewValue(const MachineInstr* MI, const SUnit* PacketSU,
92                             unsigned DepReg, MachineBasicBlock::iterator &MII);
93   bool canPromoteToNewValueStore(const MachineInstr* MI,
94                                  const MachineInstr* PacketMI, unsigned DepReg);
95   bool demoteToDotOld(MachineInstr* MI);
96   bool arePredicatesComplements(MachineInstr* MI1, MachineInstr* MI2);
97   bool restrictingDepExistInPacket(MachineInstr*, unsigned);
98   bool isNewifiable(const MachineInstr *MI);
99   bool isCurifiable(MachineInstr* MI);
100   bool cannotCoexist(const MachineInstr *MI, const MachineInstr *MJ);
101   inline bool isPromotedToDotNew() const {
102     return PromotedToDotNew;
103   }
104   bool tryAllocateResourcesForConstExt(bool Reserve);
105   bool canReserveResourcesForConstExt();
106   void reserveResourcesForConstExt();
107   bool hasDeadDependence(const MachineInstr *I, const MachineInstr *J);
108   bool hasControlDependence(const MachineInstr *I, const MachineInstr *J);
109   bool hasV4SpecificDependence(const MachineInstr *I, const MachineInstr *J);
110   bool producesStall(const MachineInstr *MI);
111 };
112 } // namespace llvm
113 #endif // HEXAGONVLIWPACKETIZER_H
114