From 783607f8e8840bc0958b44fa76140f362c64bfda Mon Sep 17 00:00:00 2001 From: Geoff Berry Date: Wed, 1 Jun 2016 21:30:40 +0000 Subject: [PATCH] [MemorySSA] Port to new pass manager Add support for the new pass manager to MemorySSA pass. Change MemorySSA to be computed eagerly upon construction. Change MemorySSAWalker to be owned by the MemorySSA object that creates it. Reviewers: dberlin, george.burgess.iv Subscribers: mcrosier, llvm-commits Differential Revision: http://reviews.llvm.org/D19664 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@271432 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/InitializePasses.h | 3 +- include/llvm/Transforms/Utils/MemorySSA.h | 76 +++++------ lib/Passes/PassBuilder.cpp | 1 + lib/Passes/PassRegistry.def | 3 + lib/Transforms/Utils/MemorySSA.cpp | 128 ++++++++---------- lib/Transforms/Utils/Utils.cpp | 3 +- test/Transforms/Util/MemorySSA/assume.ll | 3 +- .../Util/MemorySSA/atomic-clobber.ll | 3 +- test/Transforms/Util/MemorySSA/cyclicphi.ll | 3 +- .../Util/MemorySSA/function-clobber.ll | 3 +- .../Util/MemorySSA/function-mem-attrs.ll | 3 +- test/Transforms/Util/MemorySSA/livein.ll | 3 +- .../Util/MemorySSA/load-invariant.ll | 3 +- .../Util/MemorySSA/many-dom-backedge.ll | 3 +- test/Transforms/Util/MemorySSA/many-doms.ll | 3 +- test/Transforms/Util/MemorySSA/multi-edges.ll | 3 +- .../Util/MemorySSA/multiple-backedges-hal.ll | 3 +- .../Util/MemorySSA/multiple-locations.ll | 3 +- .../Util/MemorySSA/no-disconnected.ll | 3 +- .../Transforms/Util/MemorySSA/optimize-use.ll | 3 +- .../Util/MemorySSA/phi-translation.ll | 3 +- .../Util/MemorySSA/volatile-clobber.ll | 3 +- unittests/Transforms/Utils/MemorySSA.cpp | 6 +- 23 files changed, 138 insertions(+), 130 deletions(-) diff --git a/include/llvm/InitializePasses.h b/include/llvm/InitializePasses.h index 260659c9d66..5ba07b7b955 100644 --- a/include/llvm/InitializePasses.h +++ b/include/llvm/InitializePasses.h @@ -221,8 +221,7 @@ void initializeMemCpyOptPass(PassRegistry&); void initializeMemDepPrinterPass(PassRegistry&); void initializeMemDerefPrinterPass(PassRegistry&); void initializeMemoryDependenceWrapperPassPass(PassRegistry&); -void initializeMemorySSALazyPass(PassRegistry&); -void initializeMemorySSAPrinterPassPass(PassRegistry&); +void initializeMemorySSAWrapperPassPass(PassRegistry&); void initializeMergedLoadStoreMotionPass(PassRegistry &); void initializeMetaRenamerPass(PassRegistry&); void initializeMergeFunctionsPass(PassRegistry&); diff --git a/include/llvm/Transforms/Utils/MemorySSA.h b/include/llvm/Transforms/Utils/MemorySSA.h index d2c494884fd..e9638e83ae6 100644 --- a/include/llvm/Transforms/Utils/MemorySSA.h +++ b/include/llvm/Transforms/Utils/MemorySSA.h @@ -495,15 +495,11 @@ class MemorySSAWalker; /// accesses. class MemorySSA { public: - MemorySSA(Function &); + MemorySSA(Function &, AliasAnalysis *, DominatorTree *); + MemorySSA(MemorySSA &&); ~MemorySSA(); - /// \brief Build Memory SSA, and return the walker we used during building, - /// for later reuse. If MemorySSA is already built, just return the walker. - MemorySSAWalker *buildMemorySSA(AliasAnalysis *, DominatorTree *); - - /// \brief Returns false if you need to call buildMemorySSA. - bool isFinishedBuilding() const { return Walker; } + MemorySSAWalker *getWalker(); /// \brief Given a memory Mod/Ref'ing instruction, get the MemorySSA /// access associated with it. If passed a basic block gets the memory phi @@ -561,7 +557,7 @@ public: protected: // Used by Memory SSA annotater, dumpers, and wrapper pass friend class MemorySSAAnnotatedWriter; - friend class MemorySSAPrinterPass; + friend class MemorySSAPrinterLegacyPass; void verifyDefUses(Function &F) const; void verifyDomination(Function &F) const; @@ -593,49 +589,51 @@ private: std::unique_ptr LiveOnEntryDef; // Memory SSA building info - MemorySSAWalker *Walker; + std::unique_ptr Walker; unsigned NextID; }; -// This pass does eager building and then printing of MemorySSA. It is used by -// the tests to be able to build, dump, and verify Memory SSA. -class MemorySSAPrinterPass : public FunctionPass { +/// An analysis that produces \c MemorySSA for a function. +/// +class MemorySSAAnalysis : public AnalysisInfoMixin { + friend AnalysisInfoMixin; + static char PassID; + public: - MemorySSAPrinterPass(); + typedef MemorySSA Result; - static char ID; - bool doInitialization(Module &M) override; - bool runOnFunction(Function &) override; - void releaseMemory() override; - void getAnalysisUsage(AnalysisUsage &AU) const override; - void print(raw_ostream &OS, const Module *M) const override; - static void registerOptions(); - MemorySSA &getMSSA() { return *MSSA; } - -private: - bool VerifyMemorySSA; - - std::unique_ptr MSSA; - // FIXME(gbiv): It seems that MemorySSA doesn't own the walker it returns? - std::unique_ptr Walker; - Function *F; + MemorySSA run(Function &F, AnalysisManager &AM); }; -class MemorySSALazy : public FunctionPass { +/// \brief Printer pass for \c MemorySSA. +class MemorySSAPrinterPass : public PassInfoMixin { + raw_ostream &OS; + public: - MemorySSALazy(); + explicit MemorySSAPrinterPass(raw_ostream &OS) : OS(OS) {} + PreservedAnalyses run(Function &F, AnalysisManager &AM); +}; + +/// \brief Verifier pass for \c MemorySSA. +struct MemorySSAVerifierPass : PassInfoMixin { + PreservedAnalyses run(Function &F, AnalysisManager &AM); +}; + +/// \brief Legacy analysis pass which computes \c MemorySSA. +class MemorySSAWrapperPass : public FunctionPass { +public: + MemorySSAWrapperPass(); static char ID; bool runOnFunction(Function &) override; void releaseMemory() override; - MemorySSA &getMSSA() { - assert(MSSA); - return *MSSA; - } + MemorySSA &getMSSA() { return *MSSA; } + const MemorySSA &getMSSA() const { return *MSSA; } - void getAnalysisUsage(AnalysisUsage &AU) const override { - AU.setPreservesAll(); - } + void getAnalysisUsage(AnalysisUsage &AU) const override; + + void verifyAnalysis() const override; + void print(raw_ostream &OS, const Module *M = nullptr) const override; private: std::unique_ptr MSSA; @@ -705,6 +703,8 @@ public: virtual void invalidateInfo(MemoryAccess *) {} protected: + friend class MemorySSA; // For updating MSSA pointer in MemorySSA move + // constructor. MemorySSA *MSSA; }; diff --git a/lib/Passes/PassBuilder.cpp b/lib/Passes/PassBuilder.cpp index fdf8c6982d5..5076fefbf7b 100644 --- a/lib/Passes/PassBuilder.cpp +++ b/lib/Passes/PassBuilder.cpp @@ -80,6 +80,7 @@ #include "llvm/Transforms/Scalar/SROA.h" #include "llvm/Transforms/Scalar/SimplifyCFG.h" #include "llvm/Transforms/Scalar/Sink.h" +#include "llvm/Transforms/Utils/MemorySSA.h" #include using namespace llvm; diff --git a/lib/Passes/PassRegistry.def b/lib/Passes/PassRegistry.def index 9aaf17779da..ffd3bcbcf7e 100644 --- a/lib/Passes/PassRegistry.def +++ b/lib/Passes/PassRegistry.def @@ -86,6 +86,7 @@ FUNCTION_ANALYSIS("domfrontier", DominanceFrontierAnalysis()) FUNCTION_ANALYSIS("loops", LoopAnalysis()) FUNCTION_ANALYSIS("da", DependenceAnalysis()) FUNCTION_ANALYSIS("memdep", MemoryDependenceAnalysis()) +FUNCTION_ANALYSIS("memoryssa", MemorySSAAnalysis()) FUNCTION_ANALYSIS("regions", RegionInfoAnalysis()) FUNCTION_ANALYSIS("no-op-function", NoOpFunctionAnalysis()) FUNCTION_ANALYSIS("scalar-evolution", ScalarEvolutionAnalysis()) @@ -132,6 +133,7 @@ FUNCTION_PASS("print", PostDominatorTreePrinterPass(dbgs())) FUNCTION_PASS("print", DemandedBitsPrinterPass(dbgs())) FUNCTION_PASS("print", DominanceFrontierPrinterPass(dbgs())) FUNCTION_PASS("print", LoopPrinterPass(dbgs())) +FUNCTION_PASS("print", MemorySSAPrinterPass(dbgs())) FUNCTION_PASS("print", RegionInfoPrinterPass(dbgs())) FUNCTION_PASS("print", ScalarEvolutionPrinterPass(dbgs())) FUNCTION_PASS("reassociate", ReassociatePass()) @@ -141,6 +143,7 @@ FUNCTION_PASS("sink", SinkingPass()) FUNCTION_PASS("sroa", SROA()) FUNCTION_PASS("verify", VerifierPass()) FUNCTION_PASS("verify", DominatorTreeVerifierPass()) +FUNCTION_PASS("verify", MemorySSAVerifierPass()) FUNCTION_PASS("verify", RegionInfoVerifierPass()) #undef FUNCTION_PASS diff --git a/lib/Transforms/Utils/MemorySSA.cpp b/lib/Transforms/Utils/MemorySSA.cpp index 9d8c0884fdb..5946b99d146 100644 --- a/lib/Transforms/Utils/MemorySSA.cpp +++ b/lib/Transforms/Utils/MemorySSA.cpp @@ -46,14 +46,12 @@ using namespace llvm; STATISTIC(NumClobberCacheLookups, "Number of Memory SSA version cache lookups"); STATISTIC(NumClobberCacheHits, "Number of Memory SSA version cache hits"); STATISTIC(NumClobberCacheInserts, "Number of MemorySSA version cache inserts"); -INITIALIZE_PASS_WITH_OPTIONS_BEGIN(MemorySSAPrinterPass, "print-memoryssa", - "Memory SSA", true, true) + +INITIALIZE_PASS_BEGIN(MemorySSAWrapperPass, "memoryssa", "Memory SSA", true, + true) INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass) INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass) -INITIALIZE_PASS_DEPENDENCY(GlobalsAAWrapperPass) -INITIALIZE_PASS_END(MemorySSAPrinterPass, "print-memoryssa", "Memory SSA", true, - true) -INITIALIZE_PASS(MemorySSALazy, "memoryssalazy", "Memory SSA", true, true) +INITIALIZE_PASS_END(MemorySSAWrapperPass, "memoryssa", "Memory SSA", true, true) namespace llvm { @@ -203,9 +201,22 @@ void MemorySSA::markUnreachableAsLiveOnEntry(BasicBlock *BB) { } } -MemorySSA::MemorySSA(Function &Func) - : AA(nullptr), DT(nullptr), F(Func), LiveOnEntryDef(nullptr), - Walker(nullptr), NextID(0) {} +MemorySSA::MemorySSA(Function &Func, AliasAnalysis *AA, DominatorTree *DT) + : AA(AA), DT(DT), F(Func), LiveOnEntryDef(nullptr), Walker(nullptr), + NextID(0) { + getWalker(); // Ensure MemorySSA has been built. +} + +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)), + 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 @@ -222,17 +233,11 @@ MemorySSA::AccessListType *MemorySSA::getOrCreateAccessList(BasicBlock *BB) { return Res.first->second.get(); } -MemorySSAWalker *MemorySSA::buildMemorySSA(AliasAnalysis *AA, - DominatorTree *DT) { +MemorySSAWalker *MemorySSA::getWalker() { if (Walker) - return Walker; + return Walker.get(); - assert(!this->AA && !this->DT && - "MemorySSA without a walker already has AA or DT?"); - - Walker = new CachingMemorySSAWalker(this, AA, DT); - this->AA = AA; - this->DT = DT; + Walker = make_unique(this, AA, DT); // We create an access to represent "live on entry", for things like // arguments or users of globals, where the memory they use is defined before @@ -349,7 +354,7 @@ MemorySSAWalker *MemorySSA::buildMemorySSA(AliasAnalysis *AA, if (!Visited.count(&BB)) markUnreachableAsLiveOnEntry(&BB); - return Walker; + return Walker.get(); } /// \brief Helper function to create new memory accesses @@ -684,71 +689,56 @@ void MemoryAccess::dump() const { dbgs() << "\n"; } -char MemorySSAPrinterPass::ID = 0; +char MemorySSAAnalysis::PassID; -MemorySSAPrinterPass::MemorySSAPrinterPass() : FunctionPass(ID) { - initializeMemorySSAPrinterPassPass(*PassRegistry::getPassRegistry()); +MemorySSA MemorySSAAnalysis::run(Function &F, AnalysisManager &AM) { + auto &DT = AM.getResult(F); + auto &AA = AM.getResult(F); + return MemorySSA(F, &AA, &DT); } -void MemorySSAPrinterPass::releaseMemory() { - // Subtlety: Be sure to delete the walker before MSSA, because the walker's - // dtor may try to access MemorySSA. - Walker.reset(); - MSSA.reset(); +PreservedAnalyses MemorySSAPrinterPass::run(Function &F, + FunctionAnalysisManager &AM) { + OS << "MemorySSA for function: " << F.getName() << "\n"; + AM.getResult(F).print(OS); + + return PreservedAnalyses::all(); } -void MemorySSAPrinterPass::getAnalysisUsage(AnalysisUsage &AU) const { +PreservedAnalyses MemorySSAVerifierPass::run(Function &F, + FunctionAnalysisManager &AM) { + AM.getResult(F).verifyMemorySSA(); + + return PreservedAnalyses::all(); +} + +char MemorySSAWrapperPass::ID = 0; + +MemorySSAWrapperPass::MemorySSAWrapperPass() : FunctionPass(ID) { + initializeMemorySSAWrapperPassPass(*PassRegistry::getPassRegistry()); +} + +void MemorySSAWrapperPass::releaseMemory() { MSSA.reset(); } + +void MemorySSAWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); - AU.addRequired(); - AU.addRequired(); - AU.addPreserved(); - AU.addPreserved(); + AU.addRequiredTransitive(); + AU.addRequiredTransitive(); } -bool MemorySSAPrinterPass::doInitialization(Module &M) { - VerifyMemorySSA = M.getContext() - .getOption(); +bool MemorySSAWrapperPass::runOnFunction(Function &F) { + auto &DT = getAnalysis().getDomTree(); + auto &AA = getAnalysis().getAAResults(); + MSSA.reset(new MemorySSA(F, &AA, &DT)); return false; } -void MemorySSAPrinterPass::registerOptions() { - OptionRegistry::registerOption( - "verify-memoryssa", "Run the Memory SSA verifier", false); -} +void MemorySSAWrapperPass::verifyAnalysis() const { MSSA->verifyMemorySSA(); } -void MemorySSAPrinterPass::print(raw_ostream &OS, const Module *M) const { +void MemorySSAWrapperPass::print(raw_ostream &OS, const Module *M) const { MSSA->print(OS); } -bool MemorySSAPrinterPass::runOnFunction(Function &F) { - this->F = &F; - MSSA.reset(new MemorySSA(F)); - AliasAnalysis *AA = &getAnalysis().getAAResults(); - DominatorTree *DT = &getAnalysis().getDomTree(); - Walker.reset(MSSA->buildMemorySSA(AA, DT)); - - if (VerifyMemorySSA) { - MSSA->verifyMemorySSA(); - } - - return false; -} - -char MemorySSALazy::ID = 0; - -MemorySSALazy::MemorySSALazy() : FunctionPass(ID) { - initializeMemorySSALazyPass(*PassRegistry::getPassRegistry()); -} - -void MemorySSALazy::releaseMemory() { MSSA.reset(); } - -bool MemorySSALazy::runOnFunction(Function &F) { - MSSA.reset(new MemorySSA(F)); - return false; -} - MemorySSAWalker::MemorySSAWalker(MemorySSA *M) : MSSA(M) {} CachingMemorySSAWalker::CachingMemorySSAWalker(MemorySSA *M, AliasAnalysis *A, diff --git a/lib/Transforms/Utils/Utils.cpp b/lib/Transforms/Utils/Utils.cpp index 7e129c44ccd..ee321d37138 100644 --- a/lib/Transforms/Utils/Utils.cpp +++ b/lib/Transforms/Utils/Utils.cpp @@ -33,8 +33,7 @@ void llvm::initializeTransformUtils(PassRegistry &Registry) { initializeUnifyFunctionExitNodesPass(Registry); initializeInstSimplifierPass(Registry); initializeMetaRenamerPass(Registry); - initializeMemorySSALazyPass(Registry); - initializeMemorySSAPrinterPassPass(Registry); + initializeMemorySSAWrapperPassPass(Registry); } /// LLVMInitializeTransformUtils - C binding for initializeTransformUtilsPasses. diff --git a/test/Transforms/Util/MemorySSA/assume.ll b/test/Transforms/Util/MemorySSA/assume.ll index 8496eb9c12d..d771c78eb1c 100644 --- a/test/Transforms/Util/MemorySSA/assume.ll +++ b/test/Transforms/Util/MemorySSA/assume.ll @@ -1,4 +1,5 @@ -; RUN: opt -basicaa -print-memoryssa -verify-memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -basicaa -memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -aa-pipeline=basic-aa -passes='print,verify' -disable-output < %s 2>&1 | FileCheck %s ; ; Ensures that assumes are treated as not reading or writing memory. diff --git a/test/Transforms/Util/MemorySSA/atomic-clobber.ll b/test/Transforms/Util/MemorySSA/atomic-clobber.ll index d1a10d90cb2..84c079af3fe 100644 --- a/test/Transforms/Util/MemorySSA/atomic-clobber.ll +++ b/test/Transforms/Util/MemorySSA/atomic-clobber.ll @@ -1,4 +1,5 @@ -; RUN: opt -basicaa -print-memoryssa -verify-memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -basicaa -memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -aa-pipeline=basic-aa -passes='print,verify' -disable-output < %s 2>&1 | FileCheck %s ; ; Ensures that atomic loads count as MemoryDefs diff --git a/test/Transforms/Util/MemorySSA/cyclicphi.ll b/test/Transforms/Util/MemorySSA/cyclicphi.ll index 6367f6b7329..357ed7d08cf 100644 --- a/test/Transforms/Util/MemorySSA/cyclicphi.ll +++ b/test/Transforms/Util/MemorySSA/cyclicphi.ll @@ -1,4 +1,5 @@ -; RUN: opt -basicaa -print-memoryssa -verify-memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -basicaa -memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -aa-pipeline=basic-aa -passes='print,verify' -disable-output < %s 2>&1 | FileCheck %s %struct.hoge = type { i32, %struct.widget } %struct.widget = type { i64 } diff --git a/test/Transforms/Util/MemorySSA/function-clobber.ll b/test/Transforms/Util/MemorySSA/function-clobber.ll index 937ab245191..869f7d78713 100644 --- a/test/Transforms/Util/MemorySSA/function-clobber.ll +++ b/test/Transforms/Util/MemorySSA/function-clobber.ll @@ -1,4 +1,5 @@ -; RUN: opt -basicaa -print-memoryssa -verify-memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -basicaa -memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -aa-pipeline=basic-aa -passes='print,verify' -disable-output < %s 2>&1 | FileCheck %s ; ; Ensuring that external functions without attributes are MemoryDefs diff --git a/test/Transforms/Util/MemorySSA/function-mem-attrs.ll b/test/Transforms/Util/MemorySSA/function-mem-attrs.ll index ab36f039740..e3328d9257e 100644 --- a/test/Transforms/Util/MemorySSA/function-mem-attrs.ll +++ b/test/Transforms/Util/MemorySSA/function-mem-attrs.ll @@ -1,4 +1,5 @@ -; RUN: opt -basicaa -print-memoryssa -verify-memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -basicaa -memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -aa-pipeline=basic-aa -passes='print,verify' -disable-output < %s 2>&1 | FileCheck %s ; ; Test that various function attributes give us sane results. diff --git a/test/Transforms/Util/MemorySSA/livein.ll b/test/Transforms/Util/MemorySSA/livein.ll index 92d09f9c681..704121a9833 100644 --- a/test/Transforms/Util/MemorySSA/livein.ll +++ b/test/Transforms/Util/MemorySSA/livein.ll @@ -1,4 +1,5 @@ -; RUN: opt -basicaa -print-memoryssa -verify-memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -basicaa -memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -aa-pipeline=basic-aa -passes='print,verify' -disable-output < %s 2>&1 | FileCheck %s define void @F(i8*) { br i1 true, label %left, label %right left: diff --git a/test/Transforms/Util/MemorySSA/load-invariant.ll b/test/Transforms/Util/MemorySSA/load-invariant.ll index 188a4c46d32..669fc88599c 100644 --- a/test/Transforms/Util/MemorySSA/load-invariant.ll +++ b/test/Transforms/Util/MemorySSA/load-invariant.ll @@ -1,5 +1,6 @@ ; XFAIL: * -; RUN: opt -basicaa -print-memoryssa -verify-memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -basicaa -memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -aa-pipeline=basic-aa -passes='print' -verify-memoryssa -disable-output < %s 2>&1 | FileCheck %s ; ; Invariant loads should be considered live on entry, because, once the ; location is known to be dereferenceable, the value can never change. diff --git a/test/Transforms/Util/MemorySSA/many-dom-backedge.ll b/test/Transforms/Util/MemorySSA/many-dom-backedge.ll index 49f9145b9d3..9db660b84bf 100644 --- a/test/Transforms/Util/MemorySSA/many-dom-backedge.ll +++ b/test/Transforms/Util/MemorySSA/many-dom-backedge.ll @@ -1,4 +1,5 @@ -; RUN: opt -basicaa -print-memoryssa -verify-memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -basicaa -memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -aa-pipeline=basic-aa -passes='print,verify' -disable-output < %s 2>&1 | FileCheck %s ; ; many-dom.ll, with an added back-edge back into the switch. ; Because people love their gotos. diff --git a/test/Transforms/Util/MemorySSA/many-doms.ll b/test/Transforms/Util/MemorySSA/many-doms.ll index 733accd3dd1..44f64b5126b 100644 --- a/test/Transforms/Util/MemorySSA/many-doms.ll +++ b/test/Transforms/Util/MemorySSA/many-doms.ll @@ -1,4 +1,5 @@ -; RUN: opt -basicaa -print-memoryssa -verify-memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -basicaa -memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -aa-pipeline=basic-aa -passes='print,verify' -disable-output < %s 2>&1 | FileCheck %s ; ; Testing many dominators, specifically from a switch statement in C. diff --git a/test/Transforms/Util/MemorySSA/multi-edges.ll b/test/Transforms/Util/MemorySSA/multi-edges.ll index 882a35ddf10..68830e6bf3b 100644 --- a/test/Transforms/Util/MemorySSA/multi-edges.ll +++ b/test/Transforms/Util/MemorySSA/multi-edges.ll @@ -1,4 +1,5 @@ -; RUN: opt -basicaa -print-memoryssa -verify-memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -basicaa -memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -aa-pipeline=basic-aa -passes='print,verify' -disable-output < %s 2>&1 | FileCheck %s ; ; Makes sure we have a sane model if both successors of some block is the same ; block. diff --git a/test/Transforms/Util/MemorySSA/multiple-backedges-hal.ll b/test/Transforms/Util/MemorySSA/multiple-backedges-hal.ll index 7afd7c4940f..554e9d144e0 100644 --- a/test/Transforms/Util/MemorySSA/multiple-backedges-hal.ll +++ b/test/Transforms/Util/MemorySSA/multiple-backedges-hal.ll @@ -1,4 +1,5 @@ -; RUN: opt -basicaa -print-memoryssa -verify-memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -basicaa -memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -aa-pipeline=basic-aa -passes='print,verify' -disable-output < %s 2>&1 | FileCheck %s ; hfinkel's case ; [entry] diff --git a/test/Transforms/Util/MemorySSA/multiple-locations.ll b/test/Transforms/Util/MemorySSA/multiple-locations.ll index f4fe1d1a0b5..b70eaf200f6 100644 --- a/test/Transforms/Util/MemorySSA/multiple-locations.ll +++ b/test/Transforms/Util/MemorySSA/multiple-locations.ll @@ -1,4 +1,5 @@ -; RUN: opt -basicaa -print-memoryssa -verify-memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -basicaa -memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -aa-pipeline=basic-aa -passes='print,verify' -disable-output < %s 2>&1 | FileCheck %s ; ; Checks that basicAA is doing some amount of disambiguation for us diff --git a/test/Transforms/Util/MemorySSA/no-disconnected.ll b/test/Transforms/Util/MemorySSA/no-disconnected.ll index f302f2bffc6..7562ca21af7 100644 --- a/test/Transforms/Util/MemorySSA/no-disconnected.ll +++ b/test/Transforms/Util/MemorySSA/no-disconnected.ll @@ -1,4 +1,5 @@ -; RUN: opt -basicaa -print-memoryssa -analyze -verify-memoryssa < %s 2>&1 | FileCheck %s +; RUN: opt -basicaa -memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -aa-pipeline=basic-aa -passes='print,verify' -disable-output < %s 2>&1 | FileCheck %s ; ; This test ensures we don't end up with multiple reaching defs for a single ; use/phi edge If we were to optimize defs, we would end up with 2= diff --git a/test/Transforms/Util/MemorySSA/optimize-use.ll b/test/Transforms/Util/MemorySSA/optimize-use.ll index fccdc6450b6..0ac07b0f0d0 100644 --- a/test/Transforms/Util/MemorySSA/optimize-use.ll +++ b/test/Transforms/Util/MemorySSA/optimize-use.ll @@ -1,4 +1,5 @@ -; RUN: opt -basicaa -print-memoryssa -analyze -verify-memoryssa < %s 2>&1 | FileCheck %s +; RUN: opt -basicaa -memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -aa-pipeline=basic-aa -passes='print,verify' -disable-output < %s 2>&1 | FileCheck %s ; Function Attrs: ssp uwtable define i32 @main() { diff --git a/test/Transforms/Util/MemorySSA/phi-translation.ll b/test/Transforms/Util/MemorySSA/phi-translation.ll index f0f5da99617..f2019fc119f 100644 --- a/test/Transforms/Util/MemorySSA/phi-translation.ll +++ b/test/Transforms/Util/MemorySSA/phi-translation.ll @@ -1,4 +1,5 @@ -; RUN: opt -basicaa -print-memoryssa -verify-memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -basicaa -memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -aa-pipeline=basic-aa -passes='print,verify' -disable-output < %s 2>&1 | FileCheck %s ; %ptr can't alias %local, so we should be able to optimize the use of %local to ; point to the store to %local. diff --git a/test/Transforms/Util/MemorySSA/volatile-clobber.ll b/test/Transforms/Util/MemorySSA/volatile-clobber.ll index 78b6e8fcd6a..2a8af317699 100644 --- a/test/Transforms/Util/MemorySSA/volatile-clobber.ll +++ b/test/Transforms/Util/MemorySSA/volatile-clobber.ll @@ -1,4 +1,5 @@ -; RUN: opt -basicaa -print-memoryssa -verify-memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -basicaa -memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -aa-pipeline=basic-aa -passes='print,verify' -disable-output < %s 2>&1 | FileCheck %s ; ; Ensures that volatile stores/loads count as MemoryDefs diff --git a/unittests/Transforms/Utils/MemorySSA.cpp b/unittests/Transforms/Utils/MemorySSA.cpp index 5a226da476c..b59e4fbc55e 100644 --- a/unittests/Transforms/Utils/MemorySSA.cpp +++ b/unittests/Transforms/Utils/MemorySSA.cpp @@ -43,13 +43,13 @@ protected: AAResults AA; BasicAAResult BAA; MemorySSA MSSA; - std::unique_ptr Walker; + MemorySSAWalker *Walker; TestAnalyses(MemorySSATest &Test) : DT(*Test.F), AC(*Test.F), AA(Test.TLI), - BAA(Test.DL, Test.TLI, AC, &DT), MSSA(*Test.F) { + BAA(Test.DL, Test.TLI, AC, &DT), MSSA(*Test.F, &AA, &DT) { AA.addAAResult(BAA); - Walker.reset(MSSA.buildMemorySSA(&AA, &DT)); + Walker = MSSA.getWalker(); } };