From 37d66c4dea6330d0a5441f82b12b9b8add1e3684 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 30 Jul 2002 16:27:02 +0000 Subject: [PATCH] * Move some code from Pass.cpp to PassManagerT.h * Implement stuff so that code can declare that they only depend on the CFG of a function, not on anything else. This speeds up GCCAS a lot. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3155 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/VMCore/Pass.cpp | 62 ++++++--------------------------------- lib/VMCore/PassManagerT.h | 30 +++++++++++++++++-- 2 files changed, 37 insertions(+), 55 deletions(-) diff --git a/lib/VMCore/Pass.cpp b/lib/VMCore/Pass.cpp index 06e77e7fe16..d60a50053cf 100644 --- a/lib/VMCore/Pass.cpp +++ b/lib/VMCore/Pass.cpp @@ -10,7 +10,6 @@ #include "PassManagerT.h" // PassManagerT implementation #include "llvm/Module.h" #include "Support/STLExtras.h" -#include "Support/CommandLine.h" #include "Support/TypeInfo.h" #include #include @@ -21,21 +20,11 @@ // AnalysisID Class Implementation // -static std::vector CFGOnlyAnalyses; -#if 0 -// Source of unique analysis ID #'s. -unsigned AnalysisID::NextID = 0; +static std::vector CFGOnlyAnalyses; -AnalysisID::AnalysisID(const AnalysisID &AID, bool DependsOnlyOnCFG) { - ID = AID.ID; // Implement the copy ctor part... - Constructor = AID.Constructor; - - // If this analysis only depends on the CFG of the function, add it to the CFG - // only list... - if (DependsOnlyOnCFG) - CFGOnlyAnalyses.push_back(AID); +void RegisterPassBase::setPreservesCFG() { + CFGOnlyAnalyses.push_back(PIObj); } -#endif //===----------------------------------------------------------------------===// // AnalysisResolver Class Implementation @@ -137,33 +126,6 @@ TimingInfo::~TimingInfo() { } -//===----------------------------------------------------------------------===// -// Pass debugging information. Often it is useful to find out what pass is -// running when a crash occurs in a utility. When this library is compiled with -// debugging on, a command line option (--debug-pass) is enabled that causes the -// pass name to be printed before it executes. -// - -// Different debug levels that can be enabled... -enum PassDebugLevel { - None, Structure, Executions, Details -}; - -static cl::opt -PassDebugging("debug-pass", cl::Hidden, - cl::desc("Print PassManager debugging information"), - cl::values( - clEnumVal(None , "disable debug output"), - // TODO: add option to print out pass names "PassOptions" - clEnumVal(Structure , "print pass structure before run()"), - clEnumVal(Executions, "print pass name before it is executed"), - clEnumVal(Details , "print pass details when it is executed"), - 0)); - -void PMDebug::PrintPassStructure(Pass *P) { - if (PassDebugging >= Structure) - P->dumpPassStructure(); -} void PMDebug::PrintPassInformation(unsigned Depth, const char *Action, Pass *P, Annotable *V) { @@ -190,22 +152,12 @@ void PMDebug::PrintAnalysisSetInfo(unsigned Depth, const char *Msg, Pass *P, const std::vector &Set){ if (PassDebugging >= Details && !Set.empty()) { std::cerr << (void*)P << std::string(Depth*2+3, ' ') << Msg << " Analyses:"; - for (unsigned i = 0; i != Set.size(); ++i) { - // FIXME: This can use the local pass map! - Pass *P = Set[i]->createPass(); // Good thing this is just debug code... - std::cerr << " " << P->getPassName(); - delete P; - } + for (unsigned i = 0; i != Set.size(); ++i) + std::cerr << " " << Set[i]->getPassName(); std::cerr << "\n"; } } -// dumpPassStructure - Implement the -debug-passes=Structure option -void Pass::dumpPassStructure(unsigned Offset) { - std::cerr << std::string(Offset*2, ' ') << getPassName() << "\n"; -} - - //===----------------------------------------------------------------------===// // Pass Implementation // @@ -214,6 +166,10 @@ void Pass::addToPassManager(PassManagerT *PM, AnalysisUsage &AU) { PM->addPass(this, AU); } +// dumpPassStructure - Implement the -debug-passes=Structure option +void Pass::dumpPassStructure(unsigned Offset) { + std::cerr << std::string(Offset*2, ' ') << getPassName() << "\n"; +} // getPassName - Use C++ RTTI to get a SOMEWHAT intelligable name for the pass. // diff --git a/lib/VMCore/PassManagerT.h b/lib/VMCore/PassManagerT.h index 6e5fcbdd3e2..555bcaae106 100644 --- a/lib/VMCore/PassManagerT.h +++ b/lib/VMCore/PassManagerT.h @@ -16,10 +16,33 @@ #define LLVM_PASSMANAGER_T_H #include "llvm/Pass.h" -#include +#include "Support/CommandLine.h" #include class Annotable; +//===----------------------------------------------------------------------===// +// Pass debugging information. Often it is useful to find out what pass is +// running when a crash occurs in a utility. When this library is compiled with +// debugging on, a command line option (--debug-pass) is enabled that causes the +// pass name to be printed before it executes. +// + +// Different debug levels that can be enabled... +enum PassDebugLevel { + None, Structure, Executions, Details +}; + +static cl::opt +PassDebugging("debug-pass", cl::Hidden, + cl::desc("Print PassManager debugging information"), + cl::values( + clEnumVal(None , "disable debug output"), + // TODO: add option to print out pass names "PassOptions" + clEnumVal(Structure , "print pass structure before run()"), + clEnumVal(Executions, "print pass name before it is executed"), + clEnumVal(Details , "print pass details when it is executed"), + 0)); + //===----------------------------------------------------------------------===// // PMDebug class - a set of debugging functions, that are not to be // instantiated by the template. @@ -28,7 +51,10 @@ struct PMDebug { // If compiled in debug mode, these functions can be enabled by setting // -debug-pass on the command line of the tool being used. // - static void PrintPassStructure(Pass *P); + static void PrintPassStructure(Pass *P) { + if (PassDebugging >= Structure) + P->dumpPassStructure(); + } static void PrintPassInformation(unsigned,const char*,Pass *, Annotable *); static void PrintAnalysisSetInfo(unsigned,const char*,Pass *P, const std::vector &);