[llvm] r225257 - [PM] Introduce a utility pass that preserves no analyses.

Chandler Carruth chandlerc at gmail.com
Tue Jan 6 01:06:36 PST 2015


Author: chandlerc
Date: Tue Jan  6 03:06:35 2015
New Revision: 225257

URL: http://llvm.org/viewvc/llvm-project?rev=225257&view=rev
Log:
[PM] Introduce a utility pass that preserves no analyses.

Use this to test that path of invalidation. This test actually shows
redundant invalidation here that is really bad. I'm going to work on
fixing that next, but wanted to commit the test harness now that its all
working.

Modified:
    llvm/trunk/include/llvm/IR/PassManager.h
    llvm/trunk/test/Other/new-pass-manager.ll
    llvm/trunk/tools/opt/PassRegistry.def

Modified: llvm/trunk/include/llvm/IR/PassManager.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/PassManager.h?rev=225257&r1=225256&r2=225257&view=diff
==============================================================================
--- llvm/trunk/include/llvm/IR/PassManager.h (original)
+++ llvm/trunk/include/llvm/IR/PassManager.h Tue Jan  6 03:06:35 2015
@@ -816,6 +816,20 @@ template <typename AnalysisT> struct Noo
   static StringRef name() { return "No-op Analysis Invalidation Pass"; }
 };
 
+/// \brief A utility pass that does nothing but preserves no analyses.
+///
+/// As a consequence fo not preserving any analyses, this pass will force all
+/// analysis passes to be re-run to produce fresh results if any are needed.
+struct InvalidateAllAnalysesPass {
+  /// \brief Run this pass over some unit of IR.
+  template <typename T>
+  PreservedAnalyses run(T &&Arg) {
+    return PreservedAnalyses::none();
+  }
+
+  static StringRef name() { return "InvalidateAllAnalysesPass"; }
+};
+
 }
 
 #endif

Modified: llvm/trunk/test/Other/new-pass-manager.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Other/new-pass-manager.ll?rev=225257&r1=225256&r2=225257&view=diff
==============================================================================
--- llvm/trunk/test/Other/new-pass-manager.ll (original)
+++ llvm/trunk/test/Other/new-pass-manager.ll Tue Jan  6 03:06:35 2015
@@ -194,6 +194,39 @@
 ; CHECK-DO-INVALIDATE-FUNCTION-ANALYSIS-RESULTS: Invalidating function analysis: NoOpFunctionAnalysis
 ; CHECK-DO-INVALIDATE-FUNCTION-ANALYSIS-RESULTS: Running function analysis: NoOpFunctionAnalysis
 
+; RUN: opt -disable-output -disable-verify -debug-pass-manager -debug-cgscc-pass-manager \
+; RUN:     -passes='require<no-op-module>,cgscc(require<no-op-cgscc>,function(require<no-op-function>,invalidate<all>,require<no-op-function>),require<no-op-cgscc>),require<no-op-module>' %s 2>&1 \
+; RUN:     | FileCheck %s --check-prefix=CHECK-INVALIDATE-ALL
+; CHECK-INVALIDATE-ALL: Starting module pass manager run.
+; CHECK-INVALIDATE-ALL: Running module pass: No-op Analysis Requirement Pass
+; CHECK-INVALIDATE-ALL: Running module analysis: NoOpModuleAnalysis
+; CHECK-INVALIDATE-ALL: Starting CGSCC pass manager run.
+; CHECK-INVALIDATE-ALL: Running CGSCC pass: No-op Analysis Requirement Pass
+; CHECK-INVALIDATE-ALL: Running CGSCC analysis: NoOpCGSCCAnalysis
+; CHECK-INVALIDATE-ALL: Starting function pass manager run.
+; CHECK-INVALIDATE-ALL: Running function pass: No-op Analysis Requirement Pass
+; CHECK-INVALIDATE-ALL: Running function analysis: NoOpFunctionAnalysis
+; CHECK-INVALIDATE-ALL: Running function pass: InvalidateAllAnalysesPass
+; CHECK-INVALIDATE-ALL: Invalidating all non-preserved analyses for function
+; CHECK-INVALIDATE-ALL: Invalidating function analysis: NoOpFunctionAnalysis
+; CHECK-INVALIDATE-ALL: Running function pass: No-op Analysis Requirement Pass
+; CHECK-INVALIDATE-ALL: Running function analysis: NoOpFunctionAnalysis
+; CHECK-INVALIDATE-ALL: Finished function pass manager run.
+; CHECK-INVALIDATE-ALL: Invalidating all non-preserved analyses for function
+; CHECK-INVALIDATE-ALL: Invalidating function analysis: NoOpFunctionAnalysis
+; CHECK-INVALIDATE-ALL: Invalidating all non-preserved analyses for SCC
+; CHECK-INVALIDATE-ALL: Invalidating CGSCC analysis: NoOpCGSCCAnalysis
+; CHECK-INVALIDATE-ALL: Running CGSCC pass: No-op Analysis Requirement Pass
+; CHECK-INVALIDATE-ALL: Running CGSCC analysis: NoOpCGSCCAnalysis
+; CHECK-INVALIDATE-ALL: Finished CGSCC pass manager run.
+; CHECK-INVALIDATE-ALL: Invalidating all non-preserved analyses for SCC
+; CHECK-INVALIDATE-ALL: Invalidating CGSCC analysis: NoOpCGSCCAnalysis
+; CHECK-INVALIDATE-ALL: Invalidating all non-preserved analyses for module
+; CHECK-INVALIDATE-ALL: Invalidating module analysis: NoOpModuleAnalysis
+; CHECK-INVALIDATE-ALL: Running module pass: No-op Analysis Requirement Pass
+; CHECK-INVALIDATE-ALL: Running module analysis: NoOpModuleAnalysis
+; CHECK-INVALIDATE-ALL: Finished module pass manager run.
+
 define void @foo() {
   ret void
 }

Modified: llvm/trunk/tools/opt/PassRegistry.def
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/opt/PassRegistry.def?rev=225257&r1=225256&r2=225257&view=diff
==============================================================================
--- llvm/trunk/tools/opt/PassRegistry.def (original)
+++ llvm/trunk/tools/opt/PassRegistry.def Tue Jan  6 03:06:35 2015
@@ -26,6 +26,7 @@ MODULE_ANALYSIS("no-op-module", NoOpModu
 #ifndef MODULE_PASS
 #define MODULE_PASS(NAME, CREATE_PASS)
 #endif
+MODULE_PASS("invalidate<all>", InvalidateAllAnalysesPass())
 MODULE_PASS("no-op-module", NoOpModulePass())
 MODULE_PASS("print", PrintModulePass(dbgs()))
 MODULE_PASS("print-cg", LazyCallGraphPrinterPass(dbgs()))
@@ -41,6 +42,7 @@ CGSCC_ANALYSIS("no-op-cgscc", NoOpCGSCCA
 #ifndef CGSCC_PASS
 #define CGSCC_PASS(NAME, CREATE_PASS)
 #endif
+CGSCC_PASS("invalidate<all>", InvalidateAllAnalysesPass())
 CGSCC_PASS("no-op-cgscc", NoOpCGSCCPass())
 #undef CGSCC_PASS
 
@@ -53,6 +55,7 @@ FUNCTION_ANALYSIS("no-op-function", NoOp
 #ifndef FUNCTION_PASS
 #define FUNCTION_PASS(NAME, CREATE_PASS)
 #endif
+FUNCTION_PASS("invalidate<all>", InvalidateAllAnalysesPass())
 FUNCTION_PASS("no-op-function", NoOpFunctionPass())
 FUNCTION_PASS("print", PrintFunctionPass(dbgs()))
 FUNCTION_PASS("verify", VerifierPass())





More information about the llvm-commits mailing list