38#define DEBUG_TYPE "hexagon-vector-print"
42 cl::desc(
"Enables tracing of vector stores"));
56 StringRef getPassName()
const override {
return "Hexagon VectorPrint pass"; }
58 bool runOnMachineFunction(MachineFunction &Fn)
override;
63char HexagonVectorPrint::ID = 0;
66 return (
Reg >= Hexagon::V0 &&
Reg <= Hexagon::V31) ||
67 (
Reg >= Hexagon::W0 &&
Reg <= Hexagon::W15) ||
68 (
Reg >= Hexagon::WR0 &&
Reg <= Hexagon::WR15) ||
69 (
Reg >= Hexagon::Q0 &&
Reg <= Hexagon::Q3);
73 if (R >= Hexagon::V0 && R <= Hexagon::V31) {
74 static const char* S[] = {
"20",
"21",
"22",
"23",
"24",
"25",
"26",
"27",
75 "28",
"29",
"2a",
"2b",
"2c",
"2d",
"2e",
"2f",
76 "30",
"31",
"32",
"33",
"34",
"35",
"36",
"37",
77 "38",
"39",
"3a",
"3b",
"3c",
"3d",
"3e",
"3f"};
78 return S[R-Hexagon::V0];
80 if (R >= Hexagon::Q0 && R <= Hexagon::Q3) {
81 static const char* S[] = {
"00",
"01",
"02",
"03"};
82 return S[R-Hexagon::Q0];
101 if (
MI.getNumOperands() < 1)
return false;
103 if (
MI.getOperand(0).isReg() &&
MI.getOperand(0).isDef()) {
104 Reg =
MI.getOperand(0).getReg();
109 if (
MI.mayStore() &&
MI.getNumOperands() >= 3 &&
MI.getOperand(2).isReg()) {
110 Reg =
MI.getOperand(2).getReg();
115 if (
MI.mayStore() &&
MI.getNumOperands() >= 4 &&
MI.getOperand(3).isReg()) {
116 Reg =
MI.getOperand(3).getReg();
128 std::vector<MachineInstr *> VecPrintList;
130 for (
auto &
MI :
MBB) {
133 for (++MII; MII !=
MBB.
instr_end() && MII->isInsideBundle(); ++MII) {
134 if (MII->getNumOperands() < 1)
138 VecPrintList.push_back((&*MII));
146 VecPrintList.push_back(&
MI);
152 Changed = !VecPrintList.empty();
156 for (
auto *
I : VecPrintList) {
164 if (
I->isInsideBundle()) {
166 while (
MBB->
instr_end() != MII && MII->isInsideBundle())
175 if (
Reg >= Hexagon::V0 &&
Reg <= Hexagon::V31) {
178 }
else if (
Reg >= Hexagon::W0 &&
Reg <= Hexagon::W15) {
184 }
else if (
Reg >= Hexagon::Q0 &&
Reg <= Hexagon::Q3) {
197 "Hexagon VectorPrint pass",
false,
false)
200 return new HexagonVectorPrint();
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static cl::opt< bool > TraceHexVectorStoresOnly("trace-hex-vector-stores-only", cl::Hidden, cl::desc("Enables tracing of vector stores"))
static std::string getStringReg(unsigned R)
static bool isVecReg(unsigned Reg)
static void addAsmInstr(MachineBasicBlock *MBB, unsigned Reg, MachineBasicBlock::instr_iterator I, const DebugLoc &DL, const HexagonInstrInfo *QII, MachineFunction &Fn)
static bool getInstrVecReg(const MachineInstr &MI, unsigned &Reg)
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
FunctionPass class - This class is used to implement most global optimizations.
const HexagonInstrInfo * getInstrInfo() const override
const HexagonRegisterInfo * getRegisterInfo() const override
Instructions::iterator instr_iterator
instr_iterator instr_end()
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
const char * createExternalSymbolName(StringRef Name)
Allocate a string and populate it with the given external symbol name.
const MachineInstrBuilder & addExternalSymbol(const char *FnName, unsigned TargetFlags=0) const
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
Representation of each machine instruction.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
This is an optimization pass for GlobalISel generic memory operations.
FunctionPass * createHexagonVectorPrint()
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.