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

View File

@ -23,21 +23,6 @@
#include <set>
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
//
@ -49,28 +34,6 @@ void AnalysisResolver::setAnalysisResolver(Pass *P, AnalysisResolver *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
// that wraps the PassManagerT template.
@ -500,3 +463,29 @@ void PassRegistrationListener::enumeratePasses() {
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);
}
}