00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "llvm/Module.h"
00019 #include "llvm/PassManager.h"
00020 #include "llvm/Analysis/Passes.h"
00021 #include "llvm/Analysis/LoopPass.h"
00022 #include "llvm/Analysis/Verifier.h"
00023 #include "llvm/Support/CommandLine.h"
00024 #include "llvm/System/DynamicLibrary.h"
00025 #include "llvm/Target/TargetData.h"
00026 #include "llvm/Target/TargetMachine.h"
00027 #include "llvm/Transforms/IPO.h"
00028 #include "llvm/Transforms/Scalar.h"
00029 #include "llvm/Support/PassNameParser.h"
00030 #include "llvm/Support/PluginLoader.h"
00031 #include <iostream>
00032 using namespace llvm;
00033
00034 #if 0
00035
00036 static cl::list<const PassInfo*, bool, PassNameParser>
00037 OptimizationList(cl::desc("Optimizations available:"));
00038 #endif
00039
00040
00041 static cl::opt<bool> DontVerify("disable-verify", cl::ReallyHidden);
00042
00043 static cl::opt<bool> DisableInline("disable-inlining",
00044 cl::desc("Do not run the inliner pass"));
00045
00046 static cl::opt<bool>
00047 DisableOptimizations("disable-opt",
00048 cl::desc("Do not run any optimization passes"));
00049
00050 static cl::opt<bool> DisableInternalize("disable-internalize",
00051 cl::desc("Do not mark all symbols as internal"));
00052
00053 static cl::opt<bool> VerifyEach("verify-each",
00054 cl::desc("Verify intermediate results of all passes"));
00055
00056 static cl::alias ExportDynamic("export-dynamic",
00057 cl::aliasopt(DisableInternalize),
00058 cl::desc("Alias for -disable-internalize"));
00059
00060 static cl::opt<bool> Strip("strip-all",
00061 cl::desc("Strip all symbol info from executable"));
00062
00063 static cl::alias A0("s", cl::desc("Alias for --strip-all"),
00064 cl::aliasopt(Strip));
00065
00066 static cl::opt<bool> StripDebug("strip-debug",
00067 cl::desc("Strip debugger symbol info from executable"));
00068
00069 static cl::alias A1("S", cl::desc("Alias for --strip-debug"),
00070 cl::aliasopt(StripDebug));
00071
00072
00073
00074 static inline void addPass(PassManager &PM, Pass *P) {
00075
00076 PM.add(P);
00077
00078
00079 if (VerifyEach)
00080 PM.add(createVerifierPass());
00081 }
00082
00083 namespace llvm {
00084
00085
00086 static void AddStandardCompilePasses(PassManager &PM) {
00087 PM.add(createVerifierPass());
00088
00089 addPass(PM, createLowerSetJmpPass());
00090
00091
00092 if (StripDebug)
00093 addPass(PM, createStripSymbolsPass(true));
00094
00095 if (DisableOptimizations) return;
00096
00097 addPass(PM, createRaiseAllocationsPass());
00098 addPass(PM, createCFGSimplificationPass());
00099 addPass(PM, createPromoteMemoryToRegisterPass());
00100 addPass(PM, createGlobalOptimizerPass());
00101 addPass(PM, createGlobalDCEPass());
00102 addPass(PM, createIPConstantPropagationPass());
00103 addPass(PM, createDeadArgEliminationPass());
00104 addPass(PM, createInstructionCombiningPass());
00105 addPass(PM, createCFGSimplificationPass());
00106
00107 addPass(PM, createPruneEHPass());
00108 addPass(PM, createFunctionAttrsPass());
00109
00110 if (!DisableInline)
00111 addPass(PM, createFunctionInliningPass());
00112 addPass(PM, createArgumentPromotionPass());
00113
00114 addPass(PM, createSimplifyLibCallsPass());
00115 addPass(PM, createInstructionCombiningPass());
00116 addPass(PM, createJumpThreadingPass());
00117 addPass(PM, createCFGSimplificationPass());
00118 addPass(PM, createScalarReplAggregatesPass());
00119 addPass(PM, createInstructionCombiningPass());
00120 addPass(PM, createCondPropagationPass());
00121
00122 addPass(PM, createTailCallEliminationPass());
00123 addPass(PM, createCFGSimplificationPass());
00124 addPass(PM, createReassociatePass());
00125 addPass(PM, createLoopRotatePass());
00126 addPass(PM, createLICMPass());
00127 addPass(PM, createLoopUnswitchPass());
00128 addPass(PM, createLoopIndexSplitPass());
00129
00130 addPass(PM, createInstructionCombiningPass());
00131 addPass(PM, createIndVarSimplifyPass());
00132 addPass(PM, createLoopDeletionPass());
00133 addPass(PM, createLoopUnrollPass());
00134 addPass(PM, createInstructionCombiningPass());
00135 addPass(PM, createGVNPass());
00136 addPass(PM, createMemCpyOptPass());
00137 addPass(PM, createSCCPPass());
00138
00139
00140
00141 addPass(PM, createInstructionCombiningPass());
00142 addPass(PM, createCondPropagationPass());
00143
00144 addPass(PM, createDeadStoreEliminationPass());
00145 addPass(PM, createAggressiveDCEPass());
00146 addPass(PM, createCFGSimplificationPass());
00147 addPass(PM, createStripDeadPrototypesPass());
00148 addPass(PM, createDeadTypeEliminationPass());
00149 addPass(PM, createConstantMergePass());
00150 }
00151
00155 void Optimize(Module* M) {
00156
00157
00158 PassManager Passes;
00159
00160
00161 if (VerifyEach)
00162 Passes.add(createVerifierPass());
00163
00164
00165 addPass(Passes, new TargetData(M));
00166
00167
00168 AddStandardCompilePasses(Passes);
00169
00170 if (!DisableOptimizations) {
00171
00172
00173
00174 if (!DisableInternalize)
00175 addPass(Passes, createInternalizePass(true));
00176
00177
00178
00179
00180 addPass(Passes, createIPSCCPPass());
00181
00182
00183 addPass(Passes, createGlobalOptimizerPass());
00184
00185
00186
00187 addPass(Passes, createConstantMergePass());
00188
00189
00190 addPass(Passes, createDeadArgEliminationPass());
00191
00192
00193
00194
00195
00196 addPass(Passes, createInstructionCombiningPass());
00197
00198 if (!DisableInline)
00199 addPass(Passes, createFunctionInliningPass());
00200
00201 addPass(Passes, createPruneEHPass());
00202 addPass(Passes, createGlobalOptimizerPass());
00203 addPass(Passes, createGlobalDCEPass());
00204
00205
00206
00207 addPass(Passes, createArgumentPromotionPass());
00208
00209
00210 addPass(Passes, createInstructionCombiningPass());
00211 addPass(Passes, createJumpThreadingPass());
00212 addPass(Passes, createScalarReplAggregatesPass());
00213
00214
00215 addPass(Passes, createFunctionAttrsPass());
00216 addPass(Passes, createGlobalsModRefPass());
00217
00218 addPass(Passes, createLICMPass());
00219 addPass(Passes, createGVNPass());
00220 addPass(Passes, createMemCpyOptPass());
00221 addPass(Passes, createDeadStoreEliminationPass());
00222
00223
00224 addPass(Passes, createInstructionCombiningPass());
00225
00226 addPass(Passes, createJumpThreadingPass());
00227 addPass(Passes, createPromoteMemoryToRegisterPass());
00228
00229
00230 addPass(Passes, createCFGSimplificationPass());
00231
00232
00233 addPass(Passes, createGlobalDCEPass());
00234 }
00235
00236
00237
00238
00239 if (Strip || StripDebug)
00240 addPass(Passes, createStripSymbolsPass(StripDebug && !Strip));
00241
00242 #if 0
00243
00244 std::auto_ptr<TargetMachine> target;
00245 for (unsigned i = 0; i < OptimizationList.size(); ++i) {
00246 const PassInfo *Opt = OptimizationList[i];
00247 if (Opt->getNormalCtor())
00248 addPass(Passes, Opt->getNormalCtor()());
00249 else
00250 std::cerr << "llvm-ld: cannot create pass: " << Opt->getPassName()
00251 << "\n";
00252 }
00253 #endif
00254
00255
00256
00257 if (!DisableOptimizations) {
00258 addPass(Passes, createInstructionCombiningPass());
00259 addPass(Passes, createCFGSimplificationPass());
00260 addPass(Passes, createAggressiveDCEPass());
00261 addPass(Passes, createGlobalDCEPass());
00262 }
00263
00264
00265 if (!DontVerify)
00266 Passes.add(createVerifierPass());
00267
00268
00269 Passes.run(*M);
00270 }
00271
00272 }