summaryrefslogtreecommitdiff
path: root/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonShuffler.h
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target/Hexagon/MCTargetDesc/HexagonShuffler.h')
-rw-r--r--llvm/lib/Target/Hexagon/MCTargetDesc/HexagonShuffler.h83
1 files changed, 70 insertions, 13 deletions
diff --git a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonShuffler.h b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonShuffler.h
index bf3bad36dfe55..1b4ebc5111dba 100644
--- a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonShuffler.h
+++ b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonShuffler.h
@@ -17,11 +17,13 @@
#include "MCTargetDesc/HexagonMCInstrInfo.h"
#include "MCTargetDesc/HexagonMCTargetDesc.h"
#include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/SMLoc.h"
#include <cstdint>
+#include <functional>
#include <utility>
namespace llvm {
@@ -45,6 +47,9 @@ public:
setWeight(s);
}
+ void setAllUnits() {
+ setUnits(((1u << HEXAGON_PACKET_SIZE) - 1));
+ }
unsigned setWeight(unsigned s);
unsigned getUnits() const { return (Slots); }
@@ -65,7 +70,6 @@ public:
class HexagonCVIResource : public HexagonResource {
public:
using UnitsAndLanes = std::pair<unsigned, unsigned>;
- using TypeUnitsAndLanes = DenseMap<unsigned, UnitsAndLanes>;
private:
// Available HVX slots.
@@ -90,11 +94,10 @@ private:
void setStore(bool f = true) { Store = f; }
public:
- HexagonCVIResource(TypeUnitsAndLanes *TUL, MCInstrInfo const &MCII,
+ HexagonCVIResource(MCInstrInfo const &MCII,
+ MCSubtargetInfo const &STI,
unsigned s, MCInst const *id);
- static void SetupTUL(TypeUnitsAndLanes *TUL, StringRef CPU);
-
bool isValid() const { return Valid; }
unsigned getLanes() const { return Lanes; }
bool mayLoad() const { return Load; }
@@ -111,10 +114,10 @@ class HexagonInstr {
HexagonCVIResource CVI;
public:
- HexagonInstr(HexagonCVIResource::TypeUnitsAndLanes *T,
- MCInstrInfo const &MCII, MCInst const *id,
+ HexagonInstr(MCInstrInfo const &MCII,
+ MCSubtargetInfo const &STI, MCInst const *id,
MCInst const *Extender, unsigned s)
- : ID(id), Extender(Extender), Core(s), CVI(T, MCII, s, id) {}
+ : ID(id), Extender(Extender), Core(s), CVI(MCII, STI, s, id){};
MCInst const &getDesc() const { return *ID; }
MCInst const *getExtender() const { return Extender; }
@@ -140,11 +143,30 @@ class HexagonShuffler {
using HexagonPacket =
SmallVector<HexagonInstr, HEXAGON_PRESHUFFLE_PACKET_SIZE>;
+ struct HexagonPacketSummary {
+ // Number of memory operations, loads, solo loads, stores, solo stores,
+ // single stores.
+ unsigned memory;
+ unsigned loads;
+ unsigned load0;
+ unsigned stores;
+ unsigned store0;
+ unsigned store1;
+ unsigned NonZCVIloads;
+ unsigned AllCVIloads;
+ unsigned CVIstores;
+ // Number of duplex insns
+ unsigned duplex;
+ unsigned pSlot3Cnt;
+ Optional<HexagonInstr *> PrefSlot3Inst;
+ unsigned memops;
+ unsigned ReservedSlotMask;
+ SmallVector<HexagonInstr *, HEXAGON_PRESHUFFLE_PACKET_SIZE> branchInsts;
+ Optional<SMLoc> Slot1AOKLoc;
+ Optional<SMLoc> NoSlot1StoreLoc;
+ };
// Insn handles in a bundle.
HexagonPacket Packet;
- HexagonPacket PacketSave;
-
- HexagonCVIResource::TypeUnitsAndLanes TUL;
protected:
MCContext &Context;
@@ -153,13 +175,29 @@ protected:
MCSubtargetInfo const &STI;
SMLoc Loc;
bool ReportErrors;
+ bool CheckFailure;
std::vector<std::pair<SMLoc, std::string>> AppliedRestrictions;
- void applySlotRestrictions();
- void restrictSlot1AOK();
- void restrictNoSlot1Store();
+ bool applySlotRestrictions(HexagonPacketSummary const &Summary);
+ void restrictSlot1AOK(HexagonPacketSummary const &Summary);
+ void restrictNoSlot1Store(HexagonPacketSummary const &Summary);
+ void restrictNoSlot1();
+ bool restrictStoreLoadOrder(HexagonPacketSummary const &Summary);
+ void restrictBranchOrder(HexagonPacketSummary const &Summary);
+ void restrictPreferSlot3(HexagonPacketSummary const &Summary);
+ void permitNonSlot();
+
+ Optional<HexagonPacket> tryAuction(HexagonPacketSummary const &Summary) const;
+
+ HexagonPacketSummary GetPacketSummary();
+ bool ValidPacketMemoryOps(HexagonPacketSummary const &Summary) const;
+ bool ValidResourceUsage(HexagonPacketSummary const &Summary);
+ bool validPacketInsts() const;
public:
using iterator = HexagonPacket::iterator;
+ using const_iterator = HexagonPacket::const_iterator;
+ using packet_range = iterator_range<HexagonPacket::iterator>;
+ using const_packet_range = iterator_range<HexagonPacket::const_iterator>;
HexagonShuffler(MCContext &Context, bool ReportErrors,
MCInstrInfo const &MCII, MCSubtargetInfo const &STI);
@@ -179,6 +217,25 @@ public:
iterator begin() { return (Packet.begin()); }
iterator end() { return (Packet.end()); }
+ const_iterator cbegin() const { return (Packet.begin()); }
+ const_iterator cend() const { return (Packet.end()); }
+ packet_range insts(HexagonPacket &P) {
+ return make_range(P.begin(), P.end());
+ }
+ const_packet_range insts(HexagonPacket const &P) const {
+ return make_range(P.begin(), P.end());
+ }
+ packet_range insts() { return make_range(begin(), end()); }
+ const_packet_range insts() const { return make_range(cbegin(), cend()); }
+
+ using InstPredicate = bool (*)(MCInstrInfo const &, MCInst const &);
+
+ bool HasInstWith(InstPredicate Pred) const {
+ return llvm::any_of(insts(), [&](HexagonInstr const &I) {
+ MCInst const &Inst = I.getDesc();
+ return (*Pred)(MCII, Inst);
+ });
+ }
// Add insn handle to the bundle .
void append(MCInst const &ID, MCInst const *Extender, unsigned S);