1 //===- HexagonPacketizer.h - VLIW packetizer --------------------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #ifndef LLVM_LIB_TARGET_HEXAGON_HEXAGONVLIWPACKETIZER_H
10 #define LLVM_LIB_TARGET_HEXAGON_HEXAGONVLIWPACKETIZER_H
12 #include "llvm/CodeGen/DFAPacketizer.h"
13 #include "llvm/CodeGen/MachineBasicBlock.h"
14 #include "llvm/CodeGen/ScheduleDAG.h"
19 class HexagonInstrInfo
;
20 class HexagonRegisterInfo
;
21 class MachineBranchProbabilityInfo
;
22 class MachineFunction
;
24 class MachineLoopInfo
;
25 class TargetRegisterClass
;
27 class HexagonPacketizerList
: public VLIWPacketizerList
{
28 // Vector of instructions assigned to the packet that has just been created.
29 std::vector
<MachineInstr
*> OldPacketMIs
;
31 // Has the instruction been promoted to a dot-new instruction.
32 bool PromotedToDotNew
;
34 // Has the instruction been glued to allocframe.
35 bool GlueAllocframeStore
;
37 // Has the feeder instruction been glued to new value jump.
38 bool GlueToNewValueJump
;
40 // This holds the offset value, when pruning the dependences.
41 int64_t ChangedOffset
;
43 // Check if there is a dependence between some instruction already in this
44 // packet and this instruction.
47 // Only check for dependence if there are resources available to
48 // schedule this instruction.
49 bool FoundSequentialDependence
;
51 bool MemShufDisabled
= false;
53 // Track MIs with ignored dependence.
54 std::vector
<MachineInstr
*> IgnoreDepMIs
;
56 // Set to true if the packet contains an instruction that stalls with an
57 // instruction from the previous packet.
58 bool PacketStalls
= false;
60 // Set to true if the packet has a duplex pair of sub-instructions.
61 bool PacketHasDuplex
= false;
63 // Set to true if the packet has a instruction that can only be executed
65 bool PacketHasSLOT0OnlyInsn
= false;
68 /// A handle to the branch probability pass.
69 const MachineBranchProbabilityInfo
*MBPI
;
70 const MachineLoopInfo
*MLI
;
73 const HexagonInstrInfo
*HII
;
74 const HexagonRegisterInfo
*HRI
;
78 HexagonPacketizerList(MachineFunction
&MF
, MachineLoopInfo
&MLI
,
79 AAResults
*AA
, const MachineBranchProbabilityInfo
*MBPI
,
82 // initPacketizerState - initialize some internal flags.
83 void initPacketizerState() override
;
85 // ignorePseudoInstruction - Ignore bundling of pseudo instructions.
86 bool ignorePseudoInstruction(const MachineInstr
&MI
,
87 const MachineBasicBlock
*MBB
) override
;
89 // isSoloInstruction - return true if instruction MI can not be packetized
90 // with any other instruction, which means that MI itself is a packet.
91 bool isSoloInstruction(const MachineInstr
&MI
) override
;
93 // isLegalToPacketizeTogether - Is it legal to packetize SUI and SUJ
95 bool isLegalToPacketizeTogether(SUnit
*SUI
, SUnit
*SUJ
) override
;
97 // isLegalToPruneDependencies - Is it legal to prune dependece between SUI
99 bool isLegalToPruneDependencies(SUnit
*SUI
, SUnit
*SUJ
) override
;
101 bool foundLSInPacket();
102 MachineBasicBlock::iterator
addToPacket(MachineInstr
&MI
) override
;
103 void endPacket(MachineBasicBlock
*MBB
,
104 MachineBasicBlock::iterator MI
) override
;
105 bool shouldAddToPacket(const MachineInstr
&MI
) override
;
107 void unpacketizeSoloInstrs(MachineFunction
&MF
);
110 bool getmemShufDisabled() {
111 return MemShufDisabled
;
113 void setmemShufDisabled(bool val
) {
114 MemShufDisabled
= val
;
116 bool isCallDependent(const MachineInstr
&MI
, SDep::Kind DepType
,
118 bool promoteToDotCur(MachineInstr
&MI
, SDep::Kind DepType
,
119 MachineBasicBlock::iterator
&MII
,
120 const TargetRegisterClass
*RC
);
121 bool canPromoteToDotCur(const MachineInstr
&MI
, const SUnit
*PacketSU
,
122 unsigned DepReg
, MachineBasicBlock::iterator
&MII
,
123 const TargetRegisterClass
*RC
);
124 void cleanUpDotCur();
126 bool promoteToDotNew(MachineInstr
&MI
, SDep::Kind DepType
,
127 MachineBasicBlock::iterator
&MII
,
128 const TargetRegisterClass
*RC
);
129 bool canPromoteToDotNew(const MachineInstr
&MI
, const SUnit
*PacketSU
,
130 unsigned DepReg
, MachineBasicBlock::iterator
&MII
,
131 const TargetRegisterClass
*RC
);
132 bool canPromoteToNewValue(const MachineInstr
&MI
, const SUnit
*PacketSU
,
133 unsigned DepReg
, MachineBasicBlock::iterator
&MII
);
134 bool canPromoteToNewValueStore(const MachineInstr
&MI
,
135 const MachineInstr
&PacketMI
, unsigned DepReg
);
136 bool demoteToDotOld(MachineInstr
&MI
);
137 bool useCallersSP(MachineInstr
&MI
);
138 void useCalleesSP(MachineInstr
&MI
);
139 bool updateOffset(SUnit
*SUI
, SUnit
*SUJ
);
140 void undoChangedOffset(MachineInstr
&MI
);
141 bool arePredicatesComplements(MachineInstr
&MI1
, MachineInstr
&MI2
);
142 bool restrictingDepExistInPacket(MachineInstr
&, unsigned);
143 bool isNewifiable(const MachineInstr
&MI
, const TargetRegisterClass
*NewRC
);
144 bool isCurifiable(MachineInstr
&MI
);
145 bool cannotCoexist(const MachineInstr
&MI
, const MachineInstr
&MJ
);
147 bool isPromotedToDotNew() const {
148 return PromotedToDotNew
;
151 bool tryAllocateResourcesForConstExt(bool Reserve
);
152 bool canReserveResourcesForConstExt();
153 void reserveResourcesForConstExt();
154 bool hasDeadDependence(const MachineInstr
&I
, const MachineInstr
&J
);
155 bool hasControlDependence(const MachineInstr
&I
, const MachineInstr
&J
);
156 bool hasRegMaskDependence(const MachineInstr
&I
, const MachineInstr
&J
);
157 bool hasDualStoreDependence(const MachineInstr
&I
, const MachineInstr
&J
);
158 bool producesStall(const MachineInstr
&MI
);
159 bool isPureSlot0InsnWithNoSlot1Store(const MachineInstr
&MI
);
162 } // end namespace llvm
164 #endif // LLVM_LIB_TARGET_HEXAGON_HEXAGONVLIWPACKETIZER_H