blob: 6d708722979c17a0bd66c7ee33c2c364e8e2da80 [file] [log] [blame]
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +00001#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 {
Benjamin Kramer73564982017-01-30 14:55:33 +000010class HexagonInstrInfo;
11class HexagonRegisterInfo;
12
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +000013class HexagonPacketizerList : public VLIWPacketizerList {
14 // Vector of instructions assigned to the packet that has just been created.
15 std::vector<MachineInstr*> OldPacketMIs;
16
17 // Has the instruction been promoted to a dot-new instruction.
18 bool PromotedToDotNew;
19
20 // Has the instruction been glued to allocframe.
21 bool GlueAllocframeStore;
22
23 // Has the feeder instruction been glued to new value jump.
24 bool GlueToNewValueJump;
25
26 // Check if there is a dependence between some instruction already in this
27 // packet and this instruction.
28 bool Dependence;
29
30 // Only check for dependence if there are resources available to
31 // schedule this instruction.
32 bool FoundSequentialDependence;
33
34 // Track MIs with ignored dependence.
35 std::vector<MachineInstr*> IgnoreDepMIs;
36
37protected:
38 /// \brief A handle to the branch probability pass.
39 const MachineBranchProbabilityInfo *MBPI;
40 const MachineLoopInfo *MLI;
41
42private:
43 const HexagonInstrInfo *HII;
44 const HexagonRegisterInfo *HRI;
45
46public:
47 // Ctor.
48 HexagonPacketizerList(MachineFunction &MF, MachineLoopInfo &MLI,
49 AliasAnalysis *AA,
50 const MachineBranchProbabilityInfo *MBPI);
51
52 // initPacketizerState - initialize some internal flags.
53 void initPacketizerState() override;
54
55 // ignorePseudoInstruction - Ignore bundling of pseudo instructions.
Duncan P. N. Exon Smith57022872016-02-27 19:09:00 +000056 bool ignorePseudoInstruction(const MachineInstr &MI,
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +000057 const MachineBasicBlock *MBB) override;
58
59 // isSoloInstruction - return true if instruction MI can not be packetized
60 // with any other instruction, which means that MI itself is a packet.
Duncan P. N. Exon Smith57022872016-02-27 19:09:00 +000061 bool isSoloInstruction(const MachineInstr &MI) override;
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +000062
63 // isLegalToPacketizeTogether - Is it legal to packetize SUI and SUJ
64 // together.
65 bool isLegalToPacketizeTogether(SUnit *SUI, SUnit *SUJ) override;
66
67 // isLegalToPruneDependencies - Is it legal to prune dependece between SUI
68 // and SUJ.
69 bool isLegalToPruneDependencies(SUnit *SUI, SUnit *SUJ) override;
70
Duncan P. N. Exon Smith57022872016-02-27 19:09:00 +000071 MachineBasicBlock::iterator addToPacket(MachineInstr &MI) override;
72 void endPacket(MachineBasicBlock *MBB,
73 MachineBasicBlock::iterator MI) override;
74 bool shouldAddToPacket(const MachineInstr &MI) override;
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +000075
76 void unpacketizeSoloInstrs(MachineFunction &MF);
77
78protected:
Krzysztof Parzyszekf0b34a52016-07-29 21:49:42 +000079 bool isCallDependent(const MachineInstr &MI, SDep::Kind DepType,
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +000080 unsigned DepReg);
Krzysztof Parzyszekf0b34a52016-07-29 21:49:42 +000081 bool promoteToDotCur(MachineInstr &MI, SDep::Kind DepType,
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +000082 MachineBasicBlock::iterator &MII,
Krzysztof Parzyszekf0b34a52016-07-29 21:49:42 +000083 const TargetRegisterClass *RC);
84 bool canPromoteToDotCur(const MachineInstr &MI, const SUnit *PacketSU,
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +000085 unsigned DepReg, MachineBasicBlock::iterator &MII,
Krzysztof Parzyszekf0b34a52016-07-29 21:49:42 +000086 const TargetRegisterClass *RC);
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +000087 void cleanUpDotCur();
88
Krzysztof Parzyszekf0b34a52016-07-29 21:49:42 +000089 bool promoteToDotNew(MachineInstr &MI, SDep::Kind DepType,
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +000090 MachineBasicBlock::iterator &MII,
Krzysztof Parzyszekf0b34a52016-07-29 21:49:42 +000091 const TargetRegisterClass *RC);
92 bool canPromoteToDotNew(const MachineInstr &MI, const SUnit *PacketSU,
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +000093 unsigned DepReg, MachineBasicBlock::iterator &MII,
Krzysztof Parzyszekf0b34a52016-07-29 21:49:42 +000094 const TargetRegisterClass *RC);
95 bool canPromoteToNewValue(const MachineInstr &MI, const SUnit *PacketSU,
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +000096 unsigned DepReg, MachineBasicBlock::iterator &MII);
Krzysztof Parzyszekf0b34a52016-07-29 21:49:42 +000097 bool canPromoteToNewValueStore(const MachineInstr &MI,
98 const MachineInstr &PacketMI, unsigned DepReg);
99 bool demoteToDotOld(MachineInstr &MI);
100 bool useCallersSP(MachineInstr &MI);
101 void useCalleesSP(MachineInstr &MI);
Duncan P. N. Exon Smith6307eb52016-02-23 02:46:52 +0000102 bool arePredicatesComplements(MachineInstr &MI1, MachineInstr &MI2);
Krzysztof Parzyszekf0b34a52016-07-29 21:49:42 +0000103 bool restrictingDepExistInPacket(MachineInstr&, unsigned);
104 bool isNewifiable(const MachineInstr &MI, const TargetRegisterClass *NewRC);
105 bool isCurifiable(MachineInstr &MI);
106 bool cannotCoexist(const MachineInstr &MI, const MachineInstr &MJ);
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +0000107 inline bool isPromotedToDotNew() const {
108 return PromotedToDotNew;
109 }
110 bool tryAllocateResourcesForConstExt(bool Reserve);
111 bool canReserveResourcesForConstExt();
112 void reserveResourcesForConstExt();
Krzysztof Parzyszekf0b34a52016-07-29 21:49:42 +0000113 bool hasDeadDependence(const MachineInstr &I, const MachineInstr &J);
114 bool hasControlDependence(const MachineInstr &I, const MachineInstr &J);
115 bool hasV4SpecificDependence(const MachineInstr &I, const MachineInstr &J);
116 bool producesStall(const MachineInstr &MI);
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +0000117};
118} // namespace llvm
119#endif // HEXAGONVLIWPACKETIZER_H
120