From 1487a2ee93918120d2b46a8430d9b19714c93da1 Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Wed, 20 Apr 2016 19:05:59 +0000 Subject: [PATCH] IR: Avoid mallocs in constructor of ModuleSlotTracker A ModuleSlotTracker can be created without actually being used (e.g., r266889 added one to the Verifier). Create the SlotTracker within it lazily on the first call to ModuleSlotTracker::getMachine. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@266902 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/IR/ModuleSlotTracker.h | 6 +++++- lib/IR/AsmWriter.cpp | 19 +++++++++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/include/llvm/IR/ModuleSlotTracker.h b/include/llvm/IR/ModuleSlotTracker.h index 49730a66bdf..eb26fba906e 100644 --- a/include/llvm/IR/ModuleSlotTracker.h +++ b/include/llvm/IR/ModuleSlotTracker.h @@ -30,6 +30,8 @@ class Value; class ModuleSlotTracker { /// Storage for a slot tracker. std::unique_ptr MachineStorage; + bool ShouldCreateStorage = false; + bool ShouldInitializeAllMetadata = false; const Module *M = nullptr; const Function *F = nullptr; @@ -53,7 +55,9 @@ public: /// Destructor to clean up storage. ~ModuleSlotTracker(); - SlotTracker *getMachine() const { return Machine; } + /// Lazily creates a slot tracker. + SlotTracker *getMachine(); + const Module *getModule() const { return M; } const Function *getCurrentFunction() const { return F; } diff --git a/lib/IR/AsmWriter.cpp b/lib/IR/AsmWriter.cpp index 916f90fd598..43165bf65ed 100644 --- a/lib/IR/AsmWriter.cpp +++ b/lib/IR/AsmWriter.cpp @@ -697,14 +697,25 @@ ModuleSlotTracker::ModuleSlotTracker(SlotTracker &Machine, const Module *M, ModuleSlotTracker::ModuleSlotTracker(const Module *M, bool ShouldInitializeAllMetadata) - : MachineStorage(M ? new SlotTracker(M, ShouldInitializeAllMetadata) - : nullptr), - M(M), Machine(MachineStorage.get()) {} + : ShouldCreateStorage(M), + ShouldInitializeAllMetadata(ShouldInitializeAllMetadata), M(M) {} ModuleSlotTracker::~ModuleSlotTracker() {} +SlotTracker *ModuleSlotTracker::getMachine() { + if (!ShouldCreateStorage) + return Machine; + + ShouldCreateStorage = false; + MachineStorage = + llvm::make_unique(M, ShouldInitializeAllMetadata); + Machine = MachineStorage.get(); + return Machine; +} + void ModuleSlotTracker::incorporateFunction(const Function &F) { - if (!Machine) + // Using getMachine() may lazily create the slot tracker. + if (!getMachine()) return; // Nothing to do if this is the right function already.