blob: cbdd2367429d480f46eaeba3c5ad0340e7fac9bb [file] [log] [blame]
Eugene Zelenko3b873362017-09-28 22:27:31 +00001//===- HexagonPacketizer.h - VLIW packetizer --------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef LLVM_LIB_TARGET_HEXAGON_HEXAGONVLIWPACKETIZER_H
11#define LLVM_LIB_TARGET_HEXAGON_HEXAGONVLIWPACKETIZER_H
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +000012
13#include "llvm/CodeGen/DFAPacketizer.h"
Eugene Zelenko3b873362017-09-28 22:27:31 +000014#include "llvm/CodeGen/MachineBasicBlock.h"
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +000015#include "llvm/CodeGen/ScheduleDAG.h"
Eugene Zelenko3b873362017-09-28 22:27:31 +000016#include <vector>
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +000017
18namespace llvm {
Eugene Zelenko3b873362017-09-28 22:27:31 +000019
Benjamin Kramer73564982017-01-30 14:55:33 +000020class HexagonInstrInfo;
21class HexagonRegisterInfo;
Eugene Zelenko3b873362017-09-28 22:27:31 +000022class MachineBranchProbabilityInfo;
23class MachineFunction;
24class MachineInstr;
25class MachineLoopInfo;
26class TargetRegisterClass;
Benjamin Kramer73564982017-01-30 14:55:33 +000027
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +000028class HexagonPacketizerList : public VLIWPacketizerList {
29 // Vector of instructions assigned to the packet that has just been created.
Eugene Zelenko3b873362017-09-28 22:27:31 +000030 std::vector<MachineInstr *> OldPacketMIs;
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +000031
32 // Has the instruction been promoted to a dot-new instruction.
33 bool PromotedToDotNew;
34
35 // Has the instruction been glued to allocframe.
36 bool GlueAllocframeStore;
37
38 // Has the feeder instruction been glued to new value jump.
39 bool GlueToNewValueJump;
40
Krzysztof Parzyszek8f174dd2017-10-11 15:51:44 +000041 // This holds the offset value, when pruning the dependences.
42 int64_t ChangedOffset;
43
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +000044 // Check if there is a dependence between some instruction already in this
45 // packet and this instruction.
46 bool Dependence;
47
48 // Only check for dependence if there are resources available to
49 // schedule this instruction.
50 bool FoundSequentialDependence;
51
52 // Track MIs with ignored dependence.
53 std::vector<MachineInstr*> IgnoreDepMIs;
54
Krzysztof Parzyszek9aaf9232017-05-02 18:12:19 +000055 // Set to true if the packet contains an instruction that stalls with an
56 // instruction from the previous packet.
Krzysztof Parzyszekfca6fae2017-05-02 18:29:49 +000057 bool PacketStalls = false;
Krzysztof Parzyszek9aaf9232017-05-02 18:12:19 +000058
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +000059protected:
60 /// \brief A handle to the branch probability pass.
61 const MachineBranchProbabilityInfo *MBPI;
62 const MachineLoopInfo *MLI;
63
64private:
65 const HexagonInstrInfo *HII;
66 const HexagonRegisterInfo *HRI;
67
68public:
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +000069 HexagonPacketizerList(MachineFunction &MF, MachineLoopInfo &MLI,
70 AliasAnalysis *AA,
71 const MachineBranchProbabilityInfo *MBPI);
72
73 // initPacketizerState - initialize some internal flags.
74 void initPacketizerState() override;
75
76 // ignorePseudoInstruction - Ignore bundling of pseudo instructions.
Duncan P. N. Exon Smith57022872016-02-27 19:09:00 +000077 bool ignorePseudoInstruction(const MachineInstr &MI,
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +000078 const MachineBasicBlock *MBB) override;
79
80 // isSoloInstruction - return true if instruction MI can not be packetized
81 // with any other instruction, which means that MI itself is a packet.
Duncan P. N. Exon Smith57022872016-02-27 19:09:00 +000082 bool isSoloInstruction(const MachineInstr &MI) override;
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +000083
84 // isLegalToPacketizeTogether - Is it legal to packetize SUI and SUJ
85 // together.
86 bool isLegalToPacketizeTogether(SUnit *SUI, SUnit *SUJ) override;
87
88 // isLegalToPruneDependencies - Is it legal to prune dependece between SUI
89 // and SUJ.
90 bool isLegalToPruneDependencies(SUnit *SUI, SUnit *SUJ) override;
91
Duncan P. N. Exon Smith57022872016-02-27 19:09:00 +000092 MachineBasicBlock::iterator addToPacket(MachineInstr &MI) override;
93 void endPacket(MachineBasicBlock *MBB,
94 MachineBasicBlock::iterator MI) override;
95 bool shouldAddToPacket(const MachineInstr &MI) override;
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +000096
97 void unpacketizeSoloInstrs(MachineFunction &MF);
98
99protected:
Krzysztof Parzyszekf0b34a52016-07-29 21:49:42 +0000100 bool isCallDependent(const MachineInstr &MI, SDep::Kind DepType,
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +0000101 unsigned DepReg);
Krzysztof Parzyszekf0b34a52016-07-29 21:49:42 +0000102 bool promoteToDotCur(MachineInstr &MI, SDep::Kind DepType,
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +0000103 MachineBasicBlock::iterator &MII,
Krzysztof Parzyszekf0b34a52016-07-29 21:49:42 +0000104 const TargetRegisterClass *RC);
105 bool canPromoteToDotCur(const MachineInstr &MI, const SUnit *PacketSU,
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +0000106 unsigned DepReg, MachineBasicBlock::iterator &MII,
Krzysztof Parzyszekf0b34a52016-07-29 21:49:42 +0000107 const TargetRegisterClass *RC);
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +0000108 void cleanUpDotCur();
109
Krzysztof Parzyszekf0b34a52016-07-29 21:49:42 +0000110 bool promoteToDotNew(MachineInstr &MI, SDep::Kind DepType,
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +0000111 MachineBasicBlock::iterator &MII,
Krzysztof Parzyszekf0b34a52016-07-29 21:49:42 +0000112 const TargetRegisterClass *RC);
113 bool canPromoteToDotNew(const MachineInstr &MI, const SUnit *PacketSU,
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +0000114 unsigned DepReg, MachineBasicBlock::iterator &MII,
Krzysztof Parzyszekf0b34a52016-07-29 21:49:42 +0000115 const TargetRegisterClass *RC);
116 bool canPromoteToNewValue(const MachineInstr &MI, const SUnit *PacketSU,
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +0000117 unsigned DepReg, MachineBasicBlock::iterator &MII);
Krzysztof Parzyszekf0b34a52016-07-29 21:49:42 +0000118 bool canPromoteToNewValueStore(const MachineInstr &MI,
119 const MachineInstr &PacketMI, unsigned DepReg);
120 bool demoteToDotOld(MachineInstr &MI);
121 bool useCallersSP(MachineInstr &MI);
122 void useCalleesSP(MachineInstr &MI);
Krzysztof Parzyszek8f174dd2017-10-11 15:51:44 +0000123 bool updateOffset(SUnit *SUI, SUnit *SUJ);
124 void undoChangedOffset(MachineInstr &MI);
Duncan P. N. Exon Smith6307eb52016-02-23 02:46:52 +0000125 bool arePredicatesComplements(MachineInstr &MI1, MachineInstr &MI2);
Krzysztof Parzyszekf0b34a52016-07-29 21:49:42 +0000126 bool restrictingDepExistInPacket(MachineInstr&, unsigned);
127 bool isNewifiable(const MachineInstr &MI, const TargetRegisterClass *NewRC);
128 bool isCurifiable(MachineInstr &MI);
129 bool cannotCoexist(const MachineInstr &MI, const MachineInstr &MJ);
Eugene Zelenko3b873362017-09-28 22:27:31 +0000130
131 bool isPromotedToDotNew() const {
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +0000132 return PromotedToDotNew;
133 }
Eugene Zelenko3b873362017-09-28 22:27:31 +0000134
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +0000135 bool tryAllocateResourcesForConstExt(bool Reserve);
136 bool canReserveResourcesForConstExt();
137 void reserveResourcesForConstExt();
Krzysztof Parzyszekf0b34a52016-07-29 21:49:42 +0000138 bool hasDeadDependence(const MachineInstr &I, const MachineInstr &J);
139 bool hasControlDependence(const MachineInstr &I, const MachineInstr &J);
Krzysztof Parzyszek1aaf41a2017-02-17 22:14:51 +0000140 bool hasRegMaskDependence(const MachineInstr &I, const MachineInstr &J);
Krzysztof Parzyszekf0b34a52016-07-29 21:49:42 +0000141 bool hasV4SpecificDependence(const MachineInstr &I, const MachineInstr &J);
142 bool producesStall(const MachineInstr &MI);
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +0000143};
Krzysztof Parzyszek56bbf542015-12-16 19:36:12 +0000144
Eugene Zelenko3b873362017-09-28 22:27:31 +0000145} // end namespace llvm
146
147#endif // LLVM_LIB_TARGET_HEXAGON_HEXAGONVLIWPACKETIZER_H