From: Chandler Carruth Date: Tue, 6 Jan 2015 02:50:06 +0000 (+0000) Subject: [PM] Add a collection of no-op analysis passes and switch the new pass X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0b576b377f8b3bc2166179b9d141c4237725fdf7;p=platform%2Fupstream%2Fllvm.git [PM] Add a collection of no-op analysis passes and switch the new pass manager tests to use them and be significantly more comprehensive. This, naturally, uncovered a bug where the CGSCC pass manager wasn't printing analyses when they were run. The only remaining core manipulator is I think an invalidate pass similar to the require pass. That'll be next. =] llvm-svn: 225240 --- diff --git a/llvm/lib/Analysis/CGSCCPassManager.cpp b/llvm/lib/Analysis/CGSCCPassManager.cpp index ad7eea8..9a3ebea 100644 --- a/llvm/lib/Analysis/CGSCCPassManager.cpp +++ b/llvm/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/llvm/test/Other/new-pass-manager.ll b/llvm/test/Other/new-pass-manager.ll index 9c1f469..6e250f63 100644 --- a/llvm/test/Other/new-pass-manager.ll +++ b/llvm/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' %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,cgscc(require,function(require))' %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,cgscc(require,function(require))' %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/llvm/tools/opt/PassRegistry.def b/llvm/tools/opt/PassRegistry.def index ea9f95f..a7b4326 100644 --- a/llvm/tools/opt/PassRegistry.def +++ b/llvm/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/llvm/tools/opt/Passes.cpp b/llvm/tools/opt/Passes.cpp index b9c048a..3acd0f3 100644 --- a/llvm/tools/opt/Passes.cpp +++ b/llvm/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) {