From 0df89054c05fc99d2ee97cc154dfcd3ab74858ee Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Tue, 6 Jan 2015 09:06:35 +0000 Subject: [PATCH] [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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@225257 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/IR/PassManager.h | 14 ++++++++++++++ test/Other/new-pass-manager.ll | 33 +++++++++++++++++++++++++++++++++ tools/opt/PassRegistry.def | 3 +++ 3 files changed, 50 insertions(+) diff --git a/include/llvm/IR/PassManager.h b/include/llvm/IR/PassManager.h index 38b8b23fcc6..9656a0059a7 100644 --- a/include/llvm/IR/PassManager.h +++ b/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/test/Other/new-pass-manager.ll b/test/Other/new-pass-manager.ll index 81f71ddf75a..222a767cd49 100644 --- a/test/Other/new-pass-manager.ll +++ b/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/tools/opt/PassRegistry.def b/tools/opt/PassRegistry.def index a7b4326c352..e05dae871b8 100644 --- a/tools/opt/PassRegistry.def +++ b/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())