summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2002-07-30 16:27:32 +0000
committerChris Lattner <sabre@nondot.org>2002-07-30 16:27:32 +0000
commit6b5fe1962b7da7e8d3d4800396065f2f26d6112d (patch)
tree0b015a504d18d24ee0c8c127e049124244494550
parent37d66c4dea6330d0a5441f82b12b9b8add1e3684 (diff)
downloadexternal_llvm-6b5fe1962b7da7e8d3d4800396065f2f26d6112d.zip
external_llvm-6b5fe1962b7da7e8d3d4800396065f2f26d6112d.tar.gz
external_llvm-6b5fe1962b7da7e8d3d4800396065f2f26d6112d.tar.bz2
* 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
-rw-r--r--include/llvm/PassSupport.h28
1 files changed, 13 insertions, 15 deletions
diff --git a/include/llvm/PassSupport.h b/include/llvm/PassSupport.h
index aad2ee6..6a6e29b 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<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();
}
};