* Implement stuff so that code can declare that they only depend on the CFG of
authorChris Lattner <sabre@nondot.org>
Tue, 30 Jul 2002 16:27:32 +0000 (16:27 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 30 Jul 2002 16:27:32 +0000 (16:27 +0000)
  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

index aad2ee6998e67b832fb436deae9a5ac5bf05cb25..6a6e29ba4bfd07695a773c521097215723e8a474 100644 (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();
   }
 };