llvm.org GIT mirror llvm / 3d453ac
move PassManagerBuilder.h to IPO. This is a non intuitive place to put it, but it solves a layering violation since things in Support are not supposed to use things in Transforms. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@136726 91177308-0d34-0410-b5e6-96231b3b80d8 Rafael Espindola 8 years ago
6 changed file(s) with 335 addition(s) and 335 deletion(s). Raw diff Collapse all Expand all
+0
-331
include/llvm/Support/PassManagerBuilder.h less more
None //===-- llvm/Support/PassManagerBuilder.h - Build Standard Pass -*- C++ -*-===//
1 //
2 // The LLVM Compiler Infrastructure
3 //
4 // This file is distributed under the University of Illinois Open Source
5 // License. See LICENSE.TXT for details.
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file defines the PassManagerBuilder class, which is used to set up a
10 // "standard" optimization sequence suitable for languages like C and C++.
11 //
12 // These are implemented as inline functions so that we do not have to worry
13 // about link issues.
14 //
15 //===----------------------------------------------------------------------===//
16
17 #ifndef LLVM_SUPPORT_PASSMANAGERBUILDER_H
18 #define LLVM_SUPPORT_PASSMANAGERBUILDER_H
19
20 #include "llvm/PassManager.h"
21 #include "llvm/DefaultPasses.h"
22 #include "llvm/Analysis/Passes.h"
23 #include "llvm/Analysis/Verifier.h"
24 #include "llvm/Target/TargetLibraryInfo.h"
25 #include "llvm/Transforms/Scalar.h"
26 #include "llvm/Transforms/IPO.h"
27
28 namespace llvm {
29
30 /// PassManagerBuilder - This class is used to set up a standard optimization
31 /// sequence for languages like C and C++, allowing some APIs to customize the
32 /// pass sequence in various ways. A simple example of using it would be:
33 ///
34 /// PassManagerBuilder Builder;
35 /// Builder.OptLevel = 2;
36 /// Builder.populateFunctionPassManager(FPM);
37 /// Builder.populateModulePassManager(MPM);
38 ///
39 /// In addition to setting up the basic passes, PassManagerBuilder allows
40 /// frontends to vend a plugin API, where plugins are allowed to add extensions
41 /// to the default pass manager. They do this by specifying where in the pass
42 /// pipeline they want to be added, along with a callback function that adds
43 /// the pass(es). For example, a plugin that wanted to add a loop optimization
44 /// could do something like this:
45 ///
46 /// static void addMyLoopPass(const PMBuilder &Builder, PassManagerBase &PM) {
47 /// if (Builder.getOptLevel() > 2 && Builder.getOptSizeLevel() == 0)
48 /// PM.add(createMyAwesomePass());
49 /// }
50 /// ...
51 /// Builder.addExtension(PassManagerBuilder::EP_LoopOptimizerEnd,
52 /// addMyLoopPass);
53 /// ...
54 class PassManagerBuilder {
55 public:
56
57 /// Extensions are passed the builder itself (so they can see how it is
58 /// configured) as well as the pass manager to add stuff to.
59 typedef void (*ExtensionFn)(const PassManagerBuilder &Builder,
60 PassManagerBase &PM);
61 enum ExtensionPointTy {
62 /// EP_EarlyAsPossible - This extension point allows adding passes before
63 /// any other transformations, allowing them to see the code as it is coming
64 /// out of the frontend.
65 EP_EarlyAsPossible,
66
67 /// EP_LoopOptimizerEnd - This extension point allows adding loop passes to
68 /// the end of the loop optimizer.
69 EP_LoopOptimizerEnd,
70
71 /// EP_ScalarOptimizerLate - This extension point allows adding optimization
72 /// passes after most of the main optimizations, but before the last
73 /// cleanup-ish optimizations.
74 EP_ScalarOptimizerLate
75 };
76
77 /// The Optimization Level - Specify the basic optimization level.
78 /// 0 = -O0, 1 = -O1, 2 = -O2, 3 = -O3
79 unsigned OptLevel;
80
81 /// SizeLevel - How much we're optimizing for size.
82 /// 0 = none, 1 = -Os, 2 = -Oz
83 unsigned SizeLevel;
84
85 /// LibraryInfo - Specifies information about the runtime library for the
86 /// optimizer. If this is non-null, it is added to both the function and
87 /// per-module pass pipeline.
88 TargetLibraryInfo *LibraryInfo;
89
90 /// Inliner - Specifies the inliner to use. If this is non-null, it is
91 /// added to the per-module passes.
92 Pass *Inliner;
93
94 bool DisableSimplifyLibCalls;
95 bool DisableUnitAtATime;
96 bool DisableUnrollLoops;
97
98 private:
99 /// ExtensionList - This is list of all of the extensions that are registered.
100 std::vector > Extensions;
101
102 public:
103 PassManagerBuilder() {
104 OptLevel = 2;
105 SizeLevel = 0;
106 LibraryInfo = 0;
107 Inliner = 0;
108 DisableSimplifyLibCalls = false;
109 DisableUnitAtATime = false;
110 DisableUnrollLoops = false;
111 }
112
113 ~PassManagerBuilder() {
114 delete LibraryInfo;
115 delete Inliner;
116 }
117
118 void addExtension(ExtensionPointTy Ty, ExtensionFn Fn) {
119 Extensions.push_back(std::make_pair(Ty, Fn));
120 }
121
122 private:
123 void addExtensionsToPM(ExtensionPointTy ETy, PassManagerBase &PM) const {
124 for (unsigned i = 0, e = Extensions.size(); i != e; ++i)
125 if (Extensions[i].first == ETy)
126 Extensions[i].second(*this, PM);
127 }
128
129 void addInitialAliasAnalysisPasses(PassManagerBase &PM) const {
130 // Add TypeBasedAliasAnalysis before BasicAliasAnalysis so that
131 // BasicAliasAnalysis wins if they disagree. This is intended to help
132 // support "obvious" type-punning idioms.
133 PM.add(createTypeBasedAliasAnalysisPass());
134 PM.add(createBasicAliasAnalysisPass());
135 }
136 public:
137
138 /// populateFunctionPassManager - This fills in the function pass manager,
139 /// which is expected to be run on each function immediately as it is
140 /// generated. The idea is to reduce the size of the IR in memory.
141 void populateFunctionPassManager(FunctionPassManager &FPM) {
142 addExtensionsToPM(EP_EarlyAsPossible, FPM);
143
144 // Add LibraryInfo if we have some.
145 if (LibraryInfo) FPM.add(new TargetLibraryInfo(*LibraryInfo));
146
147 if (OptLevel == 0) return;
148
149 addInitialAliasAnalysisPasses(FPM);
150
151 FPM.add(createCFGSimplificationPass());
152 FPM.add(createScalarReplAggregatesPass());
153 FPM.add(createEarlyCSEPass());
154 FPM.add(createLowerExpectIntrinsicPass());
155 }
156
157 /// populateModulePassManager - This sets up the primary pass manager.
158 void populateModulePassManager(PassManagerBase &MPM) {
159 // If all optimizations are disabled, just run the always-inline pass.
160 if (OptLevel == 0) {
161 if (Inliner) {
162 MPM.add(Inliner);
163 Inliner = 0;
164 }
165 return;
166 }
167
168 // Add LibraryInfo if we have some.
169 if (LibraryInfo) MPM.add(new TargetLibraryInfo(*LibraryInfo));
170
171 addInitialAliasAnalysisPasses(MPM);
172
173 if (!DisableUnitAtATime) {
174 MPM.add(createGlobalOptimizerPass()); // Optimize out global vars
175
176 MPM.add(createIPSCCPPass()); // IP SCCP
177 MPM.add(createDeadArgEliminationPass()); // Dead argument elimination
178
179 MPM.add(createInstructionCombiningPass());// Clean up after IPCP & DAE
180 MPM.add(createCFGSimplificationPass()); // Clean up after IPCP & DAE
181 }
182
183 // Start of CallGraph SCC passes.
184 if (!DisableUnitAtATime)
185 MPM.add(createPruneEHPass()); // Remove dead EH info
186 if (Inliner) {
187 MPM.add(Inliner);
188 Inliner = 0;
189 }
190 if (!DisableUnitAtATime)
191 MPM.add(createFunctionAttrsPass()); // Set readonly/readnone attrs
192 if (OptLevel > 2)
193 MPM.add(createArgumentPromotionPass()); // Scalarize uninlined fn args
194
195 // Start of function pass.
196 // Break up aggregate allocas, using SSAUpdater.
197 MPM.add(createScalarReplAggregatesPass(-1, false));
198 MPM.add(createEarlyCSEPass()); // Catch trivial redundancies
199 if (!DisableSimplifyLibCalls)
200 MPM.add(createSimplifyLibCallsPass()); // Library Call Optimizations
201 MPM.add(createJumpThreadingPass()); // Thread jumps.
202 MPM.add(createCorrelatedValuePropagationPass()); // Propagate conditionals
203 MPM.add(createCFGSimplificationPass()); // Merge & remove BBs
204 MPM.add(createInstructionCombiningPass()); // Combine silly seq's
205
206 MPM.add(createTailCallEliminationPass()); // Eliminate tail calls
207 MPM.add(createCFGSimplificationPass()); // Merge & remove BBs
208 MPM.add(createReassociatePass()); // Reassociate expressions
209 MPM.add(createLoopRotatePass()); // Rotate Loop
210 MPM.add(createLICMPass()); // Hoist loop invariants
211 MPM.add(createLoopUnswitchPass(SizeLevel || OptLevel < 3));
212 MPM.add(createInstructionCombiningPass());
213 MPM.add(createIndVarSimplifyPass()); // Canonicalize indvars
214 MPM.add(createLoopIdiomPass()); // Recognize idioms like memset.
215 MPM.add(createLoopDeletionPass()); // Delete dead loops
216 if (!DisableUnrollLoops)
217 MPM.add(createLoopUnrollPass()); // Unroll small loops
218 addExtensionsToPM(EP_LoopOptimizerEnd, MPM);
219
220 if (OptLevel > 1)
221 MPM.add(createGVNPass()); // Remove redundancies
222 MPM.add(createMemCpyOptPass()); // Remove memcpy / form memset
223 MPM.add(createSCCPPass()); // Constant prop with SCCP
224
225 // Run instcombine after redundancy elimination to exploit opportunities
226 // opened up by them.
227 MPM.add(createInstructionCombiningPass());
228 MPM.add(createJumpThreadingPass()); // Thread jumps
229 MPM.add(createCorrelatedValuePropagationPass());
230 MPM.add(createDeadStoreEliminationPass()); // Delete dead stores
231
232 addExtensionsToPM(EP_ScalarOptimizerLate, MPM);
233
234 MPM.add(createAggressiveDCEPass()); // Delete dead instructions
235 MPM.add(createCFGSimplificationPass()); // Merge & remove BBs
236 MPM.add(createInstructionCombiningPass()); // Clean up after everything.
237
238 if (!DisableUnitAtATime) {
239 // FIXME: We shouldn't bother with this anymore.
240 MPM.add(createStripDeadPrototypesPass()); // Get rid of dead prototypes
241
242 // GlobalOpt already deletes dead functions and globals, at -O3 try a
243 // late pass of GlobalDCE. It is capable of deleting dead cycles.
244 if (OptLevel > 2)
245 MPM.add(createGlobalDCEPass()); // Remove dead fns and globals.
246
247 if (OptLevel > 1)
248 MPM.add(createConstantMergePass()); // Merge dup global constants
249 }
250 }
251
252 void populateLTOPassManager(PassManagerBase &PM, bool Internalize,
253 bool RunInliner) {
254 // Provide AliasAnalysis services for optimizations.
255 addInitialAliasAnalysisPasses(PM);
256
257 // Now that composite has been compiled, scan through the module, looking
258 // for a main function. If main is defined, mark all other functions
259 // internal.
260 if (Internalize)
261 PM.add(createInternalizePass(true));
262
263 // Propagate constants at call sites into the functions they call. This
264 // opens opportunities for globalopt (and inlining) by substituting function
265 // pointers passed as arguments to direct uses of functions.
266 PM.add(createIPSCCPPass());
267
268 // Now that we internalized some globals, see if we can hack on them!
269 PM.add(createGlobalOptimizerPass());
270
271 // Linking modules together can lead to duplicated global constants, only
272 // keep one copy of each constant.
273 PM.add(createConstantMergePass());
274
275 // Remove unused arguments from functions.
276 PM.add(createDeadArgEliminationPass());
277
278 // Reduce the code after globalopt and ipsccp. Both can open up significant
279 // simplification opportunities, and both can propagate functions through
280 // function pointers. When this happens, we often have to resolve varargs
281 // calls, etc, so let instcombine do this.
282 PM.add(createInstructionCombiningPass());
283
284 // Inline small functions
285 if (RunInliner)
286 PM.add(createFunctionInliningPass());
287
288 PM.add(createPruneEHPass()); // Remove dead EH info.
289
290 // Optimize globals again if we ran the inliner.
291 if (RunInliner)
292 PM.add(createGlobalOptimizerPass());
293 PM.add(createGlobalDCEPass()); // Remove dead functions.
294
295 // If we didn't decide to inline a function, check to see if we can
296 // transform it to pass arguments by value instead of by reference.
297 PM.add(createArgumentPromotionPass());
298
299 // The IPO passes may leave cruft around. Clean up after them.
300 PM.add(createInstructionCombiningPass());
301 PM.add(createJumpThreadingPass());
302 // Break up allocas
303 PM.add(createScalarReplAggregatesPass());
304
305 // Run a few AA driven optimizations here and now, to cleanup the code.
306 PM.add(createFunctionAttrsPass()); // Add nocapture.
307 PM.add(createGlobalsModRefPass()); // IP alias analysis.
308
309 PM.add(createLICMPass()); // Hoist loop invariants.
310 PM.add(createGVNPass()); // Remove redundancies.
311 PM.add(createMemCpyOptPass()); // Remove dead memcpys.
312 // Nuke dead stores.
313 PM.add(createDeadStoreEliminationPass());
314
315 // Cleanup and simplify the code after the scalar optimizations.
316 PM.add(createInstructionCombiningPass());
317
318 PM.add(createJumpThreadingPass());
319
320 // Delete basic blocks, which optimization passes may have killed.
321 PM.add(createCFGSimplificationPass());
322
323 // Now that we have optimized the program, discard unreachable functions.
324 PM.add(createGlobalDCEPass());
325 }
326 };
327
328
329 } // end namespace llvm
330 #endif
0 // llvm/Transforms/IPO/PassManagerBuilder.h - Build Standard Pass -*- C++ -*-=//
1 //
2 // The LLVM Compiler Infrastructure
3 //
4 // This file is distributed under the University of Illinois Open Source
5 // License. See LICENSE.TXT for details.
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file defines the PassManagerBuilder class, which is used to set up a
10 // "standard" optimization sequence suitable for languages like C and C++.
11 //
12 // These are implemented as inline functions so that we do not have to worry
13 // about link issues.
14 //
15 //===----------------------------------------------------------------------===//
16
17 #ifndef LLVM_SUPPORT_PASSMANAGERBUILDER_H
18 #define LLVM_SUPPORT_PASSMANAGERBUILDER_H
19
20 #include "llvm/PassManager.h"
21 #include "llvm/DefaultPasses.h"
22 #include "llvm/Analysis/Passes.h"
23 #include "llvm/Analysis/Verifier.h"
24 #include "llvm/Target/TargetLibraryInfo.h"
25 #include "llvm/Transforms/Scalar.h"
26 #include "llvm/Transforms/IPO.h"
27
28 namespace llvm {
29
30 /// PassManagerBuilder - This class is used to set up a standard optimization
31 /// sequence for languages like C and C++, allowing some APIs to customize the
32 /// pass sequence in various ways. A simple example of using it would be:
33 ///
34 /// PassManagerBuilder Builder;
35 /// Builder.OptLevel = 2;
36 /// Builder.populateFunctionPassManager(FPM);
37 /// Builder.populateModulePassManager(MPM);
38 ///
39 /// In addition to setting up the basic passes, PassManagerBuilder allows
40 /// frontends to vend a plugin API, where plugins are allowed to add extensions
41 /// to the default pass manager. They do this by specifying where in the pass
42 /// pipeline they want to be added, along with a callback function that adds
43 /// the pass(es). For example, a plugin that wanted to add a loop optimization
44 /// could do something like this:
45 ///
46 /// static void addMyLoopPass(const PMBuilder &Builder, PassManagerBase &PM) {
47 /// if (Builder.getOptLevel() > 2 && Builder.getOptSizeLevel() == 0)
48 /// PM.add(createMyAwesomePass());
49 /// }
50 /// ...
51 /// Builder.addExtension(PassManagerBuilder::EP_LoopOptimizerEnd,
52 /// addMyLoopPass);
53 /// ...
54 class PassManagerBuilder {
55 public:
56
57 /// Extensions are passed the builder itself (so they can see how it is
58 /// configured) as well as the pass manager to add stuff to.
59 typedef void (*ExtensionFn)(const PassManagerBuilder &Builder,
60 PassManagerBase &PM);
61 enum ExtensionPointTy {
62 /// EP_EarlyAsPossible - This extension point allows adding passes before
63 /// any other transformations, allowing them to see the code as it is coming
64 /// out of the frontend.
65 EP_EarlyAsPossible,
66
67 /// EP_LoopOptimizerEnd - This extension point allows adding loop passes to
68 /// the end of the loop optimizer.
69 EP_LoopOptimizerEnd,
70
71 /// EP_ScalarOptimizerLate - This extension point allows adding optimization
72 /// passes after most of the main optimizations, but before the last
73 /// cleanup-ish optimizations.
74 EP_ScalarOptimizerLate
75 };
76
77 /// The Optimization Level - Specify the basic optimization level.
78 /// 0 = -O0, 1 = -O1, 2 = -O2, 3 = -O3
79 unsigned OptLevel;
80
81 /// SizeLevel - How much we're optimizing for size.
82 /// 0 = none, 1 = -Os, 2 = -Oz
83 unsigned SizeLevel;
84
85 /// LibraryInfo - Specifies information about the runtime library for the
86 /// optimizer. If this is non-null, it is added to both the function and
87 /// per-module pass pipeline.
88 TargetLibraryInfo *LibraryInfo;
89
90 /// Inliner - Specifies the inliner to use. If this is non-null, it is
91 /// added to the per-module passes.
92 Pass *Inliner;
93
94 bool DisableSimplifyLibCalls;
95 bool DisableUnitAtATime;
96 bool DisableUnrollLoops;
97
98 private:
99 /// ExtensionList - This is list of all of the extensions that are registered.
100 std::vector > Extensions;
101
102 public:
103 PassManagerBuilder() {
104 OptLevel = 2;
105 SizeLevel = 0;
106 LibraryInfo = 0;
107 Inliner = 0;
108 DisableSimplifyLibCalls = false;
109 DisableUnitAtATime = false;
110 DisableUnrollLoops = false;
111 }
112
113 ~PassManagerBuilder() {
114 delete LibraryInfo;
115 delete Inliner;
116 }
117
118 void addExtension(ExtensionPointTy Ty, ExtensionFn Fn) {
119 Extensions.push_back(std::make_pair(Ty, Fn));
120 }
121
122 private:
123 void addExtensionsToPM(ExtensionPointTy ETy, PassManagerBase &PM) const {
124 for (unsigned i = 0, e = Extensions.size(); i != e; ++i)
125 if (Extensions[i].first == ETy)
126 Extensions[i].second(*this, PM);
127 }
128
129 void addInitialAliasAnalysisPasses(PassManagerBase &PM) const {
130 // Add TypeBasedAliasAnalysis before BasicAliasAnalysis so that
131 // BasicAliasAnalysis wins if they disagree. This is intended to help
132 // support "obvious" type-punning idioms.
133 PM.add(createTypeBasedAliasAnalysisPass());
134 PM.add(createBasicAliasAnalysisPass());
135 }
136 public:
137
138 /// populateFunctionPassManager - This fills in the function pass manager,
139 /// which is expected to be run on each function immediately as it is
140 /// generated. The idea is to reduce the size of the IR in memory.
141 void populateFunctionPassManager(FunctionPassManager &FPM) {
142 addExtensionsToPM(EP_EarlyAsPossible, FPM);
143
144 // Add LibraryInfo if we have some.
145 if (LibraryInfo) FPM.add(new TargetLibraryInfo(*LibraryInfo));
146
147 if (OptLevel == 0) return;
148
149 addInitialAliasAnalysisPasses(FPM);
150
151 FPM.add(createCFGSimplificationPass());
152 FPM.add(createScalarReplAggregatesPass());
153 FPM.add(createEarlyCSEPass());
154 FPM.add(createLowerExpectIntrinsicPass());
155 }
156
157 /// populateModulePassManager - This sets up the primary pass manager.
158 void populateModulePassManager(PassManagerBase &MPM) {
159 // If all optimizations are disabled, just run the always-inline pass.
160 if (OptLevel == 0) {
161 if (Inliner) {
162 MPM.add(Inliner);
163 Inliner = 0;
164 }
165 return;
166 }
167
168 // Add LibraryInfo if we have some.
169 if (LibraryInfo) MPM.add(new TargetLibraryInfo(*LibraryInfo));
170
171 addInitialAliasAnalysisPasses(MPM);
172
173 if (!DisableUnitAtATime) {
174 MPM.add(createGlobalOptimizerPass()); // Optimize out global vars
175
176 MPM.add(createIPSCCPPass()); // IP SCCP
177 MPM.add(createDeadArgEliminationPass()); // Dead argument elimination
178
179 MPM.add(createInstructionCombiningPass());// Clean up after IPCP & DAE
180 MPM.add(createCFGSimplificationPass()); // Clean up after IPCP & DAE
181 }
182
183 // Start of CallGraph SCC passes.
184 if (!DisableUnitAtATime)
185 MPM.add(createPruneEHPass()); // Remove dead EH info
186 if (Inliner) {
187 MPM.add(Inliner);
188 Inliner = 0;
189 }
190 if (!DisableUnitAtATime)
191 MPM.add(createFunctionAttrsPass()); // Set readonly/readnone attrs
192 if (OptLevel > 2)
193 MPM.add(createArgumentPromotionPass()); // Scalarize uninlined fn args
194
195 // Start of function pass.
196 // Break up aggregate allocas, using SSAUpdater.
197 MPM.add(createScalarReplAggregatesPass(-1, false));
198 MPM.add(createEarlyCSEPass()); // Catch trivial redundancies
199 if (!DisableSimplifyLibCalls)
200 MPM.add(createSimplifyLibCallsPass()); // Library Call Optimizations
201 MPM.add(createJumpThreadingPass()); // Thread jumps.
202 MPM.add(createCorrelatedValuePropagationPass()); // Propagate conditionals
203 MPM.add(createCFGSimplificationPass()); // Merge & remove BBs
204 MPM.add(createInstructionCombiningPass()); // Combine silly seq's
205
206 MPM.add(createTailCallEliminationPass()); // Eliminate tail calls
207 MPM.add(createCFGSimplificationPass()); // Merge & remove BBs
208 MPM.add(createReassociatePass()); // Reassociate expressions
209 MPM.add(createLoopRotatePass()); // Rotate Loop
210 MPM.add(createLICMPass()); // Hoist loop invariants
211 MPM.add(createLoopUnswitchPass(SizeLevel || OptLevel < 3));
212 MPM.add(createInstructionCombiningPass());
213 MPM.add(createIndVarSimplifyPass()); // Canonicalize indvars
214 MPM.add(createLoopIdiomPass()); // Recognize idioms like memset.
215 MPM.add(createLoopDeletionPass()); // Delete dead loops
216 if (!DisableUnrollLoops)
217 MPM.add(createLoopUnrollPass()); // Unroll small loops
218 addExtensionsToPM(EP_LoopOptimizerEnd, MPM);
219
220 if (OptLevel > 1)
221 MPM.add(createGVNPass()); // Remove redundancies
222 MPM.add(createMemCpyOptPass()); // Remove memcpy / form memset
223 MPM.add(createSCCPPass()); // Constant prop with SCCP
224
225 // Run instcombine after redundancy elimination to exploit opportunities
226 // opened up by them.
227 MPM.add(createInstructionCombiningPass());
228 MPM.add(createJumpThreadingPass()); // Thread jumps
229 MPM.add(createCorrelatedValuePropagationPass());
230 MPM.add(createDeadStoreEliminationPass()); // Delete dead stores
231
232 addExtensionsToPM(EP_ScalarOptimizerLate, MPM);
233
234 MPM.add(createAggressiveDCEPass()); // Delete dead instructions
235 MPM.add(createCFGSimplificationPass()); // Merge & remove BBs
236 MPM.add(createInstructionCombiningPass()); // Clean up after everything.
237
238 if (!DisableUnitAtATime) {
239 // FIXME: We shouldn't bother with this anymore.
240 MPM.add(createStripDeadPrototypesPass()); // Get rid of dead prototypes
241
242 // GlobalOpt already deletes dead functions and globals, at -O3 try a
243 // late pass of GlobalDCE. It is capable of deleting dead cycles.
244 if (OptLevel > 2)
245 MPM.add(createGlobalDCEPass()); // Remove dead fns and globals.
246
247 if (OptLevel > 1)
248 MPM.add(createConstantMergePass()); // Merge dup global constants
249 }
250 }
251
252 void populateLTOPassManager(PassManagerBase &PM, bool Internalize,
253 bool RunInliner) {
254 // Provide AliasAnalysis services for optimizations.
255 addInitialAliasAnalysisPasses(PM);
256
257 // Now that composite has been compiled, scan through the module, looking
258 // for a main function. If main is defined, mark all other functions
259 // internal.
260 if (Internalize)
261 PM.add(createInternalizePass(true));
262
263 // Propagate constants at call sites into the functions they call. This
264 // opens opportunities for globalopt (and inlining) by substituting function
265 // pointers passed as arguments to direct uses of functions.
266 PM.add(createIPSCCPPass());
267
268 // Now that we internalized some globals, see if we can hack on them!
269 PM.add(createGlobalOptimizerPass());
270
271 // Linking modules together can lead to duplicated global constants, only
272 // keep one copy of each constant.
273 PM.add(createConstantMergePass());
274
275 // Remove unused arguments from functions.
276 PM.add(createDeadArgEliminationPass());
277
278 // Reduce the code after globalopt and ipsccp. Both can open up significant
279 // simplification opportunities, and both can propagate functions through
280 // function pointers. When this happens, we often have to resolve varargs
281 // calls, etc, so let instcombine do this.
282 PM.add(createInstructionCombiningPass());
283
284 // Inline small functions
285 if (RunInliner)
286 PM.add(createFunctionInliningPass());
287
288 PM.add(createPruneEHPass()); // Remove dead EH info.
289
290 // Optimize globals again if we ran the inliner.
291 if (RunInliner)
292 PM.add(createGlobalOptimizerPass());
293 PM.add(createGlobalDCEPass()); // Remove dead functions.
294
295 // If we didn't decide to inline a function, check to see if we can
296 // transform it to pass arguments by value instead of by reference.
297 PM.add(createArgumentPromotionPass());
298
299 // The IPO passes may leave cruft around. Clean up after them.
300 PM.add(createInstructionCombiningPass());
301 PM.add(createJumpThreadingPass());
302 // Break up allocas
303 PM.add(createScalarReplAggregatesPass());
304
305 // Run a few AA driven optimizations here and now, to cleanup the code.
306 PM.add(createFunctionAttrsPass()); // Add nocapture.
307 PM.add(createGlobalsModRefPass()); // IP alias analysis.
308
309 PM.add(createLICMPass()); // Hoist loop invariants.
310 PM.add(createGVNPass()); // Remove redundancies.
311 PM.add(createMemCpyOptPass()); // Remove dead memcpys.
312 // Nuke dead stores.
313 PM.add(createDeadStoreEliminationPass());
314
315 // Cleanup and simplify the code after the scalar optimizations.
316 PM.add(createInstructionCombiningPass());
317
318 PM.add(createJumpThreadingPass());
319
320 // Delete basic blocks, which optimization passes may have killed.
321 PM.add(createCFGSimplificationPass());
322
323 // Now that we have optimized the program, discard unreachable functions.
324 PM.add(createGlobalDCEPass());
325 }
326 };
327
328
329 } // end namespace llvm
330 #endif
2121 #include "llvm/Support/ManagedStatic.h"
2222 #include "llvm/Support/PluginLoader.h"
2323 #include "llvm/Support/PrettyStackTrace.h"
24 #include "llvm/Support/PassManagerBuilder.h"
2524 #include "llvm/Support/Process.h"
2625 #include "llvm/Support/Signals.h"
2726 #include "llvm/Support/Valgrind.h"
2827 #include "llvm/LinkAllVMCore.h"
28 #include "llvm/Transforms/IPO/PassManagerBuilder.h"
2929
3030 //Enable this macro to debug bugpoint itself.
3131 //#define DEBUG_BUGPOINT 1
1212
1313 #include "llvm/Module.h"
1414 #include "llvm/Support/CommandLine.h"
15 #include "llvm/Support/PassManagerBuilder.h"
1615 #include "llvm/Support/raw_ostream.h"
1716 #include "llvm/Support/DynamicLibrary.h"
1817 #include "llvm/Target/TargetData.h"
1918 #include "llvm/Target/TargetMachine.h"
2019 #include "llvm/Support/PassNameParser.h"
2120 #include "llvm/Support/PluginLoader.h"
21 #include "llvm/Transforms/IPO/PassManagerBuilder.h"
2222 using namespace llvm;
2323
2424 // Pass Name Options as generated by the PassNameParser
3636 #include "llvm/Support/CommandLine.h"
3737 #include "llvm/Support/FormattedStream.h"
3838 #include "llvm/Support/MemoryBuffer.h"
39 #include "llvm/Support/PassManagerBuilder.h"
4039 #include "llvm/Support/SystemUtils.h"
4140 #include "llvm/Support/ToolOutputFile.h"
4241 #include "llvm/Support/Host.h"
4443 #include "llvm/Support/Signals.h"
4544 #include "llvm/Support/system_error.h"
4645 #include "llvm/Config/config.h"
46 #include "llvm/Transforms/IPO/PassManagerBuilder.h"
4747 #include
4848 #include
4949 #include
3434 #include "llvm/Support/ManagedStatic.h"
3535 #include "llvm/Support/PluginLoader.h"
3636 #include "llvm/Support/PrettyStackTrace.h"
37 #include "llvm/Support/PassManagerBuilder.h"
3837 #include "llvm/Support/SystemUtils.h"
3938 #include "llvm/Support/ToolOutputFile.h"
4039 #include "llvm/LinkAllPasses.h"
4140 #include "llvm/LinkAllVMCore.h"
41 #include "llvm/Transforms/IPO/PassManagerBuilder.h"
4242 #include
4343 #include
4444 using namespace llvm;