HexagonVLIWPacketizer.h revision 314564
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
9namespace llvm {
10class 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
34protected:
35  /// \brief A handle to the branch probability pass.
36  const MachineBranchProbabilityInfo *MBPI;
37  const MachineLoopInfo *MLI;
38
39private:
40  const HexagonInstrInfo *HII;
41  const HexagonRegisterInfo *HRI;
42
43public:
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,
70                 MachineBasicBlock::iterator MI) override;
71  bool shouldAddToPacket(const MachineInstr &MI) override;
72
73  void unpacketizeSoloInstrs(MachineFunction &MF);
74
75protected:
76  bool isCallDependent(const MachineInstr &MI, SDep::Kind DepType,
77                       unsigned DepReg);
78  bool promoteToDotCur(MachineInstr &MI, SDep::Kind DepType,
79                       MachineBasicBlock::iterator &MII,
80                       const TargetRegisterClass *RC);
81  bool canPromoteToDotCur(const MachineInstr &MI, const SUnit *PacketSU,
82                          unsigned DepReg, MachineBasicBlock::iterator &MII,
83                          const TargetRegisterClass *RC);
84  void cleanUpDotCur();
85
86  bool promoteToDotNew(MachineInstr &MI, SDep::Kind DepType,
87                       MachineBasicBlock::iterator &MII,
88                       const TargetRegisterClass *RC);
89  bool canPromoteToDotNew(const MachineInstr &MI, const SUnit *PacketSU,
90                          unsigned DepReg, MachineBasicBlock::iterator &MII,
91                          const TargetRegisterClass *RC);
92  bool canPromoteToNewValue(const MachineInstr &MI, const SUnit *PacketSU,
93                            unsigned DepReg, MachineBasicBlock::iterator &MII);
94  bool canPromoteToNewValueStore(const MachineInstr &MI,
95                                 const MachineInstr &PacketMI, unsigned DepReg);
96  bool demoteToDotOld(MachineInstr &MI);
97  bool useCallersSP(MachineInstr &MI);
98  void useCalleesSP(MachineInstr &MI);
99  bool arePredicatesComplements(MachineInstr &MI1, MachineInstr &MI2);
100  bool restrictingDepExistInPacket(MachineInstr&, unsigned);
101  bool isNewifiable(const MachineInstr &MI, const TargetRegisterClass *NewRC);
102  bool isCurifiable(MachineInstr &MI);
103  bool cannotCoexist(const MachineInstr &MI, const MachineInstr &MJ);
104  inline bool isPromotedToDotNew() const {
105    return PromotedToDotNew;
106  }
107  bool tryAllocateResourcesForConstExt(bool Reserve);
108  bool canReserveResourcesForConstExt();
109  void reserveResourcesForConstExt();
110  bool hasDeadDependence(const MachineInstr &I, const MachineInstr &J);
111  bool hasControlDependence(const MachineInstr &I, const MachineInstr &J);
112  bool hasV4SpecificDependence(const MachineInstr &I, const MachineInstr &J);
113  bool producesStall(const MachineInstr &MI);
114};
115} // namespace llvm
116#endif // HEXAGONVLIWPACKETIZER_H
117
118