X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=tools%2Fllvm-ld%2FOptimize.cpp;h=6143dc87d356a2d10b3efe2100a6e6d6a4346322;hb=9e6d1d1f5034347d237941f1bf08fba5c1583cd3;hp=cbdf2f74990a6c9873a434b976857fd6b638ccb9;hpb=d2368dc344bf46e2f5df3de1bff74ab0228d99a9;p=oota-llvm.git diff --git a/tools/llvm-ld/Optimize.cpp b/tools/llvm-ld/Optimize.cpp index cbdf2f74990..6143dc87d35 100644 --- a/tools/llvm-ld/Optimize.cpp +++ b/tools/llvm-ld/Optimize.cpp @@ -13,11 +13,12 @@ #include "llvm/Module.h" #include "llvm/PassManager.h" -#include "llvm/Analysis/LoadValueNumbering.h" #include "llvm/Analysis/Passes.h" #include "llvm/Analysis/LoopPass.h" #include "llvm/Analysis/Verifier.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/StandardPasses.h" +#include "llvm/Support/raw_ostream.h" #include "llvm/System/DynamicLibrary.h" #include "llvm/Target/TargetData.h" #include "llvm/Target/TargetMachine.h" @@ -25,7 +26,6 @@ #include "llvm/Transforms/Scalar.h" #include "llvm/Support/PassNameParser.h" #include "llvm/Support/PluginLoader.h" -#include using namespace llvm; // Pass Name Options as generated by the PassNameParser @@ -35,35 +35,6 @@ static cl::list //Don't verify at the end static cl::opt DontVerify("disable-verify", cl::ReallyHidden); -// Optimization Enumeration -enum OptimizationLevels { - OPT_FAST_COMPILE = 1, - OPT_SIMPLE = 2, - OPT_AGGRESSIVE = 3, - OPT_LINK_TIME = 4, - OPT_AGGRESSIVE_LINK_TIME = 5 -}; - -// Optimization Options -static cl::opt OptLevel( - cl::desc("Choose level of optimization to apply:"), - cl::init(OPT_FAST_COMPILE), cl::values( - clEnumValN(OPT_FAST_COMPILE,"O0", - "An alias for the -O1 option."), - clEnumValN(OPT_FAST_COMPILE,"O1", - "Optimize for linking speed, not execution speed."), - clEnumValN(OPT_SIMPLE,"O2", - "Perform only required/minimal optimizations"), - clEnumValN(OPT_AGGRESSIVE,"O3", - "An alias for the -O2 option."), - clEnumValN(OPT_LINK_TIME,"O4", - "Perform standard link time optimizations"), - clEnumValN(OPT_AGGRESSIVE_LINK_TIME,"O5", - "Perform aggressive link time optimizations"), - clEnumValEnd - ) -); - static cl::opt DisableInline("disable-inlining", cl::desc("Do not run the inliner pass")); @@ -121,69 +92,9 @@ void Optimize(Module* M) { // Add an appropriate TargetData instance for this module... addPass(Passes, new TargetData(M)); - if (!DisableOptimizations) { - // Now that composite has been compiled, scan through the module, looking - // for a main function. If main is defined, mark all other functions - // internal. - if (!DisableInternalize) - addPass(Passes, createInternalizePass(true)); - - // Propagate constants at call sites into the functions they call. This - // opens opportunities for globalopt (and inlining) by substituting function - // pointers passed as arguments to direct uses of functions. - addPass(Passes, createIPSCCPPass()); - - // Now that we internalized some globals, see if we can hack on them! - addPass(Passes, createGlobalOptimizerPass()); - - // Linking modules together can lead to duplicated global constants, only - // keep one copy of each constant... - addPass(Passes, createConstantMergePass()); - - // Remove unused arguments from functions... - addPass(Passes, createDeadArgEliminationPass()); - - // Reduce the code after globalopt and ipsccp. Both can open up significant - // simplification opportunities, and both can propagate functions through - // function pointers. When this happens, we often have to resolve varargs - // calls, etc, so let instcombine do this. - addPass(Passes, createInstructionCombiningPass()); - - if (!DisableInline) - addPass(Passes, createFunctionInliningPass()); // Inline small functions - - addPass(Passes, createPruneEHPass()); // Remove dead EH info - addPass(Passes, createGlobalOptimizerPass()); // Optimize globals again. - addPass(Passes, createGlobalDCEPass()); // Remove dead functions - - // If we didn't decide to inline a function, check to see if we can - // transform it to pass arguments by value instead of by reference. - addPass(Passes, createArgumentPromotionPass()); - - // The IPO passes may leave cruft around. Clean up after them. - addPass(Passes, createInstructionCombiningPass()); - addPass(Passes, createJumpThreadingPass()); // Thread jumps. - addPass(Passes, createScalarReplAggregatesPass()); // Break up allocas - - // Run a few AA driven optimizations here and now, to cleanup the code. - addPass(Passes, createGlobalsModRefPass()); // IP alias analysis - - addPass(Passes, createLICMPass()); // Hoist loop invariants - addPass(Passes, createGVNPass()); // Remove redundancies - addPass(Passes, createMemCpyOptPass()); // Remove dead memcpy's - addPass(Passes, createDeadStoreEliminationPass()); // Nuke dead stores - - // Cleanup and simplify the code after the scalar optimizations. - addPass(Passes, createInstructionCombiningPass()); - - addPass(Passes, createJumpThreadingPass()); // Thread jumps. - - // Delete basic blocks, which optimization passes may have killed... - addPass(Passes, createCFGSimplificationPass()); - - // Now that we have optimized the program, discard unreachable functions... - addPass(Passes, createGlobalDCEPass()); - } + if (!DisableOptimizations) + createStandardLTOPasses(&Passes, !DisableInternalize, !DisableInline, + VerifyEach); // If the -s or -S command line options were specified, strip the symbols out // of the resulting program to make it smaller. -s and -S are GNU ld options @@ -198,8 +109,8 @@ void Optimize(Module* M) { if (Opt->getNormalCtor()) addPass(Passes, Opt->getNormalCtor()()); else - std::cerr << "llvm-ld: cannot create pass: " << Opt->getPassName() - << "\n"; + errs() << "llvm-ld: cannot create pass: " << Opt->getPassName() + << "\n"; } // The user's passes may leave cruft around. Clean up after them them but @@ -207,7 +118,7 @@ void Optimize(Module* M) { if (!DisableOptimizations) { addPass(Passes, createInstructionCombiningPass()); addPass(Passes, createCFGSimplificationPass()); - addPass(Passes, createDeadCodeEliminationPass()); + addPass(Passes, createAggressiveDCEPass()); addPass(Passes, createGlobalDCEPass()); }