Tighten up the AnalysisUsage of lots of passes, primarily to correctly indicate whether or not they invalidate the CFGA


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2386 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/SparcV9/SparcV9AsmPrinter.cpp b/lib/Target/SparcV9/SparcV9AsmPrinter.cpp
index fa2aeaa..f4ca22f 100644
--- a/lib/Target/SparcV9/SparcV9AsmPrinter.cpp
+++ b/lib/Target/SparcV9/SparcV9AsmPrinter.cpp
@@ -209,6 +209,10 @@
     return false;
   }
 
+  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+    AU.setPreservesAll();
+  }
+
   void emitFunction(const Function *F);
 private :
   void emitBasicBlock(const BasicBlock *BB);
@@ -427,6 +431,11 @@
     return false;
   }
 
+  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+    AU.setPreservesAll();
+  }
+
+private:
   void emitGlobalsAndConstants(const Module *M);
 
   void printGlobalVariable(const GlobalVariable *GV);
@@ -436,7 +445,6 @@
 
   static void FoldConstants(const Module *M,
                             std::hash_set<const Constant*> &moduleConstants);
-
 };
 
 
diff --git a/lib/Transforms/HoistPHIConstants.cpp b/lib/Transforms/HoistPHIConstants.cpp
index f6e6109..e969ac2 100644
--- a/lib/Transforms/HoistPHIConstants.cpp
+++ b/lib/Transforms/HoistPHIConstants.cpp
@@ -76,6 +76,10 @@
 namespace {
   struct HoistPHIConstants : public FunctionPass {
     virtual bool runOnFunction(Function *F) { return doHoistPHIConstants(F); }
+
+    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+      AU.preservesCFG();
+    }
   };
 }
 
diff --git a/lib/Transforms/IPO/ConstantMerge.cpp b/lib/Transforms/IPO/ConstantMerge.cpp
index ee28b13..a635b8d 100644
--- a/lib/Transforms/IPO/ConstantMerge.cpp
+++ b/lib/Transforms/IPO/ConstantMerge.cpp
@@ -82,6 +82,10 @@
       Constants.clear();
       return false;
     }
+
+    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+      AU.setPreservesAll();
+    }
   };
   
   struct DynamicConstantMerge : public ConstantMerge {
diff --git a/lib/Transforms/Instrumentation/TraceValues.cpp b/lib/Transforms/Instrumentation/TraceValues.cpp
index 7b263c7..3845162 100644
--- a/lib/Transforms/Instrumentation/TraceValues.cpp
+++ b/lib/Transforms/Instrumentation/TraceValues.cpp
@@ -49,6 +49,10 @@
     bool runOnFunction(Function *F) {
       return doit(F, TraceBasicBlockExits, TraceFunctionExits, PrintfFunc);
     }
+
+    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+      AU.preservesCFG();
+    }
   };
 } // end anonymous namespace
 
diff --git a/lib/Transforms/LevelRaise.cpp b/lib/Transforms/LevelRaise.cpp
index 77d06a0..07981d0 100644
--- a/lib/Transforms/LevelRaise.cpp
+++ b/lib/Transforms/LevelRaise.cpp
@@ -472,6 +472,10 @@
 namespace {
   struct RaisePointerReferences : public FunctionPass {
     virtual bool runOnFunction(Function *F) { return doRPR(F); }
+
+    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+      AU.preservesCFG();
+    }
   };
 }
 
diff --git a/lib/Transforms/Scalar/ConstantProp.cpp b/lib/Transforms/Scalar/ConstantProp.cpp
index 0f1d0ae..a8dbe3f 100644
--- a/lib/Transforms/Scalar/ConstantProp.cpp
+++ b/lib/Transforms/Scalar/ConstantProp.cpp
@@ -219,6 +219,12 @@
       
       return Modified;
     }
+
+    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+      // FIXME: This pass does not preserve the CFG because it folds terminator
+      // instructions!
+      //AU.preservesCFG();
+    }
   };
 }
 
diff --git a/lib/Transforms/Scalar/DecomposeMultiDimRefs.cpp b/lib/Transforms/Scalar/DecomposeMultiDimRefs.cpp
index 78dcfd5..f901a29 100644
--- a/lib/Transforms/Scalar/DecomposeMultiDimRefs.cpp
+++ b/lib/Transforms/Scalar/DecomposeMultiDimRefs.cpp
@@ -175,6 +175,10 @@
     virtual bool runOnFunction(Function *F) {
       return doDecomposeMultiDimRefs(F);
     }
+
+    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+      AU.preservesCFG();
+    }
   };
 }
 
diff --git a/lib/Transforms/Scalar/GCSE.cpp b/lib/Transforms/Scalar/GCSE.cpp
index 8bdbad5..b864760 100644
--- a/lib/Transforms/Scalar/GCSE.cpp
+++ b/lib/Transforms/Scalar/GCSE.cpp
@@ -51,7 +51,7 @@
 
     // This transformation requires dominator and immediate dominator info
     virtual void getAnalysisUsage(AnalysisUsage &AU) const {
-      //preservesCFG(AU);
+      AU.preservesCFG();
       AU.addRequired(DominatorSet::ID);
       AU.addRequired(ImmediateDominators::ID); 
     }
diff --git a/lib/Transforms/Scalar/IndVarSimplify.cpp b/lib/Transforms/Scalar/IndVarSimplify.cpp
index a115e05..003419b 100644
--- a/lib/Transforms/Scalar/IndVarSimplify.cpp
+++ b/lib/Transforms/Scalar/IndVarSimplify.cpp
@@ -203,6 +203,7 @@
     
     virtual void getAnalysisUsage(AnalysisUsage &AU) const {
       AU.addRequired(LoopInfo::ID);
+      AU.preservesCFG();
     }
   };
 }
diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp
index dea0244..626c130 100644
--- a/lib/Transforms/Scalar/InstructionCombining.cpp
+++ b/lib/Transforms/Scalar/InstructionCombining.cpp
@@ -42,10 +42,12 @@
     }
 
   public:
-
-
     virtual bool runOnFunction(Function *F);
 
+    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+      AU.preservesCFG();
+    }
+
     // Visitation implementation - Implement instruction combining for different
     // instruction types.  The semantics are as follows:
     // Return Value:
diff --git a/lib/Transforms/Scalar/SCCP.cpp b/lib/Transforms/Scalar/SCCP.cpp
index c68004d..12d518b 100644
--- a/lib/Transforms/Scalar/SCCP.cpp
+++ b/lib/Transforms/Scalar/SCCP.cpp
@@ -470,6 +470,10 @@
       SCCP S(F);
       return S.doSCCP();
     }
+    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+      // FIXME: SCCP does not preserve the CFG because it folds terminators!
+      //AU.preservesCFG();
+    }
   };
 }
 
diff --git a/lib/Transforms/Scalar/SymbolStripping.cpp b/lib/Transforms/Scalar/SymbolStripping.cpp
index 36b465e..f99684f 100644
--- a/lib/Transforms/Scalar/SymbolStripping.cpp
+++ b/lib/Transforms/Scalar/SymbolStripping.cpp
@@ -64,6 +64,9 @@
     virtual bool runOnFunction(Function *F) {
       return doSymbolStripping(F);
     }
+    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+      AU.setPreservesAll();
+    }
   };
 
   struct FullSymbolStripping : public SymbolStripping {
diff --git a/lib/Transforms/Utils/PromoteMemoryToRegister.cpp b/lib/Transforms/Utils/PromoteMemoryToRegister.cpp
index ab94550..e0d2c24 100644
--- a/lib/Transforms/Utils/PromoteMemoryToRegister.cpp
+++ b/lib/Transforms/Utils/PromoteMemoryToRegister.cpp
@@ -53,6 +53,7 @@
     //
     virtual void getAnalysisUsage(AnalysisUsage &AU) const {
       AU.addRequired(DominanceFrontier::ID);
+      AU.preservesCFG();
     }
 
   private:
diff --git a/lib/VMCore/Verifier.cpp b/lib/VMCore/Verifier.cpp
index de439b7..8621ea7 100644
--- a/lib/VMCore/Verifier.cpp
+++ b/lib/VMCore/Verifier.cpp
@@ -81,6 +81,10 @@
       return false;
     }
 
+    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+      AU.setPreservesAll();
+    }
+
     // Verification methods...
     void verifySymbolTable(SymbolTable *ST);
     void visitFunction(Function *F);
diff --git a/tools/analyze/analyze.cpp b/tools/analyze/analyze.cpp
index 85d6ae4..8a1d86c 100644
--- a/tools/analyze/analyze.cpp
+++ b/tools/analyze/analyze.cpp
@@ -110,6 +110,7 @@
 
   virtual void getAnalysisUsage(AnalysisUsage &AU) const {
     AU.addRequired(ID);
+    AU.setPreservesAll();
   }
 };
 
@@ -137,6 +138,10 @@
   void doit(Function *F) {
     std::cout << analysis::InstForest<char>(F);
   }
+
+  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+    AU.setPreservesAll();
+  }
 };
 
 struct IndVars : public FunctionPass {
@@ -152,6 +157,7 @@
 
   void getAnalysisUsage(AnalysisUsage &AU) const {
     AU.addRequired(LoopInfo::ID);
+    AU.setPreservesAll();
   }
 };
 
@@ -183,6 +189,9 @@
       std::cout << "\n\n";
     }
   }
+  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+    AU.setPreservesAll();
+  }
 };