[PM] Add a collection of no-op analysis passes and switch the new pass
authorChandler Carruth <chandlerc@gmail.com>
Tue, 6 Jan 2015 02:50:06 +0000 (02:50 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Tue, 6 Jan 2015 02:50:06 +0000 (02:50 +0000)
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. =]

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@225240 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/CGSCCPassManager.cpp
test/Other/new-pass-manager.ll
tools/opt/PassRegistry.def
tools/opt/Passes.cpp

index ad7eea8efca521e756b4116eb29c3235cd1d7c57..9a3ebea1c402c70a0eb4f24525d3bd1d8e5d5026 100644 (file)
@@ -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) {
   // 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];
     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());
   }
 
     RI->second = std::prev(ResultList.end());
   }
 
index 9c1f46929ff537737dce81096578da607deb0d85..6e250f630783dd1ad7df9b27294859b10ce3d9cf 100644 (file)
 ; CHECK-NO-VERIFY-NOT: VerifierPass
 ; CHECK-NO-VERIFY: Finished module pass manager
 
 ; 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.
 
 ; 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
 ; 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
index ea9f95f5941bf987c40a185bab9049dfdc44475c..a7b4326c3525590499e05a14d7219b6d476cf1c3 100644 (file)
@@ -20,6 +20,7 @@
 #define MODULE_ANALYSIS(NAME, CREATE_PASS)
 #endif
 MODULE_ANALYSIS("lcg", LazyCallGraphAnalysis())
 #define MODULE_ANALYSIS(NAME, CREATE_PASS)
 #endif
 MODULE_ANALYSIS("lcg", LazyCallGraphAnalysis())
+MODULE_ANALYSIS("no-op-module", NoOpModuleAnalysis())
 #undef MODULE_ANALYSIS
 
 #ifndef MODULE_PASS
 #undef MODULE_ANALYSIS
 
 #ifndef MODULE_PASS
@@ -34,6 +35,7 @@ MODULE_PASS("verify", VerifierPass())
 #ifndef CGSCC_ANALYSIS
 #define CGSCC_ANALYSIS(NAME, CREATE_PASS)
 #endif
 #ifndef CGSCC_ANALYSIS
 #define CGSCC_ANALYSIS(NAME, CREATE_PASS)
 #endif
+CGSCC_ANALYSIS("no-op-cgscc", NoOpCGSCCAnalysis())
 #undef CGSCC_ANALYSIS
 
 #ifndef CGSCC_PASS
 #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
 #ifndef FUNCTION_ANALYSIS
 #define FUNCTION_ANALYSIS(NAME, CREATE_PASS)
 #endif
+FUNCTION_ANALYSIS("no-op-function", NoOpFunctionAnalysis())
 #undef FUNCTION_ANALYSIS
 
 #ifndef FUNCTION_PASS
 #undef FUNCTION_ANALYSIS
 
 #ifndef FUNCTION_PASS
index b9c048a8c029ded8a621923b0b33a62332c4c4d4..3acd0f3742cad2aa51e6c40c635b81fee1d01de7 100644 (file)
@@ -32,6 +32,18 @@ struct NoOpModulePass {
   static StringRef name() { return "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) {
 /// \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"; }
 };
 
   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 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) {
 } // End anonymous namespace.
 
 void llvm::registerModuleAnalyses(ModuleAnalysisManager &MAM) {