From cdf5333f6f89d4c5260a3ea25e299821ed8e8f94 Mon Sep 17 00:00:00 2001 From: Geoff Berry Date: Mon, 8 Aug 2016 17:52:01 +0000 Subject: [PATCH] [MemorySSA] Ensure address stability of MemorySSA object. Summary: Ensure that the MemorySSA object never changes address when using the new pass manager since the walkers contained by MemorySSA cache pointers to it at construction time. This is achieved by wrapping the MemorySSAAnalysis result in a unique_ptr. Also add some asserts that check for this bug. Reviewers: george.burgess.iv, dberlin Subscribers: mcrosier, hfinkel, chandlerc, silvas, llvm-commits Differential Revision: https://reviews.llvm.org/D23171 llvm-svn: 278028 --- llvm/include/llvm/Transforms/Utils/MemorySSA.h | 7 +++--- llvm/lib/Transforms/Utils/MemorySSA.cpp | 30 +++++++++++--------------- 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/llvm/include/llvm/Transforms/Utils/MemorySSA.h b/llvm/include/llvm/Transforms/Utils/MemorySSA.h index ef42b79..b356e8a 100644 --- a/llvm/include/llvm/Transforms/Utils/MemorySSA.h +++ b/llvm/include/llvm/Transforms/Utils/MemorySSA.h @@ -494,7 +494,6 @@ class MemorySSAWalker; class MemorySSA { public: MemorySSA(Function &, AliasAnalysis *, DominatorTree *); - MemorySSA(MemorySSA &&); ~MemorySSA(); MemorySSAWalker *getWalker(); @@ -676,9 +675,9 @@ class MemorySSAAnalysis : public AnalysisInfoMixin { static char PassID; public: - typedef MemorySSA Result; + typedef std::unique_ptr Result; - MemorySSA run(Function &F, AnalysisManager &AM); + Result run(Function &F, AnalysisManager &AM); }; /// \brief Printer pass for \c MemorySSA. @@ -786,6 +785,8 @@ public: /// the walker it uses or returns. virtual void invalidateInfo(MemoryAccess *) {} + virtual void verify(const MemorySSA *MSSA) { assert(MSSA == this->MSSA); } + protected: friend class MemorySSA; // For updating MSSA pointer in MemorySSA move // constructor. diff --git a/llvm/lib/Transforms/Utils/MemorySSA.cpp b/llvm/lib/Transforms/Utils/MemorySSA.cpp index 234d1af..f349958 100644 --- a/llvm/lib/Transforms/Utils/MemorySSA.cpp +++ b/llvm/lib/Transforms/Utils/MemorySSA.cpp @@ -1025,6 +1025,8 @@ public: #endif return Result; } + + void verify(const MemorySSA *MSSA) { assert(MSSA == &this->MSSA); } }; struct RenamePassData { @@ -1104,6 +1106,11 @@ public: /// earliest-MemoryAccess-we-can-optimize-to". This is necessary if we're /// going to have DT updates, if we remove MemoryAccesses, etc. void resetClobberWalker() { Walker.reset(); } + + void verify(const MemorySSA *MSSA) override { + MemorySSAWalker::verify(MSSA); + Walker.verify(MSSA); + } }; /// \brief Rename a single basic block into MemorySSA form. @@ -1231,19 +1238,6 @@ MemorySSA::MemorySSA(Function &Func, AliasAnalysis *AA, DominatorTree *DT) buildMemorySSA(); } -MemorySSA::MemorySSA(MemorySSA &&MSSA) - : AA(MSSA.AA), DT(MSSA.DT), F(MSSA.F), - ValueToMemoryAccess(std::move(MSSA.ValueToMemoryAccess)), - PerBlockAccesses(std::move(MSSA.PerBlockAccesses)), - LiveOnEntryDef(std::move(MSSA.LiveOnEntryDef)), - BlockNumberingValid(std::move(MSSA.BlockNumberingValid)), - BlockNumbering(std::move(MSSA.BlockNumbering)), - Walker(std::move(MSSA.Walker)), NextID(MSSA.NextID) { - // Update the Walker MSSA pointer so it doesn't point to the moved-from MSSA - // object any more. - Walker->MSSA = this; -} - MemorySSA::~MemorySSA() { // Drop all our references for (const auto &Pair : PerBlockAccesses) @@ -1818,6 +1812,7 @@ void MemorySSA::verifyMemorySSA() const { verifyDefUses(F); verifyDomination(F); verifyOrdering(F); + Walker->verify(this); } /// \brief Verify that the order and existence of MemoryAccesses matches the @@ -2083,23 +2078,24 @@ bool MemorySSAPrinterLegacyPass::runOnFunction(Function &F) { char MemorySSAAnalysis::PassID; -MemorySSA MemorySSAAnalysis::run(Function &F, AnalysisManager &AM) { +std::unique_ptr +MemorySSAAnalysis::run(Function &F, AnalysisManager &AM) { auto &DT = AM.getResult(F); auto &AA = AM.getResult(F); - return MemorySSA(F, &AA, &DT); + return make_unique(F, &AA, &DT); } PreservedAnalyses MemorySSAPrinterPass::run(Function &F, FunctionAnalysisManager &AM) { OS << "MemorySSA for function: " << F.getName() << "\n"; - AM.getResult(F).print(OS); + AM.getResult(F)->print(OS); return PreservedAnalyses::all(); } PreservedAnalyses MemorySSAVerifierPass::run(Function &F, FunctionAnalysisManager &AM) { - AM.getResult(F).verifyMemorySSA(); + AM.getResult(F)->verifyMemorySSA(); return PreservedAnalyses::all(); } -- 2.7.4