From: Alina Sbirlea Date: Tue, 23 Apr 2019 20:59:44 +0000 (+0000) Subject: [MemorySSA] LCSSA preserves MemorySSA. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a7a3e6435dcc4e24e009fd64f4160de0a65cf4bb;p=llvm [MemorySSA] LCSSA preserves MemorySSA. Summary: Enabling MemorySSA in the old pass manager leads to MemorySSA being run twice due to the fact that LCSSA and LoopSimplify do not preserve MemorySSA. This is the first step to address that: target LCSSA. LCSSA does not make any changes that invalidate MemorySSA, so it preserves it by design. It must preserve AA as well, for this to hold. After this patch, MemorySSA is still run twice in the old pass manager. Step two follows: target LoopSimplify. Subscribers: mehdi_amini, jlebar, Prazek, llvm-commits, george.burgess.iv, chandlerc Tags: #llvm Differential Revision: https://reviews.llvm.org/D60832 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359032 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Analysis/LoopAnalysisManager.h b/include/llvm/Analysis/LoopAnalysisManager.h index b87d981ec1e..368a810cfa6 100644 --- a/include/llvm/Analysis/LoopAnalysisManager.h +++ b/include/llvm/Analysis/LoopAnalysisManager.h @@ -61,9 +61,6 @@ struct LoopStandardAnalysisResults { MemorySSA *MSSA; }; -/// Enables memory ssa as a dependency for loop passes. -extern cl::opt EnableMSSALoopDependency; - /// Extern template declaration for the analysis set for this IR unit. extern template class AllAnalysesOn; diff --git a/include/llvm/Analysis/MemorySSA.h b/include/llvm/Analysis/MemorySSA.h index ab1ffa2334c..8812da6016a 100644 --- a/include/llvm/Analysis/MemorySSA.h +++ b/include/llvm/Analysis/MemorySSA.h @@ -104,6 +104,9 @@ namespace llvm { +/// Enables memory ssa as a dependency for loop passes. +extern cl::opt EnableMSSALoopDependency; + class Function; class Instruction; class MemoryAccess; diff --git a/lib/Analysis/LoopAnalysisManager.cpp b/lib/Analysis/LoopAnalysisManager.cpp index 8ae92e17399..d0cfb3e7342 100644 --- a/lib/Analysis/LoopAnalysisManager.cpp +++ b/lib/Analysis/LoopAnalysisManager.cpp @@ -18,11 +18,6 @@ using namespace llvm; namespace llvm { -/// Enables memory ssa as a dependency for loop passes in legacy pass manager. -cl::opt EnableMSSALoopDependency( - "enable-mssa-loop-dependency", cl::Hidden, cl::init(false), - cl::desc("Enable MemorySSA dependency for loop pass manager")); - // Explicit template instantiations and specialization definitions for core // template typedefs. template class AllAnalysesOn; diff --git a/lib/Analysis/MemorySSA.cpp b/lib/Analysis/MemorySSA.cpp index cd6235de685..271d56d3ecd 100644 --- a/lib/Analysis/MemorySSA.cpp +++ b/lib/Analysis/MemorySSA.cpp @@ -81,6 +81,11 @@ bool llvm::VerifyMemorySSA = true; #else bool llvm::VerifyMemorySSA = false; #endif +/// Enables memory ssa as a dependency for loop passes in legacy pass manager. +cl::opt llvm::EnableMSSALoopDependency( + "enable-mssa-loop-dependency", cl::Hidden, cl::init(false), + cl::desc("Enable MemorySSA dependency for loop pass manager")); + static cl::opt VerifyMemorySSAX("verify-memoryssa", cl::location(VerifyMemorySSA), cl::Hidden, cl::desc("Enable verification of MemorySSA.")); diff --git a/lib/Transforms/Utils/LCSSA.cpp b/lib/Transforms/Utils/LCSSA.cpp index 5ddb7381a56..29e7c5260f4 100644 --- a/lib/Transforms/Utils/LCSSA.cpp +++ b/lib/Transforms/Utils/LCSSA.cpp @@ -34,9 +34,9 @@ #include "llvm/Analysis/BranchProbabilityInfo.h" #include "llvm/Analysis/GlobalsModRef.h" #include "llvm/Analysis/LoopPass.h" +#include "llvm/Analysis/MemorySSA.h" #include "llvm/Analysis/ScalarEvolution.h" #include "llvm/Analysis/ScalarEvolutionAliasAnalysis.h" -#include "llvm/Transforms/Utils/Local.h" #include "llvm/IR/Constants.h" #include "llvm/IR/Dominators.h" #include "llvm/IR/Function.h" @@ -45,6 +45,7 @@ #include "llvm/IR/PredIteratorCache.h" #include "llvm/Pass.h" #include "llvm/Transforms/Utils.h" +#include "llvm/Transforms/Utils/Local.h" #include "llvm/Transforms/Utils/LoopUtils.h" #include "llvm/Transforms/Utils/SSAUpdater.h" using namespace llvm; @@ -444,6 +445,7 @@ struct LCSSAWrapperPass : public FunctionPass { AU.addPreserved(); AU.addPreserved(); AU.addPreserved(); + AU.addPreserved(); // This is needed to perform LCSSA verification inside LPPassManager AU.addRequired(); @@ -490,5 +492,6 @@ PreservedAnalyses LCSSAPass::run(Function &F, FunctionAnalysisManager &AM) { // BPI maps terminators to probabilities, since we don't modify the CFG, no // updates are needed to preserve it. PA.preserve(); + PA.preserve(); return PA; }