diff options
-rw-r--r-- | lib/Analysis/CGSCCPassManager.cpp | 5 | ||||
-rw-r--r-- | test/Other/new-pass-manager.ll | 20 | ||||
-rw-r--r-- | tools/opt/PassRegistry.def | 3 | ||||
-rw-r--r-- | tools/opt/Passes.cpp | 36 |
4 files changed, 57 insertions, 7 deletions
diff --git a/lib/Analysis/CGSCCPassManager.cpp b/lib/Analysis/CGSCCPassManager.cpp index ad7eea8efca..9a3ebea1c40 100644 --- a/lib/Analysis/CGSCCPassManager.cpp +++ b/lib/Analysis/CGSCCPassManager.cpp @@ -62,8 +62,11 @@ CGSCCAnalysisManager::getResultImpl(void *PassID, LazyCallGraph::SCC &C) { // If we don't have a cached result for this function, look up the pass and // run it to produce a result, which we then add to the cache. if (Inserted) { + auto &P = lookupPass(PassID); + if (DebugPM) + dbgs() << "Running CGSCC analysis: " << P.name() << "\n"; CGSCCAnalysisResultListT &ResultList = CGSCCAnalysisResultLists[&C]; - ResultList.emplace_back(PassID, lookupPass(PassID).run(C, this)); + ResultList.emplace_back(PassID, P.run(C, this)); RI->second = std::prev(ResultList.end()); } diff --git a/test/Other/new-pass-manager.ll b/test/Other/new-pass-manager.ll index 9c1f46929ff..6e250f63078 100644 --- a/test/Other/new-pass-manager.ll +++ b/test/Other/new-pass-manager.ll @@ -86,15 +86,23 @@ ; CHECK-NO-VERIFY-NOT: VerifierPass ; CHECK-NO-VERIFY: Finished module pass manager -; RUN: opt -disable-output -debug-pass-manager -passes='require<lcg>' %s 2>&1 \ -; RUN: | FileCheck %s --check-prefix=CHECK-LCG-ANALYSIS -; CHECK-LCG-ANALYSIS: Starting module pass manager -; CHECK-LCG-ANALYSIS: Running module pass: No-op Analysis Requirement Pass -; CHECK-LCG-ANALYSIS: Running module analysis: Lazy CallGraph Analysis +; RUN: opt -disable-output -debug-pass-manager -debug-cgscc-pass-manager \ +; RUN: -passes='require<no-op-module>,cgscc(require<no-op-cgscc>,function(require<no-op-function>))' %s 2>&1 \ +; RUN: | FileCheck %s --check-prefix=CHECK-ANALYSES +; CHECK-ANALYSES: Starting module pass manager +; CHECK-ANALYSES: Running module pass: No-op Analysis Requirement Pass +; CHECK-ANALYSES: Running module analysis: NoOpModuleAnalysis +; CHECK-ANALYSES: Starting CGSCC pass manager +; CHECK-ANALYSES: Running CGSCC pass: No-op Analysis Requirement Pass +; CHECK-ANALYSES: Running CGSCC analysis: NoOpCGSCCAnalysis +; CHECK-ANALYSES: Starting function pass manager +; CHECK-ANALYSES: Running function pass: No-op Analysis Requirement Pass +; CHECK-ANALYSES: Running function analysis: NoOpFunctionAnalysis ; Make sure no-op passes that preserve all analyses don't even try to do any ; analysis invalidation. -; RUN: opt -disable-output -debug-pass-manager -debug-cgscc-pass-manager -passes='cgscc(function(no-op-function))' %s 2>&1 \ +; RUN: opt -disable-output -debug-pass-manager -debug-cgscc-pass-manager \ +; RUN: -passes='require<no-op-module>,cgscc(require<no-op-cgscc>,function(require<no-op-function>))' %s 2>&1 \ ; RUN: | FileCheck %s --check-prefix=CHECK-NO-OP-INVALIDATION ; CHECK-NO-OP-INVALIDATION: Starting module pass manager ; CHECK-NO-OP-INVALIDATION-NOT: Invalidating all non-preserved analyses diff --git a/tools/opt/PassRegistry.def b/tools/opt/PassRegistry.def index ea9f95f5941..a7b4326c352 100644 --- a/tools/opt/PassRegistry.def +++ b/tools/opt/PassRegistry.def @@ -20,6 +20,7 @@ #define MODULE_ANALYSIS(NAME, CREATE_PASS) #endif MODULE_ANALYSIS("lcg", LazyCallGraphAnalysis()) +MODULE_ANALYSIS("no-op-module", NoOpModuleAnalysis()) #undef MODULE_ANALYSIS #ifndef MODULE_PASS @@ -34,6 +35,7 @@ MODULE_PASS("verify", VerifierPass()) #ifndef CGSCC_ANALYSIS #define CGSCC_ANALYSIS(NAME, CREATE_PASS) #endif +CGSCC_ANALYSIS("no-op-cgscc", NoOpCGSCCAnalysis()) #undef CGSCC_ANALYSIS #ifndef CGSCC_PASS @@ -45,6 +47,7 @@ CGSCC_PASS("no-op-cgscc", NoOpCGSCCPass()) #ifndef FUNCTION_ANALYSIS #define FUNCTION_ANALYSIS(NAME, CREATE_PASS) #endif +FUNCTION_ANALYSIS("no-op-function", NoOpFunctionAnalysis()) #undef FUNCTION_ANALYSIS #ifndef FUNCTION_PASS diff --git a/tools/opt/Passes.cpp b/tools/opt/Passes.cpp index b9c048a8c02..3acd0f3742c 100644 --- a/tools/opt/Passes.cpp +++ b/tools/opt/Passes.cpp @@ -32,6 +32,18 @@ struct NoOpModulePass { static StringRef name() { return "NoOpModulePass"; } }; +/// \brief No-op module analysis. +struct NoOpModuleAnalysis { + struct Result {}; + Result run(Module &) { return Result(); } + static StringRef name() { return "NoOpModuleAnalysis"; } + static void *ID() { return (void *)&PassID; } +private: + static char PassID; +}; + +char NoOpModuleAnalysis::PassID; + /// \brief No-op CGSCC pass which does nothing. struct NoOpCGSCCPass { PreservedAnalyses run(LazyCallGraph::SCC &C) { @@ -40,12 +52,36 @@ struct NoOpCGSCCPass { static StringRef name() { return "NoOpCGSCCPass"; } }; +/// \brief No-op CGSCC analysis. +struct NoOpCGSCCAnalysis { + struct Result {}; + Result run(LazyCallGraph::SCC &) { return Result(); } + static StringRef name() { return "NoOpCGSCCAnalysis"; } + static void *ID() { return (void *)&PassID; } +private: + static char PassID; +}; + +char NoOpCGSCCAnalysis::PassID; + /// \brief No-op function pass which does nothing. struct NoOpFunctionPass { PreservedAnalyses run(Function &F) { return PreservedAnalyses::all(); } static StringRef name() { return "NoOpFunctionPass"; } }; +/// \brief No-op function analysis. +struct NoOpFunctionAnalysis { + struct Result {}; + Result run(Function &) { return Result(); } + static StringRef name() { return "NoOpFunctionAnalysis"; } + static void *ID() { return (void *)&PassID; } +private: + static char PassID; +}; + +char NoOpFunctionAnalysis::PassID; + } // End anonymous namespace. void llvm::registerModuleAnalyses(ModuleAnalysisManager &MAM) { |