Mercurial > projects > ldc
view gen/optimizer.cpp @ 978:6a32d2e18175
Fix a latent bug in the asm code.
I think that technically, using "*m0" instead of "*0" allows LLVM to pick
between using the same memory as output 0 and using a new memory location.
(So far I haven't been able to construct a testcase that actually breaks
because of this, though)
author | Frits van Bommel <fvbommel wxs.nl> |
---|---|
date | Wed, 18 Feb 2009 03:38:12 +0100 |
parents | 6aaa3d3c1183 |
children | e40c65bd8c5d |
line wrap: on
line source
#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 ldc_optimize_module(Module* m, char lvl, bool doinline) { if (!doinline && lvl < 0) return; PassManager pm; pm.add(new TargetData(m)); // -O0 if (lvl >= 0) { //pm.add(createStripDeadPrototypesPass()); pm.add(createGlobalDCEPass()); } // -O1 if (lvl >= 1) { pm.add(createRaiseAllocationsPass()); pm.add(createCFGSimplificationPass()); pm.add(createPromoteMemoryToRegisterPass()); pm.add(createGlobalOptimizerPass()); pm.add(createGlobalDCEPass()); } // -O2 if (lvl >= 2) { pm.add(createIPConstantPropagationPass()); pm.add(createDeadArgEliminationPass()); pm.add(createInstructionCombiningPass()); pm.add(createCFGSimplificationPass()); pm.add(createPruneEHPass()); } // -inline if (doinline) { pm.add(createFunctionInliningPass()); } // -O3 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 -O4 and -O5 are linktime optimizations pm.run(*m); }