37#define DEBUG_TYPE "hexagon-vector-print"
41 cl::desc(
"Enables tracing of vector stores"));
71char HexagonVectorPrint::ID = 0;
74 return (Reg >= Hexagon::V0 && Reg <= Hexagon::V31) ||
75 (Reg >= Hexagon::W0 && Reg <= Hexagon::W15) ||
76 (Reg >= Hexagon::WR0 && Reg <= Hexagon::WR15) ||
77 (Reg >= Hexagon::Q0 && Reg <= Hexagon::Q3);
81 if (R >= Hexagon::V0 && R <= Hexagon::V31) {
82 static const char* S[] = {
"20",
"21",
"22",
"23",
"24",
"25",
"26",
"27",
83 "28",
"29",
"2a",
"2b",
"2c",
"2d",
"2e",
"2f",
84 "30",
"31",
"32",
"33",
"34",
"35",
"36",
"37",
85 "38",
"39",
"3a",
"3b",
"3c",
"3d",
"3e",
"3f"};
86 return S[R-Hexagon::V0];
88 if (R >= Hexagon::Q0 && R <= Hexagon::Q3) {
89 static const char* S[] = {
"00",
"01",
"02",
"03"};
90 return S[R-Hexagon::Q0];
100 std::string VDescStr =
".long 0x1dffe0" +
getStringReg(Reg);
109 if (
MI.getNumOperands() < 1)
return false;
111 if (
MI.getOperand(0).isReg() &&
MI.getOperand(0).isDef()) {
112 Reg =
MI.getOperand(0).getReg();
117 if (
MI.mayStore() &&
MI.getNumOperands() >= 3 &&
MI.getOperand(2).isReg()) {
118 Reg =
MI.getOperand(2).getReg();
123 if (
MI.mayStore() &&
MI.getNumOperands() >= 4 &&
MI.getOperand(3).isReg()) {
124 Reg =
MI.getOperand(3).getReg();
132 bool Changed =
false;
135 QII = QST->getInstrInfo();
136 std::vector<MachineInstr *> VecPrintList;
138 for (
auto &
MI :
MBB) {
141 for (++MII; MII !=
MBB.
instr_end() && MII->isInsideBundle(); ++MII) {
142 if (MII->getNumOperands() < 1)
146 VecPrintList.push_back((&*MII));
154 VecPrintList.push_back(&
MI);
160 Changed = !VecPrintList.empty();
164 for (
auto *
I : VecPrintList) {
172 if (
I->isInsideBundle()) {
174 while (
MBB->
instr_end() != MII && MII->isInsideBundle())
183 if (Reg >= Hexagon::V0 && Reg <= Hexagon::V31) {
184 LLVM_DEBUG(
dbgs() <<
"adding dump for V" << Reg - Hexagon::V0 <<
'\n');
186 }
else if (Reg >= Hexagon::W0 && Reg <= Hexagon::W15) {
187 LLVM_DEBUG(
dbgs() <<
"adding dump for W" << Reg - Hexagon::W0 <<
'\n');
192 }
else if (Reg >= Hexagon::Q0 && Reg <= Hexagon::Q3) {
193 LLVM_DEBUG(
dbgs() <<
"adding dump for Q" << Reg - Hexagon::Q0 <<
'\n');
205 "Hexagon VectorPrint pass",
false,
false)
208 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 HexagonRegisterInfo * getRegisterInfo() const override
Instructions::iterator instr_iterator
instr_iterator instr_end()
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
virtual bool runOnMachineFunction(MachineFunction &MF)=0
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
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.
PassRegistry - This class manages the registration and intitialization of the pass subsystem as appli...
static PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
virtual StringRef getPassName() const
getPassName - Return a nice clean name for a pass.
StringRef - Represent a constant reference to a string, i.e.
#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.
Reg
All possible values of the reg field in the ModR/M byte.
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.
void initializeHexagonVectorPrintPass(PassRegistry &)
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.