[MachineInstr] Add a dumpr method

Add a dump method that recursively prints an instruction and all
the instructions defining its operands and so on.

This is helpful when looking at combiner issue.

NFC

Differential Revision: https://reviews.llvm.org/D75094
This commit is contained in:
Quentin Colombet 2020-02-24 17:30:58 -08:00
parent eb1c040b41
commit a12f1d6a52
2 changed files with 40 additions and 0 deletions

View File

@ -262,6 +262,10 @@ private:
// MachineInstrs are pool-allocated and owned by MachineFunction.
friend class MachineFunction;
void
dumprImpl(const MachineRegisterInfo &MRI, unsigned Depth, unsigned MaxDepth,
SmallPtrSetImpl<const MachineInstr *> &AlreadySeenInstrs) const;
public:
MachineInstr(const MachineInstr &) = delete;
MachineInstr &operator=(const MachineInstr &) = delete;
@ -1534,6 +1538,10 @@ public:
bool AddNewLine = true,
const TargetInstrInfo *TII = nullptr) const;
void dump() const;
/// Print on dbgs() the current instruction and the instructions defining its
/// operands and so on until we reach \p MaxDepth.
void dumpr(const MachineRegisterInfo &MRI,
unsigned MaxDepth = UINT_MAX) const;
/// @}
//===--------------------------------------------------------------------===//

View File

@ -61,6 +61,7 @@
#include "llvm/Support/Compiler.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/FormattedStream.h"
#include "llvm/Support/LowLevelTypeImpl.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/raw_ostream.h"
@ -1463,6 +1464,37 @@ LLVM_DUMP_METHOD void MachineInstr::dump() const {
dbgs() << " ";
print(dbgs());
}
LLVM_DUMP_METHOD void MachineInstr::dumprImpl(
const MachineRegisterInfo &MRI, unsigned Depth, unsigned MaxDepth,
SmallPtrSetImpl<const MachineInstr *> &AlreadySeenInstrs) const {
if (Depth >= MaxDepth)
return;
if (!AlreadySeenInstrs.insert(this).second)
return;
// PadToColumn always inserts at least one space.
// Don't mess up the alignment if we don't want any space.
if (Depth)
fdbgs().PadToColumn(Depth * 2);
print(fdbgs());
for (const MachineOperand &MO : operands()) {
if (!MO.isReg() || MO.isDef())
continue;
Register Reg = MO.getReg();
if (Reg.isPhysical())
continue;
const MachineInstr *NewMI = MRI.getUniqueVRegDef(Reg);
if (NewMI == nullptr)
continue;
NewMI->dumprImpl(MRI, Depth + 1, MaxDepth, AlreadySeenInstrs);
}
}
LLVM_DUMP_METHOD void MachineInstr::dumpr(const MachineRegisterInfo &MRI,
unsigned MaxDepth) const {
SmallPtrSet<const MachineInstr *, 16> AlreadySeenInstrs;
dumprImpl(MRI, 0, MaxDepth, AlreadySeenInstrs);
}
#endif
void MachineInstr::print(raw_ostream &OS, bool IsStandalone, bool SkipOpers,