CodeGen: Push the ModuleSlotTracker through Metadata

For another 1% speedup on the testcase in PR23865, push the
`ModuleSlotTracker` through to metadata-related printing in
`MachineBasicBlock::print()`.

llvm-svn: 240848
This commit is contained in:
Duncan P. N. Exon Smith 2015-06-26 22:28:47 +00:00
parent 007561acdc
commit 6529ed40bc
4 changed files with 37 additions and 17 deletions

View File

@ -27,8 +27,11 @@
#include <type_traits> #include <type_traits>
namespace llvm { namespace llvm {
class LLVMContext; class LLVMContext;
class Module; class Module;
class ModuleSlotTracker;
template<typename ValueSubClass, typename ItemParentClass> template<typename ValueSubClass, typename ItemParentClass>
class SymbolTableListTraits; class SymbolTableListTraits;
@ -129,7 +132,11 @@ public:
/// ///
/// If \c M is provided, metadata nodes will be numbered canonically; /// If \c M is provided, metadata nodes will be numbered canonically;
/// otherwise, pointer addresses are substituted. /// otherwise, pointer addresses are substituted.
/// @{
void printAsOperand(raw_ostream &OS, const Module *M = nullptr) const; void printAsOperand(raw_ostream &OS, const Module *M = nullptr) const;
void printAsOperand(raw_ostream &OS, ModuleSlotTracker &MST,
const Module *M = nullptr) const;
/// @}
}; };
#define HANDLE_METADATA(CLASS) class CLASS; #define HANDLE_METADATA(CLASS) class CLASS;

View File

@ -41,8 +41,13 @@ public:
/// Construct a slot tracker from a module. /// Construct a slot tracker from a module.
/// ///
/// If \a M is \c nullptr, uses a null slot tracker. /// If \a M is \c nullptr, uses a null slot tracker. Otherwise, initializes
explicit ModuleSlotTracker(const Module *M); /// a slot tracker, and initializes all metadata slots. \c
/// ShouldInitializeAllMetadata defaults to true because this is expected to
/// be shared between multiple callers, and otherwise MDNode references will
/// not match up.
explicit ModuleSlotTracker(const Module *M,
bool ShouldInitializeAllMetadata = true);
/// Destructor to clean up storage. /// Destructor to clean up storage.
~ModuleSlotTracker(); ~ModuleSlotTracker();

View File

@ -415,7 +415,7 @@ void MachineOperand::print(raw_ostream &OS, ModuleSlotTracker &MST,
break; break;
case MachineOperand::MO_Metadata: case MachineOperand::MO_Metadata:
OS << '<'; OS << '<';
getMetadata()->printAsOperand(OS); getMetadata()->printAsOperand(OS, MST);
OS << '>'; OS << '>';
break; break;
case MachineOperand::MO_MCSymbol: case MachineOperand::MO_MCSymbol:
@ -558,7 +558,7 @@ void MachineMemOperand::print(raw_ostream &OS, ModuleSlotTracker &MST) const {
if (const MDNode *TBAAInfo = getAAInfo().TBAA) { if (const MDNode *TBAAInfo = getAAInfo().TBAA) {
OS << "(tbaa="; OS << "(tbaa=";
if (TBAAInfo->getNumOperands() > 0) if (TBAAInfo->getNumOperands() > 0)
TBAAInfo->getOperand(0)->printAsOperand(OS); TBAAInfo->getOperand(0)->printAsOperand(OS, MST);
else else
OS << "<unknown>"; OS << "<unknown>";
OS << ")"; OS << ")";
@ -569,7 +569,7 @@ void MachineMemOperand::print(raw_ostream &OS, ModuleSlotTracker &MST) const {
OS << "(alias.scope="; OS << "(alias.scope=";
if (ScopeInfo->getNumOperands() > 0) if (ScopeInfo->getNumOperands() > 0)
for (unsigned i = 0, ie = ScopeInfo->getNumOperands(); i != ie; ++i) { for (unsigned i = 0, ie = ScopeInfo->getNumOperands(); i != ie; ++i) {
ScopeInfo->getOperand(i)->printAsOperand(OS); ScopeInfo->getOperand(i)->printAsOperand(OS, MST);
if (i != ie-1) if (i != ie-1)
OS << ","; OS << ",";
} }
@ -583,7 +583,7 @@ void MachineMemOperand::print(raw_ostream &OS, ModuleSlotTracker &MST) const {
OS << "(noalias="; OS << "(noalias=";
if (NoAliasInfo->getNumOperands() > 0) if (NoAliasInfo->getNumOperands() > 0)
for (unsigned i = 0, ie = NoAliasInfo->getNumOperands(); i != ie; ++i) { for (unsigned i = 0, ie = NoAliasInfo->getNumOperands(); i != ie; ++i) {
NoAliasInfo->getOperand(i)->printAsOperand(OS); NoAliasInfo->getOperand(i)->printAsOperand(OS, MST);
if (i != ie-1) if (i != ie-1)
OS << ","; OS << ",";
} }

View File

@ -670,9 +670,9 @@ ModuleSlotTracker::ModuleSlotTracker(SlotTracker &Machine, const Module *M,
const Function *F) const Function *F)
: M(M), F(F), Machine(&Machine) {} : M(M), F(F), Machine(&Machine) {}
ModuleSlotTracker::ModuleSlotTracker(const Module *M) ModuleSlotTracker::ModuleSlotTracker(const Module *M,
: MachineStorage( bool ShouldInitializeAllMetadata)
M ? new SlotTracker(M, /* ShouldInitializeAllMetadata */ true) : MachineStorage(M ? new SlotTracker(M, ShouldInitializeAllMetadata)
: nullptr), : nullptr),
M(M), Machine(MachineStorage.get()) {} M(M), Machine(MachineStorage.get()) {}
@ -3278,30 +3278,38 @@ void Value::printAsOperand(raw_ostream &O, bool PrintType,
} }
static void printMetadataImpl(raw_ostream &ROS, const Metadata &MD, static void printMetadataImpl(raw_ostream &ROS, const Metadata &MD,
const Module *M, bool OnlyAsOperand) { ModuleSlotTracker &MST, const Module *M,
bool OnlyAsOperand) {
formatted_raw_ostream OS(ROS); formatted_raw_ostream OS(ROS);
auto *N = dyn_cast<MDNode>(&MD);
TypePrinting TypePrinter; TypePrinting TypePrinter;
SlotTracker Machine(M, /* ShouldInitializeAllMetadata */ N);
if (M) if (M)
TypePrinter.incorporateTypes(*M); TypePrinter.incorporateTypes(*M);
WriteAsOperandInternal(OS, &MD, &TypePrinter, &Machine, M, WriteAsOperandInternal(OS, &MD, &TypePrinter, MST.getMachine(), M,
/* FromValue */ true); /* FromValue */ true);
auto *N = dyn_cast<MDNode>(&MD);
if (OnlyAsOperand || !N) if (OnlyAsOperand || !N)
return; return;
OS << " = "; OS << " = ";
WriteMDNodeBodyInternal(OS, N, &TypePrinter, &Machine, M); WriteMDNodeBodyInternal(OS, N, &TypePrinter, MST.getMachine(), M);
} }
void Metadata::printAsOperand(raw_ostream &OS, const Module *M) const { void Metadata::printAsOperand(raw_ostream &OS, const Module *M) const {
printMetadataImpl(OS, *this, M, /* OnlyAsOperand */ true); ModuleSlotTracker MST(M, isa<MDNode>(this));
printMetadataImpl(OS, *this, MST, M, /* OnlyAsOperand */ true);
}
void Metadata::printAsOperand(raw_ostream &OS, ModuleSlotTracker &MST,
const Module *M) const {
printMetadataImpl(OS, *this, MST, M, /* OnlyAsOperand */ true);
} }
void Metadata::print(raw_ostream &OS, const Module *M) const { void Metadata::print(raw_ostream &OS, const Module *M) const {
printMetadataImpl(OS, *this, M, /* OnlyAsOperand */ false); ModuleSlotTracker MST(M, isa<MDNode>(this));
printMetadataImpl(OS, *this, MST, M, /* OnlyAsOperand */ false);
} }
// Value::dump - allow easy printing of Values from the debugger. // Value::dump - allow easy printing of Values from the debugger.