[llvm] r225240 - [PM] Add a collection of no-op analysis passes and switch the new pass

Duncan P. N. Exon Smith dexonsmith at apple.com
Mon Jan 5 19:40:56 PST 2015


> On 2015 Jan 5, at 18:50, Chandler Carruth <chandlerc at gmail.com> wrote:
> 
> Author: chandlerc
> Date: Mon Jan  5 20:50:06 2015
> New Revision: 225240
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=225240&view=rev
> Log:
> [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. =]
> 
> Modified:
>    llvm/trunk/lib/Analysis/CGSCCPassManager.cpp
>    llvm/trunk/test/Other/new-pass-manager.ll
>    llvm/trunk/tools/opt/PassRegistry.def
>    llvm/trunk/tools/opt/Passes.cpp
> 
> Modified: llvm/trunk/lib/Analysis/CGSCCPassManager.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/CGSCCPassManager.cpp?rev=225240&r1=225239&r2=225240&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/CGSCCPassManager.cpp (original)
> +++ llvm/trunk/lib/Analysis/CGSCCPassManager.cpp Mon Jan  5 20:50:06 2015
> @@ -62,8 +62,11 @@ CGSCCAnalysisManager::getResultImpl(void
>   // 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());
>   }
> 
> 
> 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=225240&r1=225239&r2=225240&view=diff
> ==============================================================================
> --- llvm/trunk/test/Other/new-pass-manager.ll (original)
> +++ llvm/trunk/test/Other/new-pass-manager.ll Mon Jan  5 20:50:06 2015
> @@ -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
> 
> Modified: llvm/trunk/tools/opt/PassRegistry.def
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/opt/PassRegistry.def?rev=225240&r1=225239&r2=225240&view=diff
> ==============================================================================
> --- llvm/trunk/tools/opt/PassRegistry.def (original)
> +++ llvm/trunk/tools/opt/PassRegistry.def Mon Jan  5 20:50:06 2015
> @@ -20,6 +20,7 @@
> #define MODULE_ANALYSIS(NAME, CREATE_PASS)
> #endif
> MODULE_ANALYSIS("lcg", LazyCallGraphAnalysis())
> +MODULE_ANALYSIS("no-op-module", NoOpModuleAnalysis())

Enter bike-shed (take it or leave it).

This looks really strange to me, given how well-established "noop" is
as its own "word" [1].  Can this be `noop-module`?

[1]: https://en.wikipedia.org/wiki/NOOP

`NoOp` below looks kind of weird to me too, although less so.

> #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
> 
> Modified: llvm/trunk/tools/opt/Passes.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/opt/Passes.cpp?rev=225240&r1=225239&r2=225240&view=diff
> ==============================================================================
> --- llvm/trunk/tools/opt/Passes.cpp (original)
> +++ llvm/trunk/tools/opt/Passes.cpp Mon Jan  5 20:50:06 2015
> @@ -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) {
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits





More information about the llvm-commits mailing list