From 0ecff953c3d12b83f76c93443de18c7efe20a1ed Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Wed, 20 Apr 2016 17:27:44 +0000 Subject: IR: Use a single ModuleSlotTracker in the Verifier Speed up Verifier output by sharing a single ModuleSlotTracker for the duration. There should be no functionality change here except for much faster output when there's more than one statement. Now the Verifier won't be traversing the full Metadata graph every time it prints an error. The TypePrinter is still not shared, but that would take some extra plumbing. llvm-svn: 266889 --- llvm/lib/IR/Verifier.cpp | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) (limited to 'llvm/lib/IR/Verifier.cpp') diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index 655032eed13..f010fd35dea 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -67,6 +67,7 @@ #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Metadata.h" #include "llvm/IR/Module.h" +#include "llvm/IR/ModuleSlotTracker.h" #include "llvm/IR/PassManager.h" #include "llvm/IR/Statepoint.h" #include "llvm/Pass.h" @@ -84,6 +85,7 @@ namespace { struct VerifierSupport { raw_ostream *OS; const Module *M = nullptr; + Optional MST; /// Track the brokenness of the module while recursively visiting. bool Broken = false; @@ -105,9 +107,10 @@ private: if (!V) return; if (isa(V)) { - *OS << *V << '\n'; + V->print(*OS, *MST); + *OS << '\n'; } else { - V->printAsOperand(*OS, true, M); + V->printAsOperand(*OS, true, *MST); *OS << '\n'; } } @@ -118,7 +121,7 @@ private: void Write(const Metadata *MD) { if (!MD) return; - MD->print(*OS, M); + MD->print(*OS, *MST, M); *OS << '\n'; } @@ -129,7 +132,7 @@ private: void Write(const NamedMDNode *NMD) { if (!NMD) return; - NMD->print(*OS); + NMD->print(*OS, *MST); *OS << '\n'; } @@ -229,13 +232,21 @@ class Verifier : public InstVisitor, VerifierSupport { void checkAtomicMemAccessSize(const Module *M, Type *Ty, const Instruction *I); + + void updateModule(const Module *NewM) { + if (M == NewM) + return; + MST.emplace(NewM); + M = NewM; + } + public: explicit Verifier(raw_ostream *OS) : VerifierSupport(OS), Context(nullptr), LandingPadResultTy(nullptr), SawFrameEscape(false) {} bool verify(const Function &F) { - M = F.getParent(); + updateModule(F.getParent()); Context = &M->getContext(); // First ensure the function is well-enough formed to compute dominance @@ -278,7 +289,7 @@ public: } bool verify(const Module &M) { - this->M = &M; + updateModule(&M); Context = &M.getContext(); Broken = false; -- cgit v1.2.3