forked from OSchip/llvm-project
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:
parent
007561acdc
commit
6529ed40bc
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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 << ",";
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.
|
||||||
|
|
Loading…
Reference in New Issue