diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Target/Hexagon/HexagonVLIWPacketizer.h')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/Target/Hexagon/HexagonVLIWPacketizer.h | 164 | 
1 files changed, 164 insertions, 0 deletions
diff --git a/contrib/llvm-project/llvm/lib/Target/Hexagon/HexagonVLIWPacketizer.h b/contrib/llvm-project/llvm/lib/Target/Hexagon/HexagonVLIWPacketizer.h new file mode 100644 index 000000000000..27a47220570a --- /dev/null +++ b/contrib/llvm-project/llvm/lib/Target/Hexagon/HexagonVLIWPacketizer.h @@ -0,0 +1,164 @@ +//===- HexagonPacketizer.h - VLIW packetizer --------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIB_TARGET_HEXAGON_HEXAGONVLIWPACKETIZER_H +#define LLVM_LIB_TARGET_HEXAGON_HEXAGONVLIWPACKETIZER_H + +#include "llvm/CodeGen/DFAPacketizer.h" +#include "llvm/CodeGen/MachineBasicBlock.h" +#include "llvm/CodeGen/ScheduleDAG.h" +#include <vector> + +namespace llvm { + +class HexagonInstrInfo; +class HexagonRegisterInfo; +class MachineBranchProbabilityInfo; +class MachineFunction; +class MachineInstr; +class MachineLoopInfo; +class TargetRegisterClass; + +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; + +  // This holds the offset value, when pruning the dependences. +  int64_t ChangedOffset; + +  // 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; + +  bool MemShufDisabled = false; + +  // Track MIs with ignored dependence. +  std::vector<MachineInstr*> IgnoreDepMIs; + +  // Set to true if the packet contains an instruction that stalls with an +  // instruction from the previous packet. +  bool PacketStalls = false; + +  // Set to true if the packet has a duplex pair of sub-instructions. +  bool PacketHasDuplex = false; + +  // Set to true if the packet has a instruction that can only be executed +  // in SLOT0. +  bool PacketHasSLOT0OnlyInsn = false; + +protected: +  /// A handle to the branch probability pass. +  const MachineBranchProbabilityInfo *MBPI; +  const MachineLoopInfo *MLI; + +private: +  const HexagonInstrInfo *HII; +  const HexagonRegisterInfo *HRI; +  const bool Minimal; + +public: +  HexagonPacketizerList(MachineFunction &MF, MachineLoopInfo &MLI, +                        AAResults *AA, const MachineBranchProbabilityInfo *MBPI, +                        bool Minimal); + +  // 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; + +  bool foundLSInPacket(); +  MachineBasicBlock::iterator addToPacket(MachineInstr &MI) override; +  void endPacket(MachineBasicBlock *MBB, +                 MachineBasicBlock::iterator MI) override; +  bool shouldAddToPacket(const MachineInstr &MI) override; + +  void unpacketizeSoloInstrs(MachineFunction &MF); + +protected: +  bool getmemShufDisabled() { +    return MemShufDisabled; +  }; +  void setmemShufDisabled(bool val) { +    MemShufDisabled = val; +  }; +  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 useCallersSP(MachineInstr &MI); +  void useCalleesSP(MachineInstr &MI); +  bool updateOffset(SUnit *SUI, SUnit *SUJ); +  void undoChangedOffset(MachineInstr &MI); +  bool arePredicatesComplements(MachineInstr &MI1, MachineInstr &MI2); +  bool restrictingDepExistInPacket(MachineInstr&, unsigned); +  bool isNewifiable(const MachineInstr &MI, const TargetRegisterClass *NewRC); +  bool isCurifiable(MachineInstr &MI); +  bool cannotCoexist(const MachineInstr &MI, const MachineInstr &MJ); + +  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 hasRegMaskDependence(const MachineInstr &I, const MachineInstr &J); +  bool hasDualStoreDependence(const MachineInstr &I, const MachineInstr &J); +  bool producesStall(const MachineInstr &MI); +  bool isPureSlot0InsnWithNoSlot1Store(const MachineInstr &MI); +}; + +} // end namespace llvm + +#endif // LLVM_LIB_TARGET_HEXAGON_HEXAGONVLIWPACKETIZER_H  | 
