38 #define DEBUG_TYPE "hexagon-vector-print" 42 cl::desc(
"Enables tracing of vector stores"));
65 StringRef getPassName()
const override {
return "Hexagon VectorPrint pass"; }
75 return (Reg >= Hexagon::V0 && Reg <= Hexagon::V31)
76 || (Reg >= Hexagon::W0 && Reg <= Hexagon::W15)
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);
104 .addExternalSymbol(cstr)
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');
188 addAsmInstr(MBB, Hexagon::V0 + (Reg - Hexagon::W0) * 2 + 1,
190 addAsmInstr(MBB, Hexagon::V0 + (Reg - Hexagon::W0) * 2,
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();
static PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
instr_iterator instr_end()
This class represents lattice values for constants.
FunctionPass * createHexagonVectorPrint()
unsigned getReg() const
getReg - Returns the register number.
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
unsigned getNumOperands() const
Retuns the total number of operands.
const HexagonRegisterInfo * getRegisterInfo() const override
INLINEASM - Represents an inline asm block.
MachineInstrBuilder BuildMI(MachineFunction &MF, const DebugLoc &DL, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
bool mayStore(QueryType Type=AnyInBundle) const
Return true if this instruction could possibly modify memory.
initializer< Ty > init(const Ty &Val)
static bool getInstrVecReg(const MachineInstr &MI, unsigned &Reg)
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
FunctionPass class - This class is used to implement most global optimizations.
static bool isVecReg(unsigned Reg)
const char * createExternalSymbolName(StringRef Name)
Allocate a string and populate it with the given external symbol name.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Iterator for intrusive lists based on ilist_node.
static void addAsmInstr(MachineBasicBlock *MBB, unsigned Reg, MachineBasicBlock::instr_iterator I, const DebugLoc &DL, const HexagonInstrInfo *QII, MachineFunction &Fn)
static cl::opt< bool > TraceHexVectorStoresOnly("trace-hex-vector-stores-only", cl::Hidden, cl::ZeroOrMore, cl::init(false), cl::desc("Enables tracing of vector stores"))
void initializeHexagonVectorPrintPass(PassRegistry &)
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Representation of each machine instruction.
INITIALIZE_PASS(HexagonVectorPrint, "hexagon-vector-print", "Hexagon VectorPrint pass", false, false) FunctionPass *llvm
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
bool isReg() const
isReg - Tests if this is a MO_Register operand.
StringRef - Represent a constant reference to a string, i.e.
PassRegistry - This class manages the registration and intitialization of the pass subsystem as appli...
const MachineOperand & getOperand(unsigned i) const
static std::string getStringReg(unsigned R)