move 'cfgonly' pass tracking into PassInfo, instead of handling it with

yet-another global data structure.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32102 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2006-12-01 22:21:11 +00:00
parent 5365489f6c
commit 947c7689fc
2 changed files with 37 additions and 40 deletions

View File

@ -38,6 +38,7 @@ class PassInfo {
const char *PassName; // Nice name for Pass const char *PassName; // Nice name for Pass
const char *PassArgument; // Command Line argument to run this pass const char *PassArgument; // Command Line argument to run this pass
const std::type_info &TypeInfo; // type_info object for this Pass class const std::type_info &TypeInfo; // type_info object for this Pass class
bool IsCFGOnlyPass; // Pass only looks at the CFG.
bool IsAnalysisGroup; // True if an analysis group. bool IsAnalysisGroup; // True if an analysis group.
std::vector<const PassInfo*> ItfImpl;// Interfaces implemented by this pass std::vector<const PassInfo*> ItfImpl;// Interfaces implemented by this pass
@ -48,8 +49,8 @@ public:
/// through RegisterPass. /// through RegisterPass.
PassInfo(const char *name, const char *arg, const std::type_info &ti, PassInfo(const char *name, const char *arg, const std::type_info &ti,
Pass *(*normal)() = 0) Pass *(*normal)() = 0)
: PassName(name), PassArgument(arg), TypeInfo(ti), IsAnalysisGroup(false), : PassName(name), PassArgument(arg), TypeInfo(ti),
NormalCtor(normal) { IsCFGOnlyPass(false), IsAnalysisGroup(false), NormalCtor(normal) {
} }
/// getPassName - Return the friendly name for the pass, never returns null /// getPassName - Return the friendly name for the pass, never returns null
@ -73,6 +74,11 @@ public:
bool isAnalysisGroup() const { return IsAnalysisGroup; } bool isAnalysisGroup() const { return IsAnalysisGroup; }
void SetIsAnalysisGroup() { IsAnalysisGroup = true; } void SetIsAnalysisGroup() { IsAnalysisGroup = true; }
/// isCFGOnlyPass - return true if this pass only looks at the CFG for the
/// function.
bool isCFGOnlyPass() const { return IsCFGOnlyPass; }
void SetIsCFGOnlyPass() { IsCFGOnlyPass = true; }
/// getNormalCtor - Return a pointer to a function, that when called, creates /// getNormalCtor - Return a pointer to a function, that when called, creates
/// an instance of the pass and returns it. This pointer may be null if there /// an instance of the pass and returns it. This pointer may be null if there
/// is no default constructor for the pass. /// is no default constructor for the pass.
@ -159,7 +165,9 @@ protected:
/// setOnlyUsesCFG - Notice that this pass only depends on the CFG, so /// setOnlyUsesCFG - Notice that this pass only depends on the CFG, so
/// transformations that do not modify the CFG do not invalidate this pass. /// transformations that do not modify the CFG do not invalidate this pass.
/// ///
void setOnlyUsesCFG(); void setOnlyUsesCFG() {
PIObj.SetIsCFGOnlyPass();
}
}; };
template<typename PassName> template<typename PassName>

View File

@ -23,21 +23,6 @@
#include <set> #include <set>
using namespace llvm; using namespace llvm;
//===----------------------------------------------------------------------===//
// AnalysisID Class Implementation
//
// getCFGOnlyAnalyses - A wrapper around the CFGOnlyAnalyses which make it
// initializer order independent.
static std::vector<const PassInfo*> &getCFGOnlyAnalyses() {
static std::vector<const PassInfo*> CFGOnlyAnalyses;
return CFGOnlyAnalyses;
}
void RegisterPassBase::setOnlyUsesCFG() {
getCFGOnlyAnalyses().push_back(&PIObj);
}
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// AnalysisResolver Class Implementation // AnalysisResolver Class Implementation
// //
@ -49,28 +34,6 @@ void AnalysisResolver::setAnalysisResolver(Pass *P, AnalysisResolver *AR) {
P->Resolver = AR; P->Resolver = AR;
} }
//===----------------------------------------------------------------------===//
// AnalysisUsage Class Implementation
//
// setPreservesCFG - This function should be called to by the pass, iff they do
// not:
//
// 1. Add or remove basic blocks from the function
// 2. Modify terminator instructions in any way.
//
// This function annotates the AnalysisUsage info object to say that analyses
// that only depend on the CFG are preserved by this pass.
//
void AnalysisUsage::setPreservesCFG() {
// Since this transformation doesn't modify the CFG, it preserves all analyses
// that only depend on the CFG (like dominators, loop info, etc...)
//
Preserved.insert(Preserved.end(),
getCFGOnlyAnalyses().begin(), getCFGOnlyAnalyses().end());
}
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// PassManager implementation - The PassManager class is a simple Pimpl class // PassManager implementation - The PassManager class is a simple Pimpl class
// that wraps the PassManagerT template. // that wraps the PassManagerT template.
@ -500,3 +463,29 @@ void PassRegistrationListener::enumeratePasses() {
passEnumerate(I->second); passEnumerate(I->second);
} }
//===----------------------------------------------------------------------===//
// AnalysisUsage Class Implementation
//
// setPreservesCFG - This function should be called to by the pass, iff they do
// not:
//
// 1. Add or remove basic blocks from the function
// 2. Modify terminator instructions in any way.
//
// This function annotates the AnalysisUsage info object to say that analyses
// that only depend on the CFG are preserved by this pass.
//
void AnalysisUsage::setPreservesCFG() {
// Since this transformation doesn't modify the CFG, it preserves all analyses
// that only depend on the CFG (like dominators, loop info, etc...)
//
if (PassInfoMap) {
for (std::map<TypeInfo, PassInfo*>::iterator I = PassInfoMap->begin(),
E = PassInfoMap->end(); I != E; ++I)
if (I->second->isCFGOnlyPass())
Preserved.push_back(I->second);
}
}