Skip to content

Commit

Permalink
Only passes that preserve MemorySSA must mark it as preserved.
Browse files Browse the repository at this point in the history
Summary:
The method `getLoopPassPreservedAnalyses` should not mark MemorySSA as
preserved, because it's being called in a lot of passes that do not
preserve MemorySSA.
Instead, mark the MemorySSA analysis as preserved by each pass that does
preserve it.
These changes only affect the new pass mananger.

Reviewers: chandlerc

Subscribers: mehdi_amini, jlebar, Prazek, george.burgess.iv, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D62536

llvm-svn: 363091
  • Loading branch information
alinas committed Jun 11, 2019
1 parent e20865c commit 3cef1f7
Show file tree
Hide file tree
Showing 7 changed files with 27 additions and 7 deletions.
2 changes: 0 additions & 2 deletions llvm/lib/Analysis/LoopAnalysisManager.cpp
Expand Up @@ -141,8 +141,6 @@ PreservedAnalyses llvm::getLoopPassPreservedAnalyses() {
PA.preserve<LoopAnalysis>();
PA.preserve<LoopAnalysisManagerFunctionProxy>();
PA.preserve<ScalarEvolutionAnalysis>();
if (EnableMSSALoopDependency)
PA.preserve<MemorySSAAnalysis>();
// FIXME: What we really want to do here is preserve an AA category, but that
// concept doesn't exist yet.
PA.preserve<AAManager>();
Expand Down
2 changes: 2 additions & 0 deletions llvm/lib/Transforms/Scalar/LICM.cpp
Expand Up @@ -294,6 +294,8 @@ PreservedAnalyses LICMPass::run(Loop &L, LoopAnalysisManager &AM,

PA.preserve<DominatorTreeAnalysis>();
PA.preserve<LoopAnalysis>();
if (EnableMSSALoopDependency)
PA.preserve<MemorySSAAnalysis>();

return PA;
}
Expand Down
2 changes: 2 additions & 0 deletions llvm/lib/Transforms/Scalar/LoopInstSimplify.cpp
Expand Up @@ -233,6 +233,8 @@ PreservedAnalyses LoopInstSimplifyPass::run(Loop &L, LoopAnalysisManager &AM,

auto PA = getLoopPassPreservedAnalyses();
PA.preserveSet<CFGAnalyses>();
if (EnableMSSALoopDependency)
PA.preserve<MemorySSAAnalysis>();
return PA;
}

Expand Down
5 changes: 4 additions & 1 deletion llvm/lib/Transforms/Scalar/LoopRotation.cpp
Expand Up @@ -54,7 +54,10 @@ PreservedAnalyses LoopRotatePass::run(Loop &L, LoopAnalysisManager &AM,
if (AR.MSSA && VerifyMemorySSA)
AR.MSSA->verifyMemorySSA();

return getLoopPassPreservedAnalyses();
auto PA = getLoopPassPreservedAnalyses();
if (EnableMSSALoopDependency)
PA.preserve<MemorySSAAnalysis>();
return PA;
}

namespace {
Expand Down
5 changes: 4 additions & 1 deletion llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp
Expand Up @@ -701,7 +701,10 @@ PreservedAnalyses LoopSimplifyCFGPass::run(Loop &L, LoopAnalysisManager &AM,
if (DeleteCurrentLoop)
LPMU.markLoopAsDeleted(L, "loop-simplifycfg");

return getLoopPassPreservedAnalyses();
auto PA = getLoopPassPreservedAnalyses();
if (EnableMSSALoopDependency)
PA.preserve<MemorySSAAnalysis>();
return PA;
}

namespace {
Expand Down
6 changes: 5 additions & 1 deletion llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp
Expand Up @@ -2861,7 +2861,11 @@ PreservedAnalyses SimpleLoopUnswitchPass::run(Loop &L, LoopAnalysisManager &AM,
// Historically this pass has had issues with the dominator tree so verify it
// in asserts builds.
assert(AR.DT.verify(DominatorTree::VerificationLevel::Fast));
return getLoopPassPreservedAnalyses();

auto PA = getLoopPassPreservedAnalyses();
if (EnableMSSALoopDependency)
PA.preserve<MemorySSAAnalysis>();
return PA;
}

namespace {
Expand Down
12 changes: 10 additions & 2 deletions llvm/unittests/Transforms/Scalar/LoopPassManagerTest.cpp
Expand Up @@ -396,11 +396,13 @@ TEST_F(LoopPassManagerTest, FunctionPassInvalidationOfLoopAnalyses) {
// No need to re-run if we require again from a fresh loop pass manager.
FPM.addPass(createFunctionToLoopPassAdaptor(
RequireAnalysisLoopPass<MockLoopAnalysisHandle::Analysis>()));

// For 'f', preserve most things but not the specific loop analyses.
auto PA = getLoopPassPreservedAnalyses();
if (EnableMSSALoopDependency)
PA.preserve<MemorySSAAnalysis>();
EXPECT_CALL(MFPHandle, run(HasName("f"), _))
.InSequence(FSequence)
.WillOnce(Return(getLoopPassPreservedAnalyses()));
.WillOnce(Return(PA));
EXPECT_CALL(MLAHandle, invalidate(HasName("loop.0.0"), _, _))
.InSequence(FSequence)
.WillOnce(DoDefault());
Expand Down Expand Up @@ -475,6 +477,8 @@ TEST_F(LoopPassManagerTest, ModulePassInvalidationOfLoopAnalyses) {
EXPECT_CALL(MMPHandle, run(_, _)).WillOnce(InvokeWithoutArgs([] {
auto PA = getLoopPassPreservedAnalyses();
PA.preserve<FunctionAnalysisManagerModuleProxy>();
if (EnableMSSALoopDependency)
PA.preserve<MemorySSAAnalysis>();
return PA;
}));
// All the loop analyses from both functions get invalidated before we
Expand Down Expand Up @@ -803,6 +807,8 @@ TEST_F(LoopPassManagerTest, IndirectOuterPassInvalidation) {
// the fact that they were preserved.
EXPECT_CALL(MFPHandle, run(HasName("f"), _)).WillOnce(InvokeWithoutArgs([] {
auto PA = getLoopPassPreservedAnalyses();
if (EnableMSSALoopDependency)
PA.preserve<MemorySSAAnalysis>();
PA.preserveSet<AllAnalysesOn<Loop>>();
return PA;
}));
Expand All @@ -824,6 +830,8 @@ TEST_F(LoopPassManagerTest, IndirectOuterPassInvalidation) {
// Which means that no extra invalidation occurs and cached values are used.
EXPECT_CALL(MFPHandle, run(HasName("g"), _)).WillOnce(InvokeWithoutArgs([] {
auto PA = getLoopPassPreservedAnalyses();
if (EnableMSSALoopDependency)
PA.preserve<MemorySSAAnalysis>();
PA.preserveSet<AllAnalysesOn<Loop>>();
return PA;
}));
Expand Down

0 comments on commit 3cef1f7

Please sign in to comment.