Skip to content

Commit

Permalink
CodeGen: Push the ModuleSlotTracker through Metadata
Browse files Browse the repository at this point in the history
For another 1% speedup on the testcase in PR23865, push the
`ModuleSlotTracker` through to metadata-related printing in
`MachineBasicBlock::print()`.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@240848 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
dexonsmith committed Jun 26, 2015
1 parent bb8cc2f commit 8266df7
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 17 deletions.
7 changes: 7 additions & 0 deletions include/llvm/IR/Metadata.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,11 @@
#include <type_traits>

namespace llvm {

class LLVMContext;
class Module;
class ModuleSlotTracker;

template<typename ValueSubClass, typename ItemParentClass>
class SymbolTableListTraits;

Expand Down Expand Up @@ -129,7 +132,11 @@ class Metadata {
///
/// If \c M is provided, metadata nodes will be numbered canonically;
/// otherwise, pointer addresses are substituted.
/// @{
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;
Expand Down
9 changes: 7 additions & 2 deletions include/llvm/IR/ModuleSlotTracker.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,13 @@ class ModuleSlotTracker {

/// Construct a slot tracker from a module.
///
/// If \a M is \c nullptr, uses a null slot tracker.
explicit ModuleSlotTracker(const Module *M);
/// If \a M is \c nullptr, uses a null slot tracker. Otherwise, initializes
/// 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.
~ModuleSlotTracker();
Expand Down
8 changes: 4 additions & 4 deletions lib/CodeGen/MachineInstr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -415,7 +415,7 @@ void MachineOperand::print(raw_ostream &OS, ModuleSlotTracker &MST,
break;
case MachineOperand::MO_Metadata:
OS << '<';
getMetadata()->printAsOperand(OS);
getMetadata()->printAsOperand(OS, MST);
OS << '>';
break;
case MachineOperand::MO_MCSymbol:
Expand Down Expand Up @@ -558,7 +558,7 @@ void MachineMemOperand::print(raw_ostream &OS, ModuleSlotTracker &MST) const {
if (const MDNode *TBAAInfo = getAAInfo().TBAA) {
OS << "(tbaa=";
if (TBAAInfo->getNumOperands() > 0)
TBAAInfo->getOperand(0)->printAsOperand(OS);
TBAAInfo->getOperand(0)->printAsOperand(OS, MST);
else
OS << "<unknown>";
OS << ")";
Expand All @@ -569,7 +569,7 @@ void MachineMemOperand::print(raw_ostream &OS, ModuleSlotTracker &MST) const {
OS << "(alias.scope=";
if (ScopeInfo->getNumOperands() > 0)
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)
OS << ",";
}
Expand All @@ -583,7 +583,7 @@ void MachineMemOperand::print(raw_ostream &OS, ModuleSlotTracker &MST) const {
OS << "(noalias=";
if (NoAliasInfo->getNumOperands() > 0)
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)
OS << ",";
}
Expand Down
30 changes: 19 additions & 11 deletions lib/IR/AsmWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -670,10 +670,10 @@ ModuleSlotTracker::ModuleSlotTracker(SlotTracker &Machine, const Module *M,
const Function *F)
: M(M), F(F), Machine(&Machine) {}

ModuleSlotTracker::ModuleSlotTracker(const Module *M)
: MachineStorage(
M ? new SlotTracker(M, /* ShouldInitializeAllMetadata */ true)
: nullptr),
ModuleSlotTracker::ModuleSlotTracker(const Module *M,
bool ShouldInitializeAllMetadata)
: MachineStorage(M ? new SlotTracker(M, ShouldInitializeAllMetadata)
: nullptr),
M(M), Machine(MachineStorage.get()) {}

ModuleSlotTracker::~ModuleSlotTracker() {}
Expand Down Expand Up @@ -3278,30 +3278,38 @@ void Value::printAsOperand(raw_ostream &O, bool PrintType,
}

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);

auto *N = dyn_cast<MDNode>(&MD);
TypePrinting TypePrinter;
SlotTracker Machine(M, /* ShouldInitializeAllMetadata */ N);
if (M)
TypePrinter.incorporateTypes(*M);

WriteAsOperandInternal(OS, &MD, &TypePrinter, &Machine, M,
WriteAsOperandInternal(OS, &MD, &TypePrinter, MST.getMachine(), M,
/* FromValue */ true);

auto *N = dyn_cast<MDNode>(&MD);
if (OnlyAsOperand || !N)
return;

OS << " = ";
WriteMDNodeBodyInternal(OS, N, &TypePrinter, &Machine, M);
WriteMDNodeBodyInternal(OS, N, &TypePrinter, MST.getMachine(), M);
}

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 {
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.
Expand Down

0 comments on commit 8266df7

Please sign in to comment.