Mercurial > projects > ldc
diff gen/optimizer.cpp @ 125:c42d245468ea trunk
[svn r129] Started AA literals.
Fixed #15, passing -O will now invoke the optimizer before writing bitcode.
author | lindquist |
---|---|
date | Wed, 28 Nov 2007 04:52:35 +0100 |
parents | |
children | 8096ba7082db |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gen/optimizer.cpp Wed Nov 28 04:52:35 2007 +0100 @@ -0,0 +1,81 @@ +#include "llvm/PassManager.h" +#include "llvm/LinkAllPasses.h" +#include "llvm/Analysis/LoopPass.h" +#include "llvm/Target/TargetData.h" + +using namespace llvm; + +////////////////////////////////////////////////////////////////////////////////////////// + +// this function runs some or all of the std-compile-opts passes depending on the +// optimization level given. + +void llvmdc_optimize_module(Module* m, char lvl, bool doinline) +{ + assert(lvl >= 0 && lvl <= 5); + if (lvl == 0) + return; + + PassManager pm; + pm.add(new TargetData(m)); + + if (lvl >= 1) + { + pm.add(createRaiseAllocationsPass()); + pm.add(createCFGSimplificationPass()); + pm.add(createPromoteMemoryToRegisterPass()); + } + + if (lvl >= 2) + { + pm.add(createGlobalOptimizerPass()); + pm.add(createGlobalDCEPass()); + pm.add(createIPConstantPropagationPass()); + pm.add(createDeadArgEliminationPass()); + pm.add(createInstructionCombiningPass()); + pm.add(createCFGSimplificationPass()); + pm.add(createPruneEHPass()); + } + + if (doinline) { + pm.add(createFunctionInliningPass()); + } + + if (lvl >= 3) + { + pm.add(createArgumentPromotionPass()); + pm.add(createTailDuplicationPass()); + pm.add(createInstructionCombiningPass()); + pm.add(createCFGSimplificationPass()); + pm.add(createScalarReplAggregatesPass()); + pm.add(createInstructionCombiningPass()); + pm.add(createCondPropagationPass()); + + pm.add(createTailCallEliminationPass()); + pm.add(createCFGSimplificationPass()); + pm.add(createReassociatePass()); + pm.add(createLoopRotatePass()); + pm.add(createLICMPass()); + pm.add(createLoopUnswitchPass()); + pm.add(createInstructionCombiningPass()); + pm.add(createIndVarSimplifyPass()); + pm.add(createLoopUnrollPass()); + pm.add(createInstructionCombiningPass()); + pm.add(createGVNPass()); + pm.add(createSCCPPass()); + + pm.add(createInstructionCombiningPass()); + pm.add(createCondPropagationPass()); + + pm.add(createDeadStoreEliminationPass()); + pm.add(createAggressiveDCEPass()); + pm.add(createCFGSimplificationPass()); + pm.add(createSimplifyLibCallsPass()); + pm.add(createDeadTypeEliminationPass()); + pm.add(createConstantMergePass()); + } + + // level 4 and 5 are linktime optimizations + + pm.run(*m); +}