* 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.

llvm-svn: 3156
This commit is contained in:
Chris Lattner 2002-07-30 16:27:32 +00:00
parent 198cf42178
commit 0d273698df
1 changed files with 13 additions and 15 deletions

View File

@ -124,6 +124,11 @@ struct RegisterPassBase {
protected:
PassInfo *PIObj; // The PassInfo object for this pass
void registerPass(PassInfo *);
// setPreservesCFG - Notice that this pass only depends on the CFG, so
// transformations that do not modify the CFG do not invalidate this pass.
//
void setPreservesCFG();
};
template<typename PassName>
@ -185,27 +190,20 @@ struct RegisterOpt : public RegisterPassBase {
};
// RegisterAnalysis - Register something that is to show up in Analysis, this is
// just a shortcut for specifying RegisterPass...
// just a shortcut for specifying RegisterPass... Analyses take a special
// argument that, when set to true, tells the system that the analysis ONLY
// depends on the shape of the CFG, so if a transformation preserves the CFG
// that the analysis is not invalidated.
//
template<typename PassName>
struct RegisterAnalysis : public RegisterPassBase {
RegisterAnalysis(const char *PassArg, const char *Name) {
RegisterAnalysis(const char *PassArg, const char *Name,
bool CFGOnly = false) {
registerPass(new PassInfo(Name, PassArg, typeid(PassName),
PassInfo::Analysis,
callDefaultCtor<PassName>, 0));
}
// Register Pass using default constructor explicitly...
RegisterAnalysis(const char *PassArg, const char *Name, Pass *(*ctor)()) {
registerPass(new PassInfo(Name, PassArg, typeid(PassName),
PassInfo::Analys, ctor, 0));
}
// Register Pass using TargetData constructor...
RegisterAnalysis(const char *PassArg, const char *Name,
Pass *(*datactor)(const TargetData &)) {
registerPass(new PassInfo(Name, PassArg, typeid(PassName),
PassInfo::Analysis, 0, datactor));
if (CFGOnly)
setPreservesCFG();
}
};