#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"
#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,
{ 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> },
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"),
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);
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));