1 //===- PassManagerBuilder.cpp - Build Standard Pass -----------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
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 //===----------------------------------------------------------------------===//
13
14 #include "llvm/Transforms/IPO/PassManagerBuilder.h"
15 #include "llvm-c/Transforms/PassManagerBuilder.h"
16 #include "llvm/ADT/STLExtras.h"
17 #include "llvm/ADT/SmallVector.h"
18 #include "llvm/Analysis/GlobalsModRef.h"
19 #include "llvm/Analysis/ScopedNoAliasAA.h"
20 #include "llvm/Analysis/TargetLibraryInfo.h"
21 #include "llvm/Analysis/TypeBasedAliasAnalysis.h"
22 #include "llvm/IR/LegacyPassManager.h"
23 #include "llvm/Support/CommandLine.h"
24 #include "llvm/Support/ManagedStatic.h"
25 #include "llvm/Target/CGPassBuilderOption.h"
26 #include "llvm/Transforms/AggressiveInstCombine/AggressiveInstCombine.h"
27 #include "llvm/Transforms/IPO.h"
28 #include "llvm/Transforms/IPO/Attributor.h"
29 #include "llvm/Transforms/IPO/ForceFunctionAttrs.h"
30 #include "llvm/Transforms/IPO/FunctionAttrs.h"
31 #include "llvm/Transforms/IPO/InferFunctionAttrs.h"
32 #include "llvm/Transforms/InstCombine/InstCombine.h"
33 #include "llvm/Transforms/Instrumentation.h"
34 #include "llvm/Transforms/Scalar.h"
35 #include "llvm/Transforms/Scalar/GVN.h"
36 #include "llvm/Transforms/Scalar/LICM.h"
37 #include "llvm/Transforms/Scalar/LoopUnrollPass.h"
38 #include "llvm/Transforms/Scalar/SimpleLoopUnswitch.h"
39 #include "llvm/Transforms/Utils.h"
40 #include "llvm/Transforms/Vectorize.h"
41
42 using namespace llvm;
43
PassManagerBuilder()44 PassManagerBuilder::PassManagerBuilder() {
45 OptLevel = 2;
46 SizeLevel = 0;
47 LibraryInfo = nullptr;
48 Inliner = nullptr;
49 DisableUnrollLoops = false;
50 SLPVectorize = false;
51 LoopVectorize = true;
52 LoopsInterleaved = true;
53 LicmMssaOptCap = SetLicmMssaOptCap;
54 LicmMssaNoAccForPromotionCap = SetLicmMssaNoAccForPromotionCap;
55 DisableGVNLoadPRE = false;
56 ForgetAllSCEVInLoopUnroll = ForgetSCEVInLoopUnroll;
57 VerifyInput = false;
58 VerifyOutput = false;
59 MergeFunctions = false;
60 DivergentTarget = false;
61 CallGraphProfile = true;
62 }
63
~PassManagerBuilder()64 PassManagerBuilder::~PassManagerBuilder() {
65 delete LibraryInfo;
66 delete Inliner;
67 }
68
addInitialAliasAnalysisPasses(legacy::PassManagerBase & PM) const69 void PassManagerBuilder::addInitialAliasAnalysisPasses(
70 legacy::PassManagerBase &PM) const {
71 // Add TypeBasedAliasAnalysis before BasicAliasAnalysis so that
72 // BasicAliasAnalysis wins if they disagree. This is intended to help
73 // support "obvious" type-punning idioms.
74 PM.add(createTypeBasedAAWrapperPass());
75 PM.add(createScopedNoAliasAAWrapperPass());
76 }
77
populateFunctionPassManager(legacy::FunctionPassManager & FPM)78 void PassManagerBuilder::populateFunctionPassManager(
79 legacy::FunctionPassManager &FPM) {
80 // Add LibraryInfo if we have some.
81 if (LibraryInfo)
82 FPM.add(new TargetLibraryInfoWrapperPass(*LibraryInfo));
83
84 if (OptLevel == 0) return;
85
86 addInitialAliasAnalysisPasses(FPM);
87
88 // Lower llvm.expect to metadata before attempting transforms.
89 // Compare/branch metadata may alter the behavior of passes like SimplifyCFG.
90 FPM.add(createLowerExpectIntrinsicPass());
91 FPM.add(createCFGSimplificationPass());
92 FPM.add(createSROAPass());
93 FPM.add(createEarlyCSEPass());
94 }
95
addFunctionSimplificationPasses(legacy::PassManagerBase & MPM)96 void PassManagerBuilder::addFunctionSimplificationPasses(
97 legacy::PassManagerBase &MPM) {
98 // Start of function pass.
99 // Break up aggregate allocas, using SSAUpdater.
100 assert(OptLevel >= 1 && "Calling function optimizer with no optimization level!");
101 MPM.add(createSROAPass());
102 MPM.add(createEarlyCSEPass(true /* Enable mem-ssa. */)); // Catch trivial redundancies
103
104 if (OptLevel > 1) {
105 // Speculative execution if the target has divergent branches; otherwise nop.
106 MPM.add(createSpeculativeExecutionIfHasBranchDivergencePass());
107
108 MPM.add(createJumpThreadingPass()); // Thread jumps.
109 MPM.add(createCorrelatedValuePropagationPass()); // Propagate conditionals
110 }
111 MPM.add(
112 createCFGSimplificationPass(SimplifyCFGOptions().convertSwitchRangeToICmp(
113 true))); // Merge & remove BBs
114 // Combine silly seq's
115 MPM.add(createInstructionCombiningPass());
116 if (SizeLevel == 0)
117 MPM.add(createLibCallsShrinkWrapPass());
118
119 // TODO: Investigate the cost/benefit of tail call elimination on debugging.
120 if (OptLevel > 1)
121 MPM.add(createTailCallEliminationPass()); // Eliminate tail calls
122 MPM.add(
123 createCFGSimplificationPass(SimplifyCFGOptions().convertSwitchRangeToICmp(
124 true))); // Merge & remove BBs
125 MPM.add(createReassociatePass()); // Reassociate expressions
126
127 // Begin the loop pass pipeline.
128
129 // The simple loop unswitch pass relies on separate cleanup passes. Schedule
130 // them first so when we re-process a loop they run before other loop
131 // passes.
132 MPM.add(createLoopInstSimplifyPass());
133 MPM.add(createLoopSimplifyCFGPass());
134
135 // Try to remove as much code from the loop header as possible,
136 // to reduce amount of IR that will have to be duplicated. However,
137 // do not perform speculative hoisting the first time as LICM
138 // will destroy metadata that may not need to be destroyed if run
139 // after loop rotation.
140 // TODO: Investigate promotion cap for O1.
141 MPM.add(createLICMPass(LicmMssaOptCap, LicmMssaNoAccForPromotionCap,
142 /*AllowSpeculation=*/false));
143 // Rotate Loop - disable header duplication at -Oz
144 MPM.add(createLoopRotatePass(SizeLevel == 2 ? 0 : -1, false));
145 // TODO: Investigate promotion cap for O1.
146 MPM.add(createLICMPass(LicmMssaOptCap, LicmMssaNoAccForPromotionCap,
147 /*AllowSpeculation=*/true));
148 MPM.add(createSimpleLoopUnswitchLegacyPass(OptLevel == 3));
149 // FIXME: We break the loop pass pipeline here in order to do full
150 // simplifycfg. Eventually loop-simplifycfg should be enhanced to replace the
151 // need for this.
152 MPM.add(createCFGSimplificationPass(
153 SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
154 MPM.add(createInstructionCombiningPass());
155 // We resume loop passes creating a second loop pipeline here.
156 MPM.add(createLoopIdiomPass()); // Recognize idioms like memset.
157 MPM.add(createIndVarSimplifyPass()); // Canonicalize indvars
158 MPM.add(createLoopDeletionPass()); // Delete dead loops
159
160 // Unroll small loops and perform peeling.
161 MPM.add(createSimpleLoopUnrollPass(OptLevel, DisableUnrollLoops,
162 ForgetAllSCEVInLoopUnroll));
163 // This ends the loop pass pipelines.
164
165 // Break up allocas that may now be splittable after loop unrolling.
166 MPM.add(createSROAPass());
167
168 if (OptLevel > 1) {
169 MPM.add(createMergedLoadStoreMotionPass()); // Merge ld/st in diamonds
170 MPM.add(createGVNPass(DisableGVNLoadPRE)); // Remove redundancies
171 }
172 MPM.add(createSCCPPass()); // Constant prop with SCCP
173
174 // Delete dead bit computations (instcombine runs after to fold away the dead
175 // computations, and then ADCE will run later to exploit any new DCE
176 // opportunities that creates).
177 MPM.add(createBitTrackingDCEPass()); // Delete dead bit computations
178
179 // Run instcombine after redundancy elimination to exploit opportunities
180 // opened up by them.
181 MPM.add(createInstructionCombiningPass());
182 if (OptLevel > 1) {
183 MPM.add(createJumpThreadingPass()); // Thread jumps
184 MPM.add(createCorrelatedValuePropagationPass());
185 }
186 MPM.add(createAggressiveDCEPass()); // Delete dead instructions
187
188 MPM.add(createMemCpyOptPass()); // Remove memcpy / form memset
189 // TODO: Investigate if this is too expensive at O1.
190 if (OptLevel > 1) {
191 MPM.add(createDeadStoreEliminationPass()); // Delete dead stores
192 MPM.add(createLICMPass(LicmMssaOptCap, LicmMssaNoAccForPromotionCap,
193 /*AllowSpeculation=*/true));
194 }
195
196 // Merge & remove BBs and sink & hoist common instructions.
197 MPM.add(createCFGSimplificationPass(
198 SimplifyCFGOptions().hoistCommonInsts(true).sinkCommonInsts(true)));
199 // Clean up after everything.
200 MPM.add(createInstructionCombiningPass());
201 }
202
203 /// FIXME: Should LTO cause any differences to this set of passes?
addVectorPasses(legacy::PassManagerBase & PM,bool IsFullLTO)204 void PassManagerBuilder::addVectorPasses(legacy::PassManagerBase &PM,
205 bool IsFullLTO) {
206 PM.add(createLoopVectorizePass(!LoopsInterleaved, !LoopVectorize));
207
208 if (IsFullLTO) {
209 // The vectorizer may have significantly shortened a loop body; unroll
210 // again. Unroll small loops to hide loop backedge latency and saturate any
211 // parallel execution resources of an out-of-order processor. We also then
212 // need to clean up redundancies and loop invariant code.
213 // FIXME: It would be really good to use a loop-integrated instruction
214 // combiner for cleanup here so that the unrolling and LICM can be pipelined
215 // across the loop nests.
216 PM.add(createLoopUnrollPass(OptLevel, DisableUnrollLoops,
217 ForgetAllSCEVInLoopUnroll));
218 PM.add(createWarnMissedTransformationsPass());
219 }
220
221 if (!IsFullLTO) {
222 // Eliminate loads by forwarding stores from the previous iteration to loads
223 // of the current iteration.
224 PM.add(createLoopLoadEliminationPass());
225 }
226 // Cleanup after the loop optimization passes.
227 PM.add(createInstructionCombiningPass());
228
229 // Now that we've formed fast to execute loop structures, we do further
230 // optimizations. These are run afterward as they might block doing complex
231 // analyses and transforms such as what are needed for loop vectorization.
232
233 // Cleanup after loop vectorization, etc. Simplification passes like CVP and
234 // GVN, loop transforms, and others have already run, so it's now better to
235 // convert to more optimized IR using more aggressive simplify CFG options.
236 // The extra sinking transform can create larger basic blocks, so do this
237 // before SLP vectorization.
238 PM.add(createCFGSimplificationPass(SimplifyCFGOptions()
239 .forwardSwitchCondToPhi(true)
240 .convertSwitchRangeToICmp(true)
241 .convertSwitchToLookupTable(true)
242 .needCanonicalLoops(false)
243 .hoistCommonInsts(true)
244 .sinkCommonInsts(true)));
245
246 if (IsFullLTO) {
247 PM.add(createSCCPPass()); // Propagate exposed constants
248 PM.add(createInstructionCombiningPass()); // Clean up again
249 PM.add(createBitTrackingDCEPass());
250 }
251
252 // Optimize parallel scalar instruction chains into SIMD instructions.
253 if (SLPVectorize) {
254 PM.add(createSLPVectorizerPass());
255 }
256
257 // Enhance/cleanup vector code.
258 PM.add(createVectorCombinePass());
259
260 if (!IsFullLTO) {
261 PM.add(createInstructionCombiningPass());
262
263 // Unroll small loops
264 PM.add(createLoopUnrollPass(OptLevel, DisableUnrollLoops,
265 ForgetAllSCEVInLoopUnroll));
266
267 if (!DisableUnrollLoops) {
268 // LoopUnroll may generate some redundency to cleanup.
269 PM.add(createInstructionCombiningPass());
270
271 // Runtime unrolling will introduce runtime check in loop prologue. If the
272 // unrolled loop is a inner loop, then the prologue will be inside the
273 // outer loop. LICM pass can help to promote the runtime check out if the
274 // checked value is loop invariant.
275 PM.add(createLICMPass(LicmMssaOptCap, LicmMssaNoAccForPromotionCap,
276 /*AllowSpeculation=*/true));
277 }
278
279 PM.add(createWarnMissedTransformationsPass());
280 }
281
282 // After vectorization and unrolling, assume intrinsics may tell us more
283 // about pointer alignments.
284 PM.add(createAlignmentFromAssumptionsPass());
285
286 if (IsFullLTO)
287 PM.add(createInstructionCombiningPass());
288 }
289
populateModulePassManager(legacy::PassManagerBase & MPM)290 void PassManagerBuilder::populateModulePassManager(
291 legacy::PassManagerBase &MPM) {
292 MPM.add(createAnnotation2MetadataLegacyPass());
293
294 // Allow forcing function attributes as a debugging and tuning aid.
295 MPM.add(createForceFunctionAttrsLegacyPass());
296
297 // If all optimizations are disabled, just run the always-inline pass and,
298 // if enabled, the function merging pass.
299 if (OptLevel == 0) {
300 if (Inliner) {
301 MPM.add(Inliner);
302 Inliner = nullptr;
303 }
304
305 // FIXME: The BarrierNoopPass is a HACK! The inliner pass above implicitly
306 // creates a CGSCC pass manager, but we don't want to add extensions into
307 // that pass manager. To prevent this we insert a no-op module pass to reset
308 // the pass manager to get the same behavior as EP_OptimizerLast in non-O0
309 // builds. The function merging pass is
310 if (MergeFunctions)
311 MPM.add(createMergeFunctionsPass());
312 return;
313 }
314
315 // Add LibraryInfo if we have some.
316 if (LibraryInfo)
317 MPM.add(new TargetLibraryInfoWrapperPass(*LibraryInfo));
318
319 addInitialAliasAnalysisPasses(MPM);
320
321 // Infer attributes about declarations if possible.
322 MPM.add(createInferFunctionAttrsLegacyPass());
323
324 if (OptLevel > 2)
325 MPM.add(createCallSiteSplittingPass());
326
327 MPM.add(createIPSCCPPass()); // IP SCCP
328 MPM.add(createCalledValuePropagationPass());
329
330 MPM.add(createGlobalOptimizerPass()); // Optimize out global vars
331 // Promote any localized global vars.
332 MPM.add(createPromoteMemoryToRegisterPass());
333
334 MPM.add(createDeadArgEliminationPass()); // Dead argument elimination
335
336 MPM.add(createInstructionCombiningPass()); // Clean up after IPCP & DAE
337 MPM.add(
338 createCFGSimplificationPass(SimplifyCFGOptions().convertSwitchRangeToICmp(
339 true))); // Clean up after IPCP & DAE
340
341 // We add a module alias analysis pass here. In part due to bugs in the
342 // analysis infrastructure this "works" in that the analysis stays alive
343 // for the entire SCC pass run below.
344 MPM.add(createGlobalsAAWrapperPass());
345
346 // Start of CallGraph SCC passes.
347 bool RunInliner = false;
348 if (Inliner) {
349 MPM.add(Inliner);
350 Inliner = nullptr;
351 RunInliner = true;
352 }
353
354 MPM.add(createPostOrderFunctionAttrsLegacyPass());
355
356 addFunctionSimplificationPasses(MPM);
357
358 // FIXME: This is a HACK! The inliner pass above implicitly creates a CGSCC
359 // pass manager that we are specifically trying to avoid. To prevent this
360 // we must insert a no-op module pass to reset the pass manager.
361 MPM.add(createBarrierNoopPass());
362
363 if (OptLevel > 1)
364 // Remove avail extern fns and globals definitions if we aren't
365 // compiling an object file for later LTO. For LTO we want to preserve
366 // these so they are eligible for inlining at link-time. Note if they
367 // are unreferenced they will be removed by GlobalDCE later, so
368 // this only impacts referenced available externally globals.
369 // Eventually they will be suppressed during codegen, but eliminating
370 // here enables more opportunity for GlobalDCE as it may make
371 // globals referenced by available external functions dead
372 // and saves running remaining passes on the eliminated functions.
373 MPM.add(createEliminateAvailableExternallyPass());
374
375 MPM.add(createReversePostOrderFunctionAttrsPass());
376
377 // The inliner performs some kind of dead code elimination as it goes,
378 // but there are cases that are not really caught by it. We might
379 // at some point consider teaching the inliner about them, but it
380 // is OK for now to run GlobalOpt + GlobalDCE in tandem as their
381 // benefits generally outweight the cost, making the whole pipeline
382 // faster.
383 if (RunInliner) {
384 MPM.add(createGlobalOptimizerPass());
385 MPM.add(createGlobalDCEPass());
386 }
387
388 // We add a fresh GlobalsModRef run at this point. This is particularly
389 // useful as the above will have inlined, DCE'ed, and function-attr
390 // propagated everything. We should at this point have a reasonably minimal
391 // and richly annotated call graph. By computing aliasing and mod/ref
392 // information for all local globals here, the late loop passes and notably
393 // the vectorizer will be able to use them to help recognize vectorizable
394 // memory operations.
395 //
396 // Note that this relies on a bug in the pass manager which preserves
397 // a module analysis into a function pass pipeline (and throughout it) so
398 // long as the first function pass doesn't invalidate the module analysis.
399 // Thus both Float2Int and LoopRotate have to preserve AliasAnalysis for
400 // this to work. Fortunately, it is trivial to preserve AliasAnalysis
401 // (doing nothing preserves it as it is required to be conservatively
402 // correct in the face of IR changes).
403 MPM.add(createGlobalsAAWrapperPass());
404
405 MPM.add(createFloat2IntPass());
406 MPM.add(createLowerConstantIntrinsicsPass());
407
408 // Re-rotate loops in all our loop nests. These may have fallout out of
409 // rotated form due to GVN or other transformations, and the vectorizer relies
410 // on the rotated form. Disable header duplication at -Oz.
411 MPM.add(createLoopRotatePass(SizeLevel == 2 ? 0 : -1, false));
412
413 // Distribute loops to allow partial vectorization. I.e. isolate dependences
414 // into separate loop that would otherwise inhibit vectorization. This is
415 // currently only performed for loops marked with the metadata
416 // llvm.loop.distribute=true or when -enable-loop-distribute is specified.
417 MPM.add(createLoopDistributePass());
418
419 addVectorPasses(MPM, /* IsFullLTO */ false);
420
421 // FIXME: We shouldn't bother with this anymore.
422 MPM.add(createStripDeadPrototypesPass()); // Get rid of dead prototypes
423
424 // GlobalOpt already deletes dead functions and globals, at -O2 try a
425 // late pass of GlobalDCE. It is capable of deleting dead cycles.
426 if (OptLevel > 1) {
427 MPM.add(createGlobalDCEPass()); // Remove dead fns and globals.
428 MPM.add(createConstantMergePass()); // Merge dup global constants
429 }
430
431 if (MergeFunctions)
432 MPM.add(createMergeFunctionsPass());
433
434 // LoopSink pass sinks instructions hoisted by LICM, which serves as a
435 // canonicalization pass that enables other optimizations. As a result,
436 // LoopSink pass needs to be a very late IR pass to avoid undoing LICM
437 // result too early.
438 MPM.add(createLoopSinkPass());
439 // Get rid of LCSSA nodes.
440 MPM.add(createInstSimplifyLegacyPass());
441
442 // This hoists/decomposes div/rem ops. It should run after other sink/hoist
443 // passes to avoid re-sinking, but before SimplifyCFG because it can allow
444 // flattening of blocks.
445 MPM.add(createDivRemPairsPass());
446
447 // LoopSink (and other loop passes since the last simplifyCFG) might have
448 // resulted in single-entry-single-exit or empty blocks. Clean up the CFG.
449 MPM.add(createCFGSimplificationPass(
450 SimplifyCFGOptions().convertSwitchRangeToICmp(true)));
451 }
452
LLVMPassManagerBuilderCreate()453 LLVMPassManagerBuilderRef LLVMPassManagerBuilderCreate() {
454 PassManagerBuilder *PMB = new PassManagerBuilder();
455 return wrap(PMB);
456 }
457
LLVMPassManagerBuilderDispose(LLVMPassManagerBuilderRef PMB)458 void LLVMPassManagerBuilderDispose(LLVMPassManagerBuilderRef PMB) {
459 PassManagerBuilder *Builder = unwrap(PMB);
460 delete Builder;
461 }
462
463 void
LLVMPassManagerBuilderSetOptLevel(LLVMPassManagerBuilderRef PMB,unsigned OptLevel)464 LLVMPassManagerBuilderSetOptLevel(LLVMPassManagerBuilderRef PMB,
465 unsigned OptLevel) {
466 PassManagerBuilder *Builder = unwrap(PMB);
467 Builder->OptLevel = OptLevel;
468 }
469
470 void
LLVMPassManagerBuilderSetSizeLevel(LLVMPassManagerBuilderRef PMB,unsigned SizeLevel)471 LLVMPassManagerBuilderSetSizeLevel(LLVMPassManagerBuilderRef PMB,
472 unsigned SizeLevel) {
473 PassManagerBuilder *Builder = unwrap(PMB);
474 Builder->SizeLevel = SizeLevel;
475 }
476
477 void
LLVMPassManagerBuilderSetDisableUnitAtATime(LLVMPassManagerBuilderRef PMB,LLVMBool Value)478 LLVMPassManagerBuilderSetDisableUnitAtATime(LLVMPassManagerBuilderRef PMB,
479 LLVMBool Value) {
480 // NOTE: The DisableUnitAtATime switch has been removed.
481 }
482
483 void
LLVMPassManagerBuilderSetDisableUnrollLoops(LLVMPassManagerBuilderRef PMB,LLVMBool Value)484 LLVMPassManagerBuilderSetDisableUnrollLoops(LLVMPassManagerBuilderRef PMB,
485 LLVMBool Value) {
486 PassManagerBuilder *Builder = unwrap(PMB);
487 Builder->DisableUnrollLoops = Value;
488 }
489
490 void
LLVMPassManagerBuilderSetDisableSimplifyLibCalls(LLVMPassManagerBuilderRef PMB,LLVMBool Value)491 LLVMPassManagerBuilderSetDisableSimplifyLibCalls(LLVMPassManagerBuilderRef PMB,
492 LLVMBool Value) {
493 // NOTE: The simplify-libcalls pass has been removed.
494 }
495
496 void
LLVMPassManagerBuilderUseInlinerWithThreshold(LLVMPassManagerBuilderRef PMB,unsigned Threshold)497 LLVMPassManagerBuilderUseInlinerWithThreshold(LLVMPassManagerBuilderRef PMB,
498 unsigned Threshold) {
499 PassManagerBuilder *Builder = unwrap(PMB);
500 Builder->Inliner = createFunctionInliningPass(Threshold);
501 }
502
503 void
LLVMPassManagerBuilderPopulateFunctionPassManager(LLVMPassManagerBuilderRef PMB,LLVMPassManagerRef PM)504 LLVMPassManagerBuilderPopulateFunctionPassManager(LLVMPassManagerBuilderRef PMB,
505 LLVMPassManagerRef PM) {
506 PassManagerBuilder *Builder = unwrap(PMB);
507 legacy::FunctionPassManager *FPM = unwrap<legacy::FunctionPassManager>(PM);
508 Builder->populateFunctionPassManager(*FPM);
509 }
510
511 void
LLVMPassManagerBuilderPopulateModulePassManager(LLVMPassManagerBuilderRef PMB,LLVMPassManagerRef PM)512 LLVMPassManagerBuilderPopulateModulePassManager(LLVMPassManagerBuilderRef PMB,
513 LLVMPassManagerRef PM) {
514 PassManagerBuilder *Builder = unwrap(PMB);
515 legacy::PassManagerBase *MPM = unwrap(PM);
516 Builder->populateModulePassManager(*MPM);
517 }
518