[llvm] r292039 - [PM] The assumption cache is fundamentally designed to be self-updating,

Chandler Carruth via llvm-commits llvm-commits at lists.llvm.org
Sat Jan 14 16:26:18 PST 2017


Author: chandlerc
Date: Sat Jan 14 18:26:18 2017
New Revision: 292039

URL: http://llvm.org/viewvc/llvm-project?rev=292039&view=rev
Log:
[PM] The assumption cache is fundamentally designed to be self-updating,
mark it as never invalidated in the new PM.

The old PM already required this to work, and after a discussion with
Hal this seems to really be the only sensible answer. The cache
gracefully degrades as the IR is mutated, and most things which do this
should already be incrementally updating the cache.

This gets rid of a bunch of logic preserving and testing the
invalidation of this analysis.

Modified:
    llvm/trunk/include/llvm/Analysis/AssumptionCache.h
    llvm/trunk/include/llvm/Transforms/Scalar/LoopPassManager.h
    llvm/trunk/lib/Analysis/LoopAnalysisManager.cpp
    llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp
    llvm/trunk/test/Analysis/MemoryDependenceAnalysis/invalidation.ll
    llvm/trunk/test/Analysis/ScalarEvolution/invalidation.ll
    llvm/trunk/unittests/Transforms/Scalar/LoopPassManagerTest.cpp

Modified: llvm/trunk/include/llvm/Analysis/AssumptionCache.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/AssumptionCache.h?rev=292039&r1=292038&r2=292039&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Analysis/AssumptionCache.h (original)
+++ llvm/trunk/include/llvm/Analysis/AssumptionCache.h Sat Jan 14 18:26:18 2017
@@ -84,6 +84,13 @@ public:
   /// its instructions.
   AssumptionCache(Function &F) : F(F), Scanned(false) {}
 
+  /// This cache is designed to be self-updating and so it should never be
+  /// invalidated.
+  bool invalidate(Function &, const PreservedAnalyses &,
+                  FunctionAnalysisManager::Invalidator &) {
+    return false;
+  }
+
   /// \brief Add an @llvm.assume intrinsic to this function's cache.
   ///
   /// The call passed in must be an instruction within this function and must

Modified: llvm/trunk/include/llvm/Transforms/Scalar/LoopPassManager.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Scalar/LoopPassManager.h?rev=292039&r1=292038&r2=292039&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Transforms/Scalar/LoopPassManager.h (original)
+++ llvm/trunk/include/llvm/Transforms/Scalar/LoopPassManager.h Sat Jan 14 18:26:18 2017
@@ -321,7 +321,6 @@ public:
     PA.preserveSet<AllAnalysesOn<Loop>>();
     PA.preserve<LoopAnalysisManagerFunctionProxy>();
     // We also preserve the set of standard analyses.
-    PA.preserve<AssumptionAnalysis>();
     PA.preserve<DominatorTreeAnalysis>();
     PA.preserve<LoopAnalysis>();
     PA.preserve<ScalarEvolutionAnalysis>();

Modified: llvm/trunk/lib/Analysis/LoopAnalysisManager.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LoopAnalysisManager.cpp?rev=292039&r1=292038&r2=292039&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/LoopAnalysisManager.cpp (original)
+++ llvm/trunk/lib/Analysis/LoopAnalysisManager.cpp Sat Jan 14 18:26:18 2017
@@ -145,7 +145,6 @@ LoopAnalysisManagerFunctionProxy::run(Fu
 
 PreservedAnalyses llvm::getLoopPassPreservedAnalyses() {
   PreservedAnalyses PA;
-  PA.preserve<AssumptionAnalysis>();
   PA.preserve<DominatorTreeAnalysis>();
   PA.preserve<LoopAnalysis>();
   PA.preserve<LoopAnalysisManagerFunctionProxy>();

Modified: llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp?rev=292039&r1=292038&r2=292039&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstructionCombining.cpp Sat Jan 14 18:26:18 2017
@@ -3179,7 +3179,6 @@ PreservedAnalyses InstCombinePass::run(F
   // FIXME: This should also 'preserve the CFG'.
   PreservedAnalyses PA;
   PA.preserve<AAManager>();
-  PA.preserve<AssumptionAnalysis>();
   PA.preserve<DominatorTreeAnalysis>();
   PA.preserve<GlobalsAA>();
   return PA;

Modified: llvm/trunk/test/Analysis/MemoryDependenceAnalysis/invalidation.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/MemoryDependenceAnalysis/invalidation.ll?rev=292039&r1=292038&r2=292039&view=diff
==============================================================================
--- llvm/trunk/test/Analysis/MemoryDependenceAnalysis/invalidation.ll (original)
+++ llvm/trunk/test/Analysis/MemoryDependenceAnalysis/invalidation.ll Sat Jan 14 18:26:18 2017
@@ -13,20 +13,6 @@
 ; CHECK-AA-INVALIDATE: Running pass: GVN
 ; CHECK-AA-INVALIDATE: Running analysis: MemoryDependenceAnalysis
 ;
-; Check the assumptions analysis specifically.
-; FIXME: We don't have any test cases that actually fail if the assumption
-; cache becomes stale. This just tests what we believe to be correct.
-; RUN: opt -disable-output -debug-pass-manager %s 2>&1 \
-; RUN:     -passes='require<memdep>,invalidate<assumptions>,gvn' \
-; RUN:     | FileCheck %s --check-prefix=CHECK-ASSUMPTIONS-INVALIDATE
-; CHECK-ASSUMPTIONS-INVALIDATE: Running pass: RequireAnalysisPass
-; CHECK-ASSUMPTIONS-INVALIDATE: Running analysis: MemoryDependenceAnalysis
-; CHECK-ASSUMPTIONS-INVALIDATE: Running pass: InvalidateAnalysisPass
-; CHECK-ASSUMPTIONS-INVALIDATE: Invalidating analysis: AssumptionAnalysis
-; CHECK-ASSUMPTIONS-INVALIDATE: Invalidating analysis: MemoryDependenceAnalysis
-; CHECK-ASSUMPTIONS-INVALIDATE: Running pass: GVN
-; CHECK-ASSUMPTIONS-INVALIDATE: Running analysis: MemoryDependenceAnalysis
-;
 ; Check domtree specifically.
 ; RUN: opt -disable-output -debug-pass-manager %s 2>&1 \
 ; RUN:     -passes='require<memdep>,invalidate<domtree>,gvn' \

Modified: llvm/trunk/test/Analysis/ScalarEvolution/invalidation.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/ScalarEvolution/invalidation.ll?rev=292039&r1=292038&r2=292039&view=diff
==============================================================================
--- llvm/trunk/test/Analysis/ScalarEvolution/invalidation.ll (original)
+++ llvm/trunk/test/Analysis/ScalarEvolution/invalidation.ll Sat Jan 14 18:26:18 2017
@@ -8,19 +8,6 @@
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
 target triple = "x86_64-unknown-linux-gnu"
 
-; RUN: opt < %s -passes='require<scalar-evolution>,invalidate<assumptions>,print<scalar-evolution>' \
-; RUN:     -debug-pass-manager -disable-output 2>&1 \
-; RUN:     | FileCheck %s -check-prefixes=CHECK,CHECK-AC-INVALIDATE
-;
-; CHECK-AC-INVALIDATE: Running pass: RequireAnalysisPass
-; CHECK-AC-INVALIDATE: Running analysis: ScalarEvolutionAnalysis
-; CHECK-AC-INVALIDATE: Running analysis: AssumptionAnalysis
-; CHECK-AC-INVALIDATE: Running pass: InvalidateAnalysisPass
-; CHECK-AC-INVALIDATE: Invalidating analysis: AssumptionAnalysis
-; CHECK-AC-INVALIDATE: Running pass: ScalarEvolutionPrinterPass
-; CHECK-AC-INVALIDATE: Running analysis: ScalarEvolutionAnalysis
-; CHECK-AC-INVALIDATE: Running analysis: AssumptionAnalysis
-
 ; RUN: opt < %s -passes='require<scalar-evolution>,invalidate<domtree>,print<scalar-evolution>' \
 ; RUN:     -debug-pass-manager -disable-output 2>&1 \
 ; RUN:     | FileCheck %s -check-prefixes=CHECK,CHECK-DT-INVALIDATE

Modified: llvm/trunk/unittests/Transforms/Scalar/LoopPassManagerTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Transforms/Scalar/LoopPassManagerTest.cpp?rev=292039&r1=292038&r2=292039&view=diff
==============================================================================
--- llvm/trunk/unittests/Transforms/Scalar/LoopPassManagerTest.cpp (original)
+++ llvm/trunk/unittests/Transforms/Scalar/LoopPassManagerTest.cpp Sat Jan 14 18:26:18 2017
@@ -551,7 +551,6 @@ TEST_F(LoopPassManagerTest, Invalidation
   EXPECT_CALL(MFPHandle, run(HasName("f"), _)).WillOnce(InvokeWithoutArgs([] {
     auto PA = PreservedAnalyses::none();
     // Not preserving `AAManager`.
-    PA.preserve<AssumptionAnalysis>();
     PA.preserve<DominatorTreeAnalysis>();
     PA.preserve<LoopAnalysis>();
     PA.preserve<LoopAnalysisManagerFunctionProxy>();
@@ -568,24 +567,6 @@ TEST_F(LoopPassManagerTest, Invalidation
   EXPECT_CALL(MFPHandle, run(HasName("f"), _)).WillOnce(InvokeWithoutArgs([] {
     auto PA = PreservedAnalyses::none();
     PA.preserve<AAManager>();
-    // Not preserving `AssumptionAnalysis`.
-    PA.preserve<DominatorTreeAnalysis>();
-    PA.preserve<LoopAnalysis>();
-    PA.preserve<LoopAnalysisManagerFunctionProxy>();
-    PA.preserve<ScalarEvolutionAnalysis>();
-    return PA;
-  }));
-  EXPECT_CALL(MLAHandle, run(HasName("loop.0.0"), _, _));
-  EXPECT_CALL(MLAHandle, run(HasName("loop.0.1"), _, _));
-  EXPECT_CALL(MLAHandle, run(HasName("loop.0"), _, _));
-  FPM.addPass(MFPHandle.getPass());
-  FPM.addPass(createFunctionToLoopPassAdaptor(
-      RequireAnalysisLoopPass<MockLoopAnalysisHandle::Analysis>()));
-
-  EXPECT_CALL(MFPHandle, run(HasName("f"), _)).WillOnce(InvokeWithoutArgs([] {
-    auto PA = PreservedAnalyses::none();
-    PA.preserve<AAManager>();
-    PA.preserve<AssumptionAnalysis>();
     // Not preserving `DominatorTreeAnalysis`.
     PA.preserve<LoopAnalysis>();
     PA.preserve<LoopAnalysisManagerFunctionProxy>();
@@ -602,7 +583,6 @@ TEST_F(LoopPassManagerTest, Invalidation
   EXPECT_CALL(MFPHandle, run(HasName("f"), _)).WillOnce(InvokeWithoutArgs([] {
     auto PA = PreservedAnalyses::none();
     PA.preserve<AAManager>();
-    PA.preserve<AssumptionAnalysis>();
     PA.preserve<DominatorTreeAnalysis>();
     // Not preserving the `LoopAnalysis`.
     PA.preserve<LoopAnalysisManagerFunctionProxy>();
@@ -619,7 +599,6 @@ TEST_F(LoopPassManagerTest, Invalidation
   EXPECT_CALL(MFPHandle, run(HasName("f"), _)).WillOnce(InvokeWithoutArgs([] {
     auto PA = PreservedAnalyses::none();
     PA.preserve<AAManager>();
-    PA.preserve<AssumptionAnalysis>();
     PA.preserve<DominatorTreeAnalysis>();
     PA.preserve<LoopAnalysis>();
     // Not preserving the `LoopAnalysisManagerFunctionProxy`.
@@ -636,7 +615,6 @@ TEST_F(LoopPassManagerTest, Invalidation
   EXPECT_CALL(MFPHandle, run(HasName("f"), _)).WillOnce(InvokeWithoutArgs([] {
     auto PA = PreservedAnalyses::none();
     PA.preserve<AAManager>();
-    PA.preserve<AssumptionAnalysis>();
     PA.preserve<DominatorTreeAnalysis>();
     PA.preserve<LoopAnalysis>();
     PA.preserve<LoopAnalysisManagerFunctionProxy>();
@@ -654,7 +632,7 @@ TEST_F(LoopPassManagerTest, Invalidation
   // 'g' once with a requires pass and then run our mock pass over g a bunch
   // but just get cached results each time.
   EXPECT_CALL(MLAHandle, run(HasName("loop.g.0"), _, _));
-  EXPECT_CALL(MFPHandle, run(HasName("g"), _)).Times(7);
+  EXPECT_CALL(MFPHandle, run(HasName("g"), _)).Times(6);
 
   MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
   MPM.run(*M, MAM);




More information about the llvm-commits mailing list