From: Chad Rosier Date: Wed, 6 Jul 2016 21:20:47 +0000 (+0000) Subject: [MemorySSA] Reinstate the legacy printer and verifier. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=705101d8000f9ce5f13d4c6e439b1bd63b6380dc;p=llvm [MemorySSA] Reinstate the legacy printer and verifier. Differential Revision: http://reviews.llvm.org/D22058 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@274679 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/InitializePasses.h b/include/llvm/InitializePasses.h index 67a74e012aa..7ac1e5c9ead 100644 --- a/include/llvm/InitializePasses.h +++ b/include/llvm/InitializePasses.h @@ -226,6 +226,7 @@ void initializeMemDepPrinterPass(PassRegistry&); void initializeMemDerefPrinterPass(PassRegistry&); void initializeMemoryDependenceWrapperPassPass(PassRegistry&); void initializeMemorySSAWrapperPassPass(PassRegistry&); +void initializeMemorySSAPrinterLegacyPassPass(PassRegistry &); void initializeMemorySanitizerPass(PassRegistry&); void initializeMergeFunctionsPass(PassRegistry&); void initializeMergedLoadStoreMotionLegacyPassPass(PassRegistry &); diff --git a/include/llvm/Transforms/Utils/MemorySSA.h b/include/llvm/Transforms/Utils/MemorySSA.h index cec36a8cc0b..befc34cb80f 100644 --- a/include/llvm/Transforms/Utils/MemorySSA.h +++ b/include/llvm/Transforms/Utils/MemorySSA.h @@ -626,6 +626,17 @@ private: 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 MemorySSAPrinterLegacyPass : public FunctionPass { +public: + MemorySSAPrinterLegacyPass(); + + static char ID; + bool runOnFunction(Function &) override; + void getAnalysisUsage(AnalysisUsage &AU) const override; +}; + /// An analysis that produces \c MemorySSA for a function. /// class MemorySSAAnalysis : public AnalysisInfoMixin { diff --git a/lib/Transforms/Utils/MemorySSA.cpp b/lib/Transforms/Utils/MemorySSA.cpp index d13cfe35470..0aed1334571 100644 --- a/lib/Transforms/Utils/MemorySSA.cpp +++ b/lib/Transforms/Utils/MemorySSA.cpp @@ -54,6 +54,16 @@ INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass) INITIALIZE_PASS_END(MemorySSAWrapperPass, "memoryssa", "Memory SSA", false, true) +INITIALIZE_PASS_BEGIN(MemorySSAPrinterLegacyPass, "print-memoryssa", + "Memory SSA Printer", false, false) +INITIALIZE_PASS_DEPENDENCY(MemorySSAWrapperPass) +INITIALIZE_PASS_END(MemorySSAPrinterLegacyPass, "print-memoryssa", + "Memory SSA Printer", false, false) + +static cl::opt + VerifyMemorySSA("verify-memoryssa", cl::init(false), cl::Hidden, + cl::desc("Verify MemorySSA in legacy printer pass.")); + namespace llvm { /// \brief An assembly annotator class to print Memory SSA information in /// comments. @@ -894,6 +904,26 @@ void MemoryAccess::dump() const { dbgs() << "\n"; } +char MemorySSAPrinterLegacyPass::ID = 0; + +MemorySSAPrinterLegacyPass::MemorySSAPrinterLegacyPass() : FunctionPass(ID) { + initializeMemorySSAPrinterLegacyPassPass(*PassRegistry::getPassRegistry()); +} + +void MemorySSAPrinterLegacyPass::getAnalysisUsage(AnalysisUsage &AU) const { + AU.setPreservesAll(); + AU.addRequired(); + AU.addPreserved(); +} + +bool MemorySSAPrinterLegacyPass::runOnFunction(Function &F) { + auto &MSSA = getAnalysis().getMSSA(); + MSSA.print(dbgs()); + if (VerifyMemorySSA) + MSSA.verifyMemorySSA(); + return false; +} + char MemorySSAAnalysis::PassID; MemorySSA MemorySSAAnalysis::run(Function &F, AnalysisManager &AM) { diff --git a/lib/Transforms/Utils/Utils.cpp b/lib/Transforms/Utils/Utils.cpp index e363dd40da7..8f85f19efe3 100644 --- a/lib/Transforms/Utils/Utils.cpp +++ b/lib/Transforms/Utils/Utils.cpp @@ -34,6 +34,7 @@ void llvm::initializeTransformUtils(PassRegistry &Registry) { initializeInstSimplifierPass(Registry); initializeMetaRenamerPass(Registry); initializeMemorySSAWrapperPassPass(Registry); + initializeMemorySSAPrinterLegacyPassPass(Registry); } /// LLVMInitializeTransformUtils - C binding for initializeTransformUtilsPasses. diff --git a/test/Transforms/Util/MemorySSA/atomic-clobber.ll b/test/Transforms/Util/MemorySSA/atomic-clobber.ll index 84c079af3fe..217d5f65d78 100644 --- a/test/Transforms/Util/MemorySSA/atomic-clobber.ll +++ b/test/Transforms/Util/MemorySSA/atomic-clobber.ll @@ -1,4 +1,4 @@ -; RUN: opt -basicaa -memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -basicaa -print-memoryssa -verify-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 357ed7d08cf..c9a5422e0a1 100644 --- a/test/Transforms/Util/MemorySSA/cyclicphi.ll +++ b/test/Transforms/Util/MemorySSA/cyclicphi.ll @@ -1,4 +1,4 @@ -; RUN: opt -basicaa -memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -basicaa -print-memoryssa -verify-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 } diff --git a/test/Transforms/Util/MemorySSA/function-clobber.ll b/test/Transforms/Util/MemorySSA/function-clobber.ll index 869f7d78713..a01893a5b95 100644 --- a/test/Transforms/Util/MemorySSA/function-clobber.ll +++ b/test/Transforms/Util/MemorySSA/function-clobber.ll @@ -1,4 +1,4 @@ -; RUN: opt -basicaa -memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -basicaa -print-memoryssa -verify-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 e3328d9257e..11383771a41 100644 --- a/test/Transforms/Util/MemorySSA/function-mem-attrs.ll +++ b/test/Transforms/Util/MemorySSA/function-mem-attrs.ll @@ -1,4 +1,4 @@ -; RUN: opt -basicaa -memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -basicaa -print-memoryssa -verify-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 704121a9833..93072ea97da 100644 --- a/test/Transforms/Util/MemorySSA/livein.ll +++ b/test/Transforms/Util/MemorySSA/livein.ll @@ -1,4 +1,4 @@ -; RUN: opt -basicaa -memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -basicaa -print-memoryssa -verify-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 diff --git a/test/Transforms/Util/MemorySSA/load-invariant.ll b/test/Transforms/Util/MemorySSA/load-invariant.ll index 669fc88599c..e387ff4c530 100644 --- a/test/Transforms/Util/MemorySSA/load-invariant.ll +++ b/test/Transforms/Util/MemorySSA/load-invariant.ll @@ -1,5 +1,5 @@ ; XFAIL: * -; RUN: opt -basicaa -memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -basicaa -print-memoryssa -verify-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 diff --git a/test/Transforms/Util/MemorySSA/many-dom-backedge.ll b/test/Transforms/Util/MemorySSA/many-dom-backedge.ll index 9db660b84bf..3d76f4af2d6 100644 --- a/test/Transforms/Util/MemorySSA/many-dom-backedge.ll +++ b/test/Transforms/Util/MemorySSA/many-dom-backedge.ll @@ -1,4 +1,4 @@ -; RUN: opt -basicaa -memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -basicaa -print-memoryssa -verify-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. diff --git a/test/Transforms/Util/MemorySSA/many-doms.ll b/test/Transforms/Util/MemorySSA/many-doms.ll index 44f64b5126b..d2e6c6fa1e4 100644 --- a/test/Transforms/Util/MemorySSA/many-doms.ll +++ b/test/Transforms/Util/MemorySSA/many-doms.ll @@ -1,4 +1,4 @@ -; RUN: opt -basicaa -memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -basicaa -print-memoryssa -verify-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 68830e6bf3b..c13fc016b2c 100644 --- a/test/Transforms/Util/MemorySSA/multi-edges.ll +++ b/test/Transforms/Util/MemorySSA/multi-edges.ll @@ -1,4 +1,4 @@ -; RUN: opt -basicaa -memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -basicaa -print-memoryssa -verify-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 diff --git a/test/Transforms/Util/MemorySSA/multiple-backedges-hal.ll b/test/Transforms/Util/MemorySSA/multiple-backedges-hal.ll index 554e9d144e0..473b3685801 100644 --- a/test/Transforms/Util/MemorySSA/multiple-backedges-hal.ll +++ b/test/Transforms/Util/MemorySSA/multiple-backedges-hal.ll @@ -1,4 +1,4 @@ -; RUN: opt -basicaa -memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -basicaa -print-memoryssa -verify-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 diff --git a/test/Transforms/Util/MemorySSA/multiple-locations.ll b/test/Transforms/Util/MemorySSA/multiple-locations.ll index b70eaf200f6..9a3e87e4ab6 100644 --- a/test/Transforms/Util/MemorySSA/multiple-locations.ll +++ b/test/Transforms/Util/MemorySSA/multiple-locations.ll @@ -1,4 +1,4 @@ -; RUN: opt -basicaa -memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -basicaa -print-memoryssa -verify-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 7562ca21af7..d1dcb15893a 100644 --- a/test/Transforms/Util/MemorySSA/no-disconnected.ll +++ b/test/Transforms/Util/MemorySSA/no-disconnected.ll @@ -1,4 +1,4 @@ -; RUN: opt -basicaa -memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -basicaa -print-memoryssa -verify-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 diff --git a/test/Transforms/Util/MemorySSA/optimize-use.ll b/test/Transforms/Util/MemorySSA/optimize-use.ll index 0ac07b0f0d0..8a8f2dd5095 100644 --- a/test/Transforms/Util/MemorySSA/optimize-use.ll +++ b/test/Transforms/Util/MemorySSA/optimize-use.ll @@ -1,4 +1,4 @@ -; RUN: opt -basicaa -memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -basicaa -print-memoryssa -verify-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 diff --git a/test/Transforms/Util/MemorySSA/phi-translation.ll b/test/Transforms/Util/MemorySSA/phi-translation.ll index f2019fc119f..30cd011a119 100644 --- a/test/Transforms/Util/MemorySSA/phi-translation.ll +++ b/test/Transforms/Util/MemorySSA/phi-translation.ll @@ -1,4 +1,4 @@ -; RUN: opt -basicaa -memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -basicaa -print-memoryssa -verify-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 diff --git a/test/Transforms/Util/MemorySSA/volatile-clobber.ll b/test/Transforms/Util/MemorySSA/volatile-clobber.ll index 2a8af317699..baad8d8c2d1 100644 --- a/test/Transforms/Util/MemorySSA/volatile-clobber.ll +++ b/test/Transforms/Util/MemorySSA/volatile-clobber.ll @@ -1,4 +1,4 @@ -; RUN: opt -basicaa -memoryssa -analyze < %s 2>&1 | FileCheck %s +; RUN: opt -basicaa -print-memoryssa -verify-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