|
|
@@ -0,0 +1,114 @@ |
|
|
#ifndef HEXAGONVLIWPACKETIZER_H |
|
|
#define HEXAGONVLIWPACKETIZER_H |
|
|
|
|
|
#include "llvm/CodeGen/DFAPacketizer.h" |
|
|
#include "llvm/CodeGen/MachineBranchProbabilityInfo.h" |
|
|
#include "llvm/CodeGen/ScheduleDAG.h" |
|
|
#include "llvm/CodeGen/ScheduleDAGInstrs.h" |
|
|
|
|
|
namespace llvm { |
|
|
class HexagonPacketizerList : public VLIWPacketizerList { |
|
|
// Vector of instructions assigned to the packet that has just been created. |
|
|
std::vector<MachineInstr*> OldPacketMIs; |
|
|
|
|
|
// Has the instruction been promoted to a dot-new instruction. |
|
|
bool PromotedToDotNew; |
|
|
|
|
|
// Has the instruction been glued to allocframe. |
|
|
bool GlueAllocframeStore; |
|
|
|
|
|
// Has the feeder instruction been glued to new value jump. |
|
|
bool GlueToNewValueJump; |
|
|
|
|
|
// Check if there is a dependence between some instruction already in this |
|
|
// packet and this instruction. |
|
|
bool Dependence; |
|
|
|
|
|
// Only check for dependence if there are resources available to |
|
|
// schedule this instruction. |
|
|
bool FoundSequentialDependence; |
|
|
|
|
|
// Track MIs with ignored dependence. |
|
|
std::vector<MachineInstr*> IgnoreDepMIs; |
|
|
|
|
|
protected: |
|
|
/// \brief A handle to the branch probability pass. |
|
|
const MachineBranchProbabilityInfo *MBPI; |
|
|
const MachineLoopInfo *MLI; |
|
|
|
|
|
private: |
|
|
const HexagonInstrInfo *HII; |
|
|
const HexagonRegisterInfo *HRI; |
|
|
|
|
|
public: |
|
|
// Ctor. |
|
|
HexagonPacketizerList(MachineFunction &MF, MachineLoopInfo &MLI, |
|
|
AliasAnalysis *AA, |
|
|
const MachineBranchProbabilityInfo *MBPI); |
|
|
|
|
|
// initPacketizerState - initialize some internal flags. |
|
|
void initPacketizerState() override; |
|
|
|
|
|
// ignorePseudoInstruction - Ignore bundling of pseudo instructions. |
|
|
bool ignorePseudoInstruction(const MachineInstr *MI, |
|
|
const MachineBasicBlock *MBB) override; |
|
|
|
|
|
// isSoloInstruction - return true if instruction MI can not be packetized |
|
|
// with any other instruction, which means that MI itself is a packet. |
|
|
bool isSoloInstruction(const MachineInstr *MI) override; |
|
|
|
|
|
// isLegalToPacketizeTogether - Is it legal to packetize SUI and SUJ |
|
|
// together. |
|
|
bool isLegalToPacketizeTogether(SUnit *SUI, SUnit *SUJ) override; |
|
|
|
|
|
// isLegalToPruneDependencies - Is it legal to prune dependece between SUI |
|
|
// and SUJ. |
|
|
bool isLegalToPruneDependencies(SUnit *SUI, SUnit *SUJ) override; |
|
|
|
|
|
MachineBasicBlock::iterator addToPacket(MachineInstr *MI) override; |
|
|
void endPacket(MachineBasicBlock *MBB, MachineInstr *MI) override; |
|
|
bool shouldAddToPacket(const MachineInstr *MI) override; |
|
|
|
|
|
void unpacketizeSoloInstrs(MachineFunction &MF); |
|
|
|
|
|
protected: |
|
|
bool isCallDependent(const MachineInstr* MI, SDep::Kind DepType, |
|
|
unsigned DepReg); |
|
|
bool promoteToDotCur(MachineInstr* MI, SDep::Kind DepType, |
|
|
MachineBasicBlock::iterator &MII, |
|
|
const TargetRegisterClass* RC); |
|
|
bool canPromoteToDotCur(const MachineInstr* MI, const SUnit* PacketSU, |
|
|
unsigned DepReg, MachineBasicBlock::iterator &MII, |
|
|
const TargetRegisterClass* RC); |
|
|
void cleanUpDotCur(); |
|
|
|
|
|
bool promoteToDotNew(MachineInstr* MI, SDep::Kind DepType, |
|
|
MachineBasicBlock::iterator &MII, |
|
|
const TargetRegisterClass* RC); |
|
|
bool canPromoteToDotNew(const MachineInstr* MI, const SUnit* PacketSU, |
|
|
unsigned DepReg, MachineBasicBlock::iterator &MII, |
|
|
const TargetRegisterClass* RC); |
|
|
bool canPromoteToNewValue(const MachineInstr* MI, const SUnit* PacketSU, |
|
|
unsigned DepReg, MachineBasicBlock::iterator &MII); |
|
|
bool canPromoteToNewValueStore(const MachineInstr* MI, |
|
|
const MachineInstr* PacketMI, unsigned DepReg); |
|
|
bool demoteToDotOld(MachineInstr* MI); |
|
|
bool arePredicatesComplements(MachineInstr* MI1, MachineInstr* MI2); |
|
|
bool restrictingDepExistInPacket(MachineInstr*, unsigned); |
|
|
bool isNewifiable(const MachineInstr *MI); |
|
|
bool isCurifiable(MachineInstr* MI); |
|
|
bool cannotCoexist(const MachineInstr *MI, const MachineInstr *MJ); |
|
|
inline bool isPromotedToDotNew() const { |
|
|
return PromotedToDotNew; |
|
|
} |
|
|
bool tryAllocateResourcesForConstExt(bool Reserve); |
|
|
bool canReserveResourcesForConstExt(); |
|
|
void reserveResourcesForConstExt(); |
|
|
bool hasDeadDependence(const MachineInstr *I, const MachineInstr *J); |
|
|
bool hasControlDependence(const MachineInstr *I, const MachineInstr *J); |
|
|
bool hasV4SpecificDependence(const MachineInstr *I, const MachineInstr *J); |
|
|
bool producesStall(const MachineInstr *MI); |
|
|
}; |
|
|
} // namespace llvm |
|
|
#endif // HEXAGONVLIWPACKETIZER_H |
|
|
|