Genericize the ReversePostOrderIterator.
[oota-llvm.git] / tools / opt / opt.cpp
index a94ff76b33eca0af035bbfee6478a609bb616d90..2d77306671e8ccead26370dfcf6ce3e141ea37eb 100644 (file)
@@ -11,6 +11,8 @@
 #include "llvm/Bytecode/Reader.h"
 #include "llvm/Bytecode/WriteBytecodePass.h"
 #include "llvm/Assembly/PrintModulePass.h"
+#include "llvm/Analysis/Verifier.h"
+#include "llvm/Transforms/UnifyMethodExitNodes.h"
 #include "llvm/Transforms/ConstantMerge.h"
 #include "llvm/Transforms/CleanupGCCOutput.h"
 #include "llvm/Transforms/LevelChange.h"
@@ -23,6 +25,7 @@
 #include "llvm/Transforms/Scalar/ConstantProp.h"
 #include "llvm/Transforms/Scalar/IndVarSimplify.h"
 #include "llvm/Transforms/Scalar/InstructionCombining.h"
+#include "llvm/Transforms/Scalar/PromoteMemoryToRegister.h"
 #include "llvm/Transforms/Instrumentation/TraceValues.h"
 #include "Support/CommandLine.h"
 #include <fstream>
 // Opts enum - All of the transformations we can do...
 enum Opts {
   // Basic optimizations
-  dce, constprop, inlining, constmerge, strip, mstrip,
+  dce, constprop, inlining, constmerge, strip, mstrip, mergereturn,
 
   // Miscellaneous Transformations
-  trace, tracem, print, raiseallocs, cleangcc,
+  trace, tracem, raiseallocs, cleangcc,
+
+  // Printing and verifying...
+  print, verify,
 
   // More powerful optimizations
-  indvars, instcombine, sccp, adce, raise,
+  indvars, instcombine, sccp, adce, raise, mem2reg,
 
   // Interprocedural optimizations...
   globaldce, swapstructs, sortstructs,
@@ -79,14 +85,19 @@ struct {
   { constmerge , New<ConstantMerge> },
   { strip      , New<SymbolStripping> },
   { mstrip     , New<FullSymbolStripping> },
+  { mergereturn, New<UnifyMethodExitNodes> },
+
   { indvars    , New<InductionVariableSimplify> },
   { instcombine, New<InstructionCombining> },
   { sccp       , New<SCCPPass> },
   { adce       , New<AgressiveDCE> },
   { raise      , New<RaisePointerReferences> },
+  { mem2reg    , newPromoteMemoryToRegister },
+
   { trace      , New<InsertTraceCode, bool, true, bool, true> },
   { tracem     , New<InsertTraceCode, bool, false, bool, true> },
   { print      , NewPrintMethodPass },
+  { verify     , createVerifierPass },
   { raiseallocs, New<RaiseAllocations> },
   { cleangcc   , New<CleanupGCCOutput> },
   { globaldce  , New<GlobalDCE> },
@@ -106,15 +117,18 @@ cl::Flag   Quiet         ("q", "Don't print modifying pass names", 0, false);
 cl::Alias  QuietA        ("quiet", "Alias for -q", cl::NoFlags, Quiet);
 cl::EnumList<enum Opts> OptimizationList(cl::NoFlags,
   clEnumVal(dce        , "Dead Code Elimination"),
-  clEnumVal(constprop  , "Simple Constant Propogation"),
- clEnumValN(inlining   , "inline", "Method Integration"),
+  clEnumVal(constprop  , "Simple constant propogation"),
+ clEnumValN(inlining   , "inline", "Method integration"),
   clEnumVal(constmerge , "Merge identical global constants"),
-  clEnumVal(strip      , "Strip Symbols"),
-  clEnumVal(mstrip     , "Strip Module Symbols"),
+  clEnumVal(strip      , "Strip symbols"),
+  clEnumVal(mstrip     , "Strip module symbols"),
+  clEnumVal(mergereturn, "Unify method exit nodes"),
+
   clEnumVal(indvars    , "Simplify Induction Variables"),
   clEnumVal(instcombine, "Combine redundant instructions"),
   clEnumVal(sccp       , "Sparse Conditional Constant Propogation"),
   clEnumVal(adce       , "Agressive DCE"),
+  clEnumVal(mem2reg    , "Promote alloca locations to registers"),
 
   clEnumVal(globaldce  , "Remove unreachable globals"),
   clEnumVal(swapstructs, "Swap structure types around"),
@@ -125,7 +139,9 @@ cl::EnumList<enum Opts> OptimizationList(cl::NoFlags,
   clEnumVal(raise      , "Raise to Higher Level"),
   clEnumVal(trace      , "Insert BB & Method trace code"),
   clEnumVal(tracem     , "Insert Method trace code only"),
+
   clEnumVal(print      , "Print working method to stderr"),
+  clEnumVal(verify     , "Verify module is well formed"),
 0);
 
 
@@ -176,6 +192,9 @@ int main(int argc, char **argv) {
       Passes.add(new PrintModulePass(&std::cerr));
   }
 
+  // Check that the module is well formed on completion of optimization
+  Passes.add(createVerifierPass());
+
   // Write bytecode out to disk or cout as the last step...
   Passes.add(new WriteBytecodePass(Out, Out != &std::cout));