summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Analysis/CGSCCPassManager.cpp5
-rw-r--r--test/Other/new-pass-manager.ll20
-rw-r--r--tools/opt/PassRegistry.def3
-rw-r--r--tools/opt/Passes.cpp36
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) {