diff options
| author | Geoff Berry <gberry@codeaurora.org> | 2016-08-08 17:52:01 +0000 | 
|---|---|---|
| committer | Geoff Berry <gberry@codeaurora.org> | 2016-08-08 17:52:01 +0000 | 
| commit | cdf5333f6f89d4c5260a3ea25e299821ed8e8f94 (patch) | |
| tree | 27ea436f1b542924ba0127de7448e036252ae263 /llvm/lib/Transforms | |
| parent | 3ee803a89587d37c1f5aa11d044bf036549f7aa1 (diff) | |
| download | bcm5719-llvm-cdf5333f6f89d4c5260a3ea25e299821ed8e8f94.tar.gz bcm5719-llvm-cdf5333f6f89d4c5260a3ea25e299821ed8e8f94.zip | |
[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
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Utils/MemorySSA.cpp | 30 | 
1 files changed, 13 insertions, 17 deletions
| diff --git a/llvm/lib/Transforms/Utils/MemorySSA.cpp b/llvm/lib/Transforms/Utils/MemorySSA.cpp index 234d1af569c..f349958244e 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<Function> &AM) { +std::unique_ptr<MemorySSA> +MemorySSAAnalysis::run(Function &F, AnalysisManager<Function> &AM) {    auto &DT = AM.getResult<DominatorTreeAnalysis>(F);    auto &AA = AM.getResult<AAManager>(F); -  return MemorySSA(F, &AA, &DT); +  return make_unique<MemorySSA>(F, &AA, &DT);  }  PreservedAnalyses MemorySSAPrinterPass::run(Function &F,                                              FunctionAnalysisManager &AM) {    OS << "MemorySSA for function: " << F.getName() << "\n"; -  AM.getResult<MemorySSAAnalysis>(F).print(OS); +  AM.getResult<MemorySSAAnalysis>(F)->print(OS);    return PreservedAnalyses::all();  }  PreservedAnalyses MemorySSAVerifierPass::run(Function &F,                                               FunctionAnalysisManager &AM) { -  AM.getResult<MemorySSAAnalysis>(F).verifyMemorySSA(); +  AM.getResult<MemorySSAAnalysis>(F)->verifyMemorySSA();    return PreservedAnalyses::all();  } | 

