Skip to content

Commit

Permalink
[MemorySSA] LCSSA preserves MemorySSA.
Browse files Browse the repository at this point in the history
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

llvm-svn: 359032
  • Loading branch information
alinas committed Apr 23, 2019
1 parent 2651846 commit 4fd1f26
Show file tree
Hide file tree
Showing 5 changed files with 12 additions and 9 deletions.
3 changes: 0 additions & 3 deletions llvm/include/llvm/Analysis/LoopAnalysisManager.h
Expand Up @@ -61,9 +61,6 @@ struct LoopStandardAnalysisResults {
MemorySSA *MSSA;
};

/// Enables memory ssa as a dependency for loop passes.
extern cl::opt<bool> EnableMSSALoopDependency;

/// Extern template declaration for the analysis set for this IR unit.
extern template class AllAnalysesOn<Loop>;

Expand Down
3 changes: 3 additions & 0 deletions llvm/include/llvm/Analysis/MemorySSA.h
Expand Up @@ -104,6 +104,9 @@

namespace llvm {

/// Enables memory ssa as a dependency for loop passes.
extern cl::opt<bool> EnableMSSALoopDependency;

class Function;
class Instruction;
class MemoryAccess;
Expand Down
5 changes: 0 additions & 5 deletions llvm/lib/Analysis/LoopAnalysisManager.cpp
Expand Up @@ -18,11 +18,6 @@
using namespace llvm;

namespace llvm {
/// Enables memory ssa as a dependency for loop passes in legacy pass manager.
cl::opt<bool> 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<Loop>;
Expand Down
5 changes: 5 additions & 0 deletions llvm/lib/Analysis/MemorySSA.cpp
Expand Up @@ -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<bool> llvm::EnableMSSALoopDependency(
"enable-mssa-loop-dependency", cl::Hidden, cl::init(false),
cl::desc("Enable MemorySSA dependency for loop pass manager"));

static cl::opt<bool, true>
VerifyMemorySSAX("verify-memoryssa", cl::location(VerifyMemorySSA),
cl::Hidden, cl::desc("Enable verification of MemorySSA."));
Expand Down
5 changes: 4 additions & 1 deletion llvm/lib/Transforms/Utils/LCSSA.cpp
Expand Up @@ -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"
Expand All @@ -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;
Expand Down Expand Up @@ -444,6 +445,7 @@ struct LCSSAWrapperPass : public FunctionPass {
AU.addPreserved<ScalarEvolutionWrapperPass>();
AU.addPreserved<SCEVAAWrapperPass>();
AU.addPreserved<BranchProbabilityInfoWrapperPass>();
AU.addPreserved<MemorySSAWrapperPass>();

// This is needed to perform LCSSA verification inside LPPassManager
AU.addRequired<LCSSAVerificationPass>();
Expand Down Expand Up @@ -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<BranchProbabilityAnalysis>();
PA.preserve<MemorySSAAnalysis>();
return PA;
}

0 comments on commit 4fd1f26

Please sign in to comment.