1c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola//===- PassManagerBuilder.cpp - Build Standard Pass -----------------------===//
2c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola//
3c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola//                     The LLVM Compiler Infrastructure
4c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola//
5c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola// This file is distributed under the University of Illinois Open Source
6c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola// License. See LICENSE.TXT for details.
7c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola//
8c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola//===----------------------------------------------------------------------===//
9c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola//
10c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola// This file defines the PassManagerBuilder class, which is used to set up a
11c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola// "standard" optimization sequence suitable for languages like C and C++.
12c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola//
13c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola//===----------------------------------------------------------------------===//
14c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
15c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
16c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola#include "llvm/Transforms/IPO/PassManagerBuilder.h"
1769cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola#include "llvm-c/Transforms/PassManagerBuilder.h"
18d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/SmallVector.h"
19c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola#include "llvm/Analysis/Passes.h"
2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Verifier.h"
21d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/PassManager.h"
22de5e5ec3045a73a06b1054417f9ac6c02929e9ceHal Finkel#include "llvm/Support/CommandLine.h"
23d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/ManagedStatic.h"
24c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola#include "llvm/Target/TargetLibraryInfo.h"
25d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Transforms/IPO.h"
26c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola#include "llvm/Transforms/Scalar.h"
27de5e5ec3045a73a06b1054417f9ac6c02929e9ceHal Finkel#include "llvm/Transforms/Vectorize.h"
28c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
29c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindolausing namespace llvm;
30c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
31de5e5ec3045a73a06b1054417f9ac6c02929e9ceHal Finkelstatic cl::opt<bool>
32fe16848601bdde6e3a5e0860199169dd171222a4Nadav RotemRunLoopVectorization("vectorize-loops", cl::Hidden,
339210cc3a173224b40d9fc45b202f52cc7acf5c5aNadav Rotem                     cl::desc("Run the Loop vectorization passes"));
34d233b78760e481a9602266f8376eb1189c58bc9aNadav Rotem
35d233b78760e481a9602266f8376eb1189c58bc9aNadav Rotemstatic cl::opt<bool>
36fe16848601bdde6e3a5e0860199169dd171222a4Nadav RotemRunSLPVectorization("vectorize-slp", cl::Hidden,
371129a832e6ef5291b0144e9f22c76b2599cd5587Nadav Rotem                    cl::desc("Run the SLP vectorization passes"));
381129a832e6ef5291b0144e9f22c76b2599cd5587Nadav Rotem
391129a832e6ef5291b0144e9f22c76b2599cd5587Nadav Rotemstatic cl::opt<bool>
40fe16848601bdde6e3a5e0860199169dd171222a4Nadav RotemRunBBVectorization("vectorize-slp-aggressive", cl::Hidden,
411129a832e6ef5291b0144e9f22c76b2599cd5587Nadav Rotem                    cl::desc("Run the BB vectorization passes"));
42de5e5ec3045a73a06b1054417f9ac6c02929e9ceHal Finkel
43064551e94c9763c7e74121b88f9cbccc0969946aHal Finkelstatic cl::opt<bool>
44064551e94c9763c7e74121b88f9cbccc0969946aHal FinkelUseGVNAfterVectorization("use-gvn-after-vectorization",
45064551e94c9763c7e74121b88f9cbccc0969946aHal Finkel  cl::init(false), cl::Hidden,
46064551e94c9763c7e74121b88f9cbccc0969946aHal Finkel  cl::desc("Run GVN instead of Early CSE after vectorization passes"));
47064551e94c9763c7e74121b88f9cbccc0969946aHal Finkel
48713aa9431d84805c5b7ddce57159d14ee94cd548Chandler Carruthstatic cl::opt<bool> UseNewSROA("use-new-sroa",
491fe4fae463eba5965aa1f98600161ef7de96aaf1Chandler Carruth  cl::init(true), cl::Hidden,
50713aa9431d84805c5b7ddce57159d14ee94cd548Chandler Carruth  cl::desc("Enable the new, experimental SROA pass"));
51713aa9431d84805c5b7ddce57159d14ee94cd548Chandler Carruth
52bebe48dbfe00078329341945bfb11f778ace6d12Hal Finkelstatic cl::opt<bool>
53bebe48dbfe00078329341945bfb11f778ace6d12Hal FinkelRunLoopRerolling("reroll-loops", cl::Hidden,
54bebe48dbfe00078329341945bfb11f778ace6d12Hal Finkel                 cl::desc("Run the loop rerolling pass"));
55bebe48dbfe00078329341945bfb11f778ace6d12Hal Finkel
56cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesstatic cl::opt<bool> RunLoadCombine("combine-loads", cl::init(false),
57cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                    cl::Hidden,
58cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                                    cl::desc("Run the load combining pass"));
59cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
60c684e83e4554bfaf6180426f86b9253b65dd46ecRafael EspindolaPassManagerBuilder::PassManagerBuilder() {
61c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola    OptLevel = 2;
62c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola    SizeLevel = 0;
63dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    LibraryInfo = nullptr;
64dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Inliner = nullptr;
65dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    DisableTailCalls = false;
66c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola    DisableUnitAtATime = false;
67c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola    DisableUnrollLoops = false;
681129a832e6ef5291b0144e9f22c76b2599cd5587Nadav Rotem    BBVectorize = RunBBVectorization;
698849838965941919257b923f8603ca1bacd3fa46Nadav Rotem    SLPVectorize = RunSLPVectorization;
70d233b78760e481a9602266f8376eb1189c58bc9aNadav Rotem    LoopVectorize = RunLoopVectorization;
71c8dc96be28fd1a3d6ddebbb48b8d55b61e4bd89bHal Finkel    RerollLoops = RunLoopRerolling;
72cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    LoadCombine = RunLoadCombine;
73c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola}
74c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
75c684e83e4554bfaf6180426f86b9253b65dd46ecRafael EspindolaPassManagerBuilder::~PassManagerBuilder() {
76c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  delete LibraryInfo;
77c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  delete Inliner;
78c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola}
79c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
807a817eae6cb00a2ba5ec2a4127775b839a357e4cDavid Chisnall/// Set of global extensions, automatically added as part of the standard set.
817a817eae6cb00a2ba5ec2a4127775b839a357e4cDavid Chisnallstatic ManagedStatic<SmallVector<std::pair<PassManagerBuilder::ExtensionPointTy,
827a817eae6cb00a2ba5ec2a4127775b839a357e4cDavid Chisnall   PassManagerBuilder::ExtensionFn>, 8> > GlobalExtensions;
837a817eae6cb00a2ba5ec2a4127775b839a357e4cDavid Chisnall
847a817eae6cb00a2ba5ec2a4127775b839a357e4cDavid Chisnallvoid PassManagerBuilder::addGlobalExtension(
857a817eae6cb00a2ba5ec2a4127775b839a357e4cDavid Chisnall    PassManagerBuilder::ExtensionPointTy Ty,
867a817eae6cb00a2ba5ec2a4127775b839a357e4cDavid Chisnall    PassManagerBuilder::ExtensionFn Fn) {
877a817eae6cb00a2ba5ec2a4127775b839a357e4cDavid Chisnall  GlobalExtensions->push_back(std::make_pair(Ty, Fn));
887a817eae6cb00a2ba5ec2a4127775b839a357e4cDavid Chisnall}
897a817eae6cb00a2ba5ec2a4127775b839a357e4cDavid Chisnall
90c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindolavoid PassManagerBuilder::addExtension(ExtensionPointTy Ty, ExtensionFn Fn) {
91c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  Extensions.push_back(std::make_pair(Ty, Fn));
92c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola}
93c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
94c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindolavoid PassManagerBuilder::addExtensionsToPM(ExtensionPointTy ETy,
95c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola                                           PassManagerBase &PM) const {
967a817eae6cb00a2ba5ec2a4127775b839a357e4cDavid Chisnall  for (unsigned i = 0, e = GlobalExtensions->size(); i != e; ++i)
977a817eae6cb00a2ba5ec2a4127775b839a357e4cDavid Chisnall    if ((*GlobalExtensions)[i].first == ETy)
987a817eae6cb00a2ba5ec2a4127775b839a357e4cDavid Chisnall      (*GlobalExtensions)[i].second(*this, PM);
99c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  for (unsigned i = 0, e = Extensions.size(); i != e; ++i)
100c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola    if (Extensions[i].first == ETy)
101c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola      Extensions[i].second(*this, PM);
102c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola}
103c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
104c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindolavoid
105c684e83e4554bfaf6180426f86b9253b65dd46ecRafael EspindolaPassManagerBuilder::addInitialAliasAnalysisPasses(PassManagerBase &PM) const {
106c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // Add TypeBasedAliasAnalysis before BasicAliasAnalysis so that
107c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // BasicAliasAnalysis wins if they disagree. This is intended to help
108c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // support "obvious" type-punning idioms.
109c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  PM.add(createTypeBasedAliasAnalysisPass());
110c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  PM.add(createBasicAliasAnalysisPass());
111c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola}
112c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
113c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindolavoid PassManagerBuilder::populateFunctionPassManager(FunctionPassManager &FPM) {
114c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  addExtensionsToPM(EP_EarlyAsPossible, FPM);
115c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
116c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // Add LibraryInfo if we have some.
117c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  if (LibraryInfo) FPM.add(new TargetLibraryInfo(*LibraryInfo));
118c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
119c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  if (OptLevel == 0) return;
120c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
121c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  addInitialAliasAnalysisPasses(FPM);
122c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
123c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  FPM.add(createCFGSimplificationPass());
124713aa9431d84805c5b7ddce57159d14ee94cd548Chandler Carruth  if (UseNewSROA)
125713aa9431d84805c5b7ddce57159d14ee94cd548Chandler Carruth    FPM.add(createSROAPass());
126713aa9431d84805c5b7ddce57159d14ee94cd548Chandler Carruth  else
127713aa9431d84805c5b7ddce57159d14ee94cd548Chandler Carruth    FPM.add(createScalarReplAggregatesPass());
128c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  FPM.add(createEarlyCSEPass());
129c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  FPM.add(createLowerExpectIntrinsicPass());
130c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola}
131c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
132c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindolavoid PassManagerBuilder::populateModulePassManager(PassManagerBase &MPM) {
133c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // If all optimizations are disabled, just run the always-inline pass.
134c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  if (OptLevel == 0) {
135c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola    if (Inliner) {
136c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola      MPM.add(Inliner);
137dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      Inliner = nullptr;
138c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola    }
13963a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth
14063a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth    // FIXME: This is a HACK! The inliner pass above implicitly creates a CGSCC
14163a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth    // pass manager, but we don't want to add extensions into that pass manager.
14263a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth    // To prevent this we must insert a no-op module pass to reset the pass
14363a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth    // manager to get the same behavior as EP_OptimizerLast in non-O0 builds.
14463a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth    if (!GlobalExtensions->empty() || !Extensions.empty())
14563a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth      MPM.add(createBarrierNoopPass());
14663a1eb62e4eef1cbdedce5c60c3e1243a071eba1Chandler Carruth
147af65a8c54b66e9a78e2c7a9a810a33a73fb7f63aKostya Serebryany    addExtensionsToPM(EP_EnabledOnOptLevel0, MPM);
148c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola    return;
149c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  }
150c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
151c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // Add LibraryInfo if we have some.
152c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  if (LibraryInfo) MPM.add(new TargetLibraryInfo(*LibraryInfo));
153c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
154c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  addInitialAliasAnalysisPasses(MPM);
155c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
156c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  if (!DisableUnitAtATime) {
1577d4c87ef6eea424b7a28392ea11137ed77b44b57Dan Gohman    addExtensionsToPM(EP_ModuleOptimizerEarly, MPM);
1587d4c87ef6eea424b7a28392ea11137ed77b44b57Dan Gohman
159cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    MPM.add(createIPSCCPPass());              // IP SCCP
160c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola    MPM.add(createGlobalOptimizerPass());     // Optimize out global vars
161c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
162c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola    MPM.add(createDeadArgEliminationPass());  // Dead argument elimination
163c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
164c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola    MPM.add(createInstructionCombiningPass());// Clean up after IPCP & DAE
165dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    addExtensionsToPM(EP_Peephole, MPM);
166c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola    MPM.add(createCFGSimplificationPass());   // Clean up after IPCP & DAE
167c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  }
168c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
169c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // Start of CallGraph SCC passes.
170c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  if (!DisableUnitAtATime)
171c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola    MPM.add(createPruneEHPass());             // Remove dead EH info
172c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  if (Inliner) {
173c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola    MPM.add(Inliner);
174dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Inliner = nullptr;
175c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  }
176c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  if (!DisableUnitAtATime)
177c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola    MPM.add(createFunctionAttrsPass());       // Set readonly/readnone attrs
178c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  if (OptLevel > 2)
179c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola    MPM.add(createArgumentPromotionPass());   // Scalarize uninlined fn args
180c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
181c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // Start of function pass.
182c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // Break up aggregate allocas, using SSAUpdater.
1831c8db50a9aca4229ebee75ed9cfbf8b222292787Chandler Carruth  if (UseNewSROA)
1841c8db50a9aca4229ebee75ed9cfbf8b222292787Chandler Carruth    MPM.add(createSROAPass(/*RequiresDomTree*/ false));
1851c8db50a9aca4229ebee75ed9cfbf8b222292787Chandler Carruth  else
1861c8db50a9aca4229ebee75ed9cfbf8b222292787Chandler Carruth    MPM.add(createScalarReplAggregatesPass(-1, false));
187c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  MPM.add(createEarlyCSEPass());              // Catch trivial redundancies
188c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  MPM.add(createJumpThreadingPass());         // Thread jumps.
189c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  MPM.add(createCorrelatedValuePropagationPass()); // Propagate conditionals
190c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  MPM.add(createCFGSimplificationPass());     // Merge & remove BBs
191c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  MPM.add(createInstructionCombiningPass());  // Combine silly seq's
192dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  addExtensionsToPM(EP_Peephole, MPM);
193c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
194dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!DisableTailCalls)
195dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MPM.add(createTailCallEliminationPass()); // Eliminate tail calls
196c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  MPM.add(createCFGSimplificationPass());     // Merge & remove BBs
197c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  MPM.add(createReassociatePass());           // Reassociate expressions
198c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  MPM.add(createLoopRotatePass());            // Rotate Loop
199c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  MPM.add(createLICMPass());                  // Hoist loop invariants
200c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  MPM.add(createLoopUnswitchPass(SizeLevel || OptLevel < 3));
201c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  MPM.add(createInstructionCombiningPass());
202c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  MPM.add(createIndVarSimplifyPass());        // Canonicalize indvars
203c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  MPM.add(createLoopIdiomPass());             // Recognize idioms like memset.
204c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  MPM.add(createLoopDeletionPass());          // Delete dead loops
205d15c0c7ac118cb23241b002e7206221283e36e2dNadav Rotem
206c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  if (!DisableUnrollLoops)
20736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    MPM.add(createSimpleLoopUnrollPass());    // Unroll small loops
208c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  addExtensionsToPM(EP_LoopOptimizerEnd, MPM);
209c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
210c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  if (OptLevel > 1)
211c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola    MPM.add(createGVNPass());                 // Remove redundancies
212c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  MPM.add(createMemCpyOptPass());             // Remove memcpy / form memset
213c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  MPM.add(createSCCPPass());                  // Constant prop with SCCP
214c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
215c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // Run instcombine after redundancy elimination to exploit opportunities
216c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // opened up by them.
217c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  MPM.add(createInstructionCombiningPass());
218dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  addExtensionsToPM(EP_Peephole, MPM);
219c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  MPM.add(createJumpThreadingPass());         // Thread jumps
220c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  MPM.add(createCorrelatedValuePropagationPass());
221c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  MPM.add(createDeadStoreEliminationPass());  // Delete dead stores
222c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
223c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  addExtensionsToPM(EP_ScalarOptimizerLate, MPM);
224c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
225c8dc96be28fd1a3d6ddebbb48b8d55b61e4bd89bHal Finkel  if (RerollLoops)
226bebe48dbfe00078329341945bfb11f778ace6d12Hal Finkel    MPM.add(createLoopRerollPass());
227f1cd7983b195b2ab9c106c88b4da82983fe63f92Nadav Rotem  if (SLPVectorize)
228f1cd7983b195b2ab9c106c88b4da82983fe63f92Nadav Rotem    MPM.add(createSLPVectorizerPass());   // Vectorize parallel scalar chains.
229f1cd7983b195b2ab9c106c88b4da82983fe63f92Nadav Rotem
230f1cd7983b195b2ab9c106c88b4da82983fe63f92Nadav Rotem  if (BBVectorize) {
231f1cd7983b195b2ab9c106c88b4da82983fe63f92Nadav Rotem    MPM.add(createBBVectorizePass());
232f1cd7983b195b2ab9c106c88b4da82983fe63f92Nadav Rotem    MPM.add(createInstructionCombiningPass());
233dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    addExtensionsToPM(EP_Peephole, MPM);
234f1cd7983b195b2ab9c106c88b4da82983fe63f92Nadav Rotem    if (OptLevel > 1 && UseGVNAfterVectorization)
235f1cd7983b195b2ab9c106c88b4da82983fe63f92Nadav Rotem      MPM.add(createGVNPass());           // Remove redundancies
236f1cd7983b195b2ab9c106c88b4da82983fe63f92Nadav Rotem    else
237f1cd7983b195b2ab9c106c88b4da82983fe63f92Nadav Rotem      MPM.add(createEarlyCSEPass());      // Catch trivial redundancies
238f1cd7983b195b2ab9c106c88b4da82983fe63f92Nadav Rotem
239f1cd7983b195b2ab9c106c88b4da82983fe63f92Nadav Rotem    // BBVectorize may have significantly shortened a loop body; unroll again.
240f1cd7983b195b2ab9c106c88b4da82983fe63f92Nadav Rotem    if (!DisableUnrollLoops)
241f1cd7983b195b2ab9c106c88b4da82983fe63f92Nadav Rotem      MPM.add(createLoopUnrollPass());
242de5e5ec3045a73a06b1054417f9ac6c02929e9ceHal Finkel  }
243de5e5ec3045a73a06b1054417f9ac6c02929e9ceHal Finkel
244cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (LoadCombine)
245cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    MPM.add(createLoadCombinePass());
246cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
247c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  MPM.add(createAggressiveDCEPass());         // Delete dead instructions
24801d7203ef8316fdd71c3cec59f8e68fb869e0dbfTom Stellard  MPM.add(createCFGSimplificationPass()); // Merge & remove BBs
249c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  MPM.add(createInstructionCombiningPass());  // Clean up after everything.
250dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  addExtensionsToPM(EP_Peephole, MPM);
251c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
25236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // FIXME: This is a HACK! The inliner pass above implicitly creates a CGSCC
25336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // pass manager that we are specifically trying to avoid. To prevent this
25436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // we must insert a no-op module pass to reset the pass manager.
25536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  MPM.add(createBarrierNoopPass());
25636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  MPM.add(createLoopVectorizePass(DisableUnrollLoops, LoopVectorize));
25736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // FIXME: Because of #pragma vectorize enable, the passes below are always
25836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // inserted in the pipeline, even when the vectorizer doesn't run (ex. when
25936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // on -O1 and no #pragma is found). Would be good to have these two passes
26036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // as function calls, so that we can only pass them when the vectorizer
26136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // changed the code.
26236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  MPM.add(createInstructionCombiningPass());
263dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  addExtensionsToPM(EP_Peephole, MPM);
26436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  MPM.add(createCFGSimplificationPass());
2656bf3a05235effa06b10196ee9ebeffee14d886eeChandler Carruth
26636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (!DisableUnrollLoops)
26736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    MPM.add(createLoopUnrollPass());    // Unroll small loops
2686bf3a05235effa06b10196ee9ebeffee14d886eeChandler Carruth
269c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  if (!DisableUnitAtATime) {
270c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola    // FIXME: We shouldn't bother with this anymore.
271c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola    MPM.add(createStripDeadPrototypesPass()); // Get rid of dead prototypes
272c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
273f5fdc14df9914969bf56315cd3be8a3b3822a22eEvan Cheng    // GlobalOpt already deletes dead functions and globals, at -O2 try a
274c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola    // late pass of GlobalDCE.  It is capable of deleting dead cycles.
275f5fdc14df9914969bf56315cd3be8a3b3822a22eEvan Cheng    if (OptLevel > 1) {
276c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola      MPM.add(createGlobalDCEPass());         // Remove dead fns and globals.
277c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola      MPM.add(createConstantMergePass());     // Merge dup global constants
278f5fdc14df9914969bf56315cd3be8a3b3822a22eEvan Cheng    }
279c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  }
2801db394921b9635980555cc8d7e0d05b5e885784fKostya Serebryany  addExtensionsToPM(EP_OptimizerLast, MPM);
281c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola}
282c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
283c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindolavoid PassManagerBuilder::populateLTOPassManager(PassManagerBase &PM,
284c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola                                                bool Internalize,
2853197b4453d214aa96de3a42da8f8fe189fff2077Bill Wendling                                                bool RunInliner,
2863197b4453d214aa96de3a42da8f8fe189fff2077Bill Wendling                                                bool DisableGVNLoadPRE) {
287c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // Provide AliasAnalysis services for optimizations.
288c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  addInitialAliasAnalysisPasses(PM);
289c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
290c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // Now that composite has been compiled, scan through the module, looking
291c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // for a main function.  If main is defined, mark all other functions
292c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // internal.
2936e4d93b2325b268d5394b82201c1a782cca78faeBill Wendling  if (Internalize)
2947e667c56cf7e27ff521ceb86518beab32bfb630dRafael Espindola    PM.add(createInternalizePass("main"));
295c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
296c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // Propagate constants at call sites into the functions they call.  This
297c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // opens opportunities for globalopt (and inlining) by substituting function
298c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // pointers passed as arguments to direct uses of functions.
299c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  PM.add(createIPSCCPPass());
300c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
301c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // Now that we internalized some globals, see if we can hack on them!
302c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  PM.add(createGlobalOptimizerPass());
303c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
304c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // Linking modules together can lead to duplicated global constants, only
305c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // keep one copy of each constant.
306c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  PM.add(createConstantMergePass());
307c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
308c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // Remove unused arguments from functions.
309c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  PM.add(createDeadArgEliminationPass());
310c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
311c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // Reduce the code after globalopt and ipsccp.  Both can open up significant
312c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // simplification opportunities, and both can propagate functions through
313c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // function pointers.  When this happens, we often have to resolve varargs
314c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // calls, etc, so let instcombine do this.
315c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  PM.add(createInstructionCombiningPass());
316dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  addExtensionsToPM(EP_Peephole, PM);
317c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
318c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // Inline small functions
319c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  if (RunInliner)
320c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola    PM.add(createFunctionInliningPass());
321c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
322c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  PM.add(createPruneEHPass());   // Remove dead EH info.
323c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
324c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // Optimize globals again if we ran the inliner.
325c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  if (RunInliner)
326c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola    PM.add(createGlobalOptimizerPass());
327c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  PM.add(createGlobalDCEPass()); // Remove dead functions.
328c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
329c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // If we didn't decide to inline a function, check to see if we can
330c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // transform it to pass arguments by value instead of by reference.
331c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  PM.add(createArgumentPromotionPass());
332c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
333c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // The IPO passes may leave cruft around.  Clean up after them.
334c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  PM.add(createInstructionCombiningPass());
335dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  addExtensionsToPM(EP_Peephole, PM);
336c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  PM.add(createJumpThreadingPass());
3376e4d93b2325b268d5394b82201c1a782cca78faeBill Wendling
338c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // Break up allocas
339713aa9431d84805c5b7ddce57159d14ee94cd548Chandler Carruth  if (UseNewSROA)
340713aa9431d84805c5b7ddce57159d14ee94cd548Chandler Carruth    PM.add(createSROAPass());
341713aa9431d84805c5b7ddce57159d14ee94cd548Chandler Carruth  else
342713aa9431d84805c5b7ddce57159d14ee94cd548Chandler Carruth    PM.add(createScalarReplAggregatesPass());
343c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
344c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // Run a few AA driven optimizations here and now, to cleanup the code.
345c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  PM.add(createFunctionAttrsPass()); // Add nocapture.
346c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  PM.add(createGlobalsModRefPass()); // IP alias analysis.
347c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
3483197b4453d214aa96de3a42da8f8fe189fff2077Bill Wendling  PM.add(createLICMPass());                 // Hoist loop invariants.
3493197b4453d214aa96de3a42da8f8fe189fff2077Bill Wendling  PM.add(createGVNPass(DisableGVNLoadPRE)); // Remove redundancies.
3503197b4453d214aa96de3a42da8f8fe189fff2077Bill Wendling  PM.add(createMemCpyOptPass());            // Remove dead memcpys.
3516e4d93b2325b268d5394b82201c1a782cca78faeBill Wendling
352c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // Nuke dead stores.
353c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  PM.add(createDeadStoreEliminationPass());
354c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
355dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // More loops are countable; try to optimize them.
356dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  PM.add(createIndVarSimplifyPass());
357dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  PM.add(createLoopDeletionPass());
35836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  PM.add(createLoopVectorizePass(true, true));
35936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
360dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // More scalar chains could be vectorized due to more alias information
361dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  PM.add(createSLPVectorizerPass()); // Vectorize parallel scalar chains.
362dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
363cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  if (LoadCombine)
364cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines    PM.add(createLoadCombinePass());
365cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
366c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // Cleanup and simplify the code after the scalar optimizations.
367c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  PM.add(createInstructionCombiningPass());
368dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  addExtensionsToPM(EP_Peephole, PM);
369c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
370c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  PM.add(createJumpThreadingPass());
371c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
372c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // Delete basic blocks, which optimization passes may have killed.
37301d7203ef8316fdd71c3cec59f8e68fb869e0dbfTom Stellard  PM.add(createCFGSimplificationPass());
374c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
375c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  // Now that we have optimized the program, discard unreachable functions.
376c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  PM.add(createGlobalDCEPass());
377c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola}
37869cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola
3793e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopherinline PassManagerBuilder *unwrap(LLVMPassManagerBuilderRef P) {
3803e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher    return reinterpret_cast<PassManagerBuilder*>(P);
3813e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher}
3823e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher
3833e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopherinline LLVMPassManagerBuilderRef wrap(PassManagerBuilder *P) {
3843e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher  return reinterpret_cast<LLVMPassManagerBuilderRef>(P);
3853e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher}
3863e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher
38779c07d2a36282b09b9c5d0aa65ebf4bff017621bDmitri GribenkoLLVMPassManagerBuilderRef LLVMPassManagerBuilderCreate() {
38869cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola  PassManagerBuilder *PMB = new PassManagerBuilder();
38969cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola  return wrap(PMB);
39069cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola}
39169cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola
39269cb216009387694122c78438a9117f31a2f9ad5Rafael Espindolavoid LLVMPassManagerBuilderDispose(LLVMPassManagerBuilderRef PMB) {
39369cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola  PassManagerBuilder *Builder = unwrap(PMB);
39469cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola  delete Builder;
39569cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola}
39669cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola
39769cb216009387694122c78438a9117f31a2f9ad5Rafael Espindolavoid
39869cb216009387694122c78438a9117f31a2f9ad5Rafael EspindolaLLVMPassManagerBuilderSetOptLevel(LLVMPassManagerBuilderRef PMB,
39969cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola                                  unsigned OptLevel) {
40069cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola  PassManagerBuilder *Builder = unwrap(PMB);
40169cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola  Builder->OptLevel = OptLevel;
40269cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola}
40369cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola
40469cb216009387694122c78438a9117f31a2f9ad5Rafael Espindolavoid
40569cb216009387694122c78438a9117f31a2f9ad5Rafael EspindolaLLVMPassManagerBuilderSetSizeLevel(LLVMPassManagerBuilderRef PMB,
40669cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola                                   unsigned SizeLevel) {
40769cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola  PassManagerBuilder *Builder = unwrap(PMB);
40869cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola  Builder->SizeLevel = SizeLevel;
40969cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola}
41069cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola
41169cb216009387694122c78438a9117f31a2f9ad5Rafael Espindolavoid
41269cb216009387694122c78438a9117f31a2f9ad5Rafael EspindolaLLVMPassManagerBuilderSetDisableUnitAtATime(LLVMPassManagerBuilderRef PMB,
41369cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola                                            LLVMBool Value) {
41469cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola  PassManagerBuilder *Builder = unwrap(PMB);
41569cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola  Builder->DisableUnitAtATime = Value;
41669cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola}
41769cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola
41869cb216009387694122c78438a9117f31a2f9ad5Rafael Espindolavoid
41969cb216009387694122c78438a9117f31a2f9ad5Rafael EspindolaLLVMPassManagerBuilderSetDisableUnrollLoops(LLVMPassManagerBuilderRef PMB,
42069cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola                                            LLVMBool Value) {
42169cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola  PassManagerBuilder *Builder = unwrap(PMB);
42269cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola  Builder->DisableUnrollLoops = Value;
42369cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola}
42469cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola
42569cb216009387694122c78438a9117f31a2f9ad5Rafael Espindolavoid
42669cb216009387694122c78438a9117f31a2f9ad5Rafael EspindolaLLVMPassManagerBuilderSetDisableSimplifyLibCalls(LLVMPassManagerBuilderRef PMB,
42769cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola                                                 LLVMBool Value) {
428be87bce32bc9af9bc5918a6e08806b61e3088165Meador Inge  // NOTE: The simplify-libcalls pass has been removed.
42969cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola}
43069cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola
43169cb216009387694122c78438a9117f31a2f9ad5Rafael Espindolavoid
43269cb216009387694122c78438a9117f31a2f9ad5Rafael EspindolaLLVMPassManagerBuilderUseInlinerWithThreshold(LLVMPassManagerBuilderRef PMB,
43369cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola                                              unsigned Threshold) {
43469cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola  PassManagerBuilder *Builder = unwrap(PMB);
43569cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola  Builder->Inliner = createFunctionInliningPass(Threshold);
43669cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola}
43769cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola
43869cb216009387694122c78438a9117f31a2f9ad5Rafael Espindolavoid
43969cb216009387694122c78438a9117f31a2f9ad5Rafael EspindolaLLVMPassManagerBuilderPopulateFunctionPassManager(LLVMPassManagerBuilderRef PMB,
44069cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola                                                  LLVMPassManagerRef PM) {
44169cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola  PassManagerBuilder *Builder = unwrap(PMB);
44269cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola  FunctionPassManager *FPM = unwrap<FunctionPassManager>(PM);
44369cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola  Builder->populateFunctionPassManager(*FPM);
44469cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola}
44569cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola
44669cb216009387694122c78438a9117f31a2f9ad5Rafael Espindolavoid
44769cb216009387694122c78438a9117f31a2f9ad5Rafael EspindolaLLVMPassManagerBuilderPopulateModulePassManager(LLVMPassManagerBuilderRef PMB,
44869cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola                                                LLVMPassManagerRef PM) {
44969cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola  PassManagerBuilder *Builder = unwrap(PMB);
45069cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola  PassManagerBase *MPM = unwrap(PM);
45169cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola  Builder->populateModulePassManager(*MPM);
45269cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola}
45369cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola
45469cb216009387694122c78438a9117f31a2f9ad5Rafael Espindolavoid LLVMPassManagerBuilderPopulateLTOPassManager(LLVMPassManagerBuilderRef PMB,
45569cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola                                                  LLVMPassManagerRef PM,
4560ebc084132cbf4ebebdb6c931ef42f97e3ff5fe1Nick Lewycky                                                  LLVMBool Internalize,
4570ebc084132cbf4ebebdb6c931ef42f97e3ff5fe1Nick Lewycky                                                  LLVMBool RunInliner) {
45869cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola  PassManagerBuilder *Builder = unwrap(PMB);
45969cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola  PassManagerBase *LPM = unwrap(PM);
4600ebc084132cbf4ebebdb6c931ef42f97e3ff5fe1Nick Lewycky  Builder->populateLTOPassManager(*LPM, Internalize != 0, RunInliner != 0);
46169cb216009387694122c78438a9117f31a2f9ad5Rafael Espindola}
462