diff --git a/llvm/include/llvm/IR/PassManager.h b/llvm/include/llvm/IR/PassManager.h index 38b8b23fcc6f..9656a0059a78 100644 --- a/llvm/include/llvm/IR/PassManager.h +++ b/llvm/include/llvm/IR/PassManager.h @@ -816,6 +816,20 @@ template struct NoopAnalysisInvalidationPass { 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 + PreservedAnalyses run(T &&Arg) { + return PreservedAnalyses::none(); + } + + static StringRef name() { return "InvalidateAllAnalysesPass"; } +}; + } #endif diff --git a/llvm/test/Other/new-pass-manager.ll b/llvm/test/Other/new-pass-manager.ll index 81f71ddf75aa..222a767cd494 100644 --- a/llvm/test/Other/new-pass-manager.ll +++ b/llvm/test/Other/new-pass-manager.ll @@ -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,cgscc(require,function(require,invalidate,require),require),require' %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 } diff --git a/llvm/tools/opt/PassRegistry.def b/llvm/tools/opt/PassRegistry.def index a7b4326c3525..e05dae871b8f 100644 --- a/llvm/tools/opt/PassRegistry.def +++ b/llvm/tools/opt/PassRegistry.def @@ -26,6 +26,7 @@ MODULE_ANALYSIS("no-op-module", NoOpModuleAnalysis()) #ifndef MODULE_PASS #define MODULE_PASS(NAME, CREATE_PASS) #endif +MODULE_PASS("invalidate", 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", NoOpCGSCCAnalysis()) #ifndef CGSCC_PASS #define CGSCC_PASS(NAME, CREATE_PASS) #endif +CGSCC_PASS("invalidate", InvalidateAllAnalysesPass()) CGSCC_PASS("no-op-cgscc", NoOpCGSCCPass()) #undef CGSCC_PASS @@ -53,6 +55,7 @@ FUNCTION_ANALYSIS("no-op-function", NoOpFunctionAnalysis()) #ifndef FUNCTION_PASS #define FUNCTION_PASS(NAME, CREATE_PASS) #endif +FUNCTION_PASS("invalidate", InvalidateAllAnalysesPass()) FUNCTION_PASS("no-op-function", NoOpFunctionPass()) FUNCTION_PASS("print", PrintFunctionPass(dbgs())) FUNCTION_PASS("verify", VerifierPass())