diff --git a/llvm/include/llvm/Transforms/IPO/Attributor.h b/llvm/include/llvm/Transforms/IPO/Attributor.h --- a/llvm/include/llvm/Transforms/IPO/Attributor.h +++ b/llvm/include/llvm/Transforms/IPO/Attributor.h @@ -112,6 +112,7 @@ #include "llvm/IR/ConstantRange.h" #include "llvm/IR/KnowledgeRetention.h" #include "llvm/IR/PassManager.h" +#include "llvm/Support/Allocator.h" #include "llvm/Transforms/Utils/CallGraphUpdater.h" namespace llvm { @@ -700,11 +701,7 @@ : Functions(Functions), InfoCache(InfoCache), CGUpdater(CGUpdater), DepRecomputeInterval(DepRecomputeInterval), Whitelist(Whitelist) {} - ~Attributor() { - DeleteContainerPointers(AllAbstractAttributes); - for (auto &It : ArgumentReplacementMap) - DeleteContainerPointers(It.second); - } + ~Attributor(); /// Run the analyses until a fixpoint is reached or enforced (timeout). /// @@ -1070,6 +1067,9 @@ /// Return the data layout associated with the anchor scope. const DataLayout &getDataLayout() const { return InfoCache.DL; } + /// The allocator used to allocate memory, e.g. for `AbstractAttribute`s. + BumpPtrAllocator Allocator; + private: /// Check \p Pred on all call sites of \p Fn. /// diff --git a/llvm/lib/Transforms/IPO/Attributor.cpp b/llvm/lib/Transforms/IPO/Attributor.cpp --- a/llvm/lib/Transforms/IPO/Attributor.cpp +++ b/llvm/lib/Transforms/IPO/Attributor.cpp @@ -7309,6 +7309,16 @@ /// Attributor /// ---------------------------------------------------------------------------- +Attributor::~Attributor() { + // The abstract attributes are allocated via the BumpPtrAllocator Allocator, + // thus we cannot delete them. We can, and want to, destruct them though. + for (AbstractAttribute *AA : AllAbstractAttributes) + AA->~AbstractAttribute(); + + for (auto &It : ArgumentReplacementMap) + DeleteContainerPointers(It.second); +} + bool Attributor::isAssumedDead(const AbstractAttribute &AA, const AAIsDead *FnLivenessAA, bool CheckBBLivenessOnly, DepClassTy DepClass) { @@ -8891,7 +8901,7 @@ #define SWITCH_PK_CREATE(CLASS, IRP, PK, SUFFIX) \ case IRPosition::PK: \ - AA = new CLASS##SUFFIX(IRP); \ + AA = new (A.Allocator) CLASS##SUFFIX(IRP); \ break; #define CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(CLASS) \