From 6b5fe1962b7da7e8d3d4800396065f2f26d6112d Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 30 Jul 2002 16:27:32 +0000 Subject: [PATCH] * 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@3156 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/PassSupport.h | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/include/llvm/PassSupport.h b/include/llvm/PassSupport.h index aad2ee6998e..6a6e29ba4bf 100644 --- a/include/llvm/PassSupport.h +++ b/include/llvm/PassSupport.h @@ -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 @@ -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 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, 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(); } };