13d453ac1317f910b0589d87c061f056be29e36cdRafael Espindola// llvm/Transforms/IPO/PassManagerBuilder.h - Build Standard Pass -*- C++ -*-=//
2ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner//
3ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner//                     The LLVM Compiler Infrastructure
4ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner//
5ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner// This file is distributed under the University of Illinois Open Source
6ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner// License. See LICENSE.TXT for details.
7ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner//
8ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner//===----------------------------------------------------------------------===//
9ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner//
10ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner// This file defines the PassManagerBuilder class, which is used to set up a
11ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner// "standard" optimization sequence suitable for languages like C and C++.
12ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner//
13ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner//===----------------------------------------------------------------------===//
14ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner
15ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner#ifndef LLVM_SUPPORT_PASSMANAGERBUILDER_H
16ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner#define LLVM_SUPPORT_PASSMANAGERBUILDER_H
17ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner
18c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola#include <vector>
19ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner
20ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattnernamespace llvm {
21c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  class TargetLibraryInfo;
22c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  class PassManagerBase;
23c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  class Pass;
24c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  class FunctionPassManager;
25c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
26ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner/// PassManagerBuilder - This class is used to set up a standard optimization
27ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner/// sequence for languages like C and C++, allowing some APIs to customize the
28ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner/// pass sequence in various ways. A simple example of using it would be:
29ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner///
30c610017269cf193d6a16f7288c2525d8d3adb566Richard Osborne///  PassManagerBuilder Builder;
31c610017269cf193d6a16f7288c2525d8d3adb566Richard Osborne///  Builder.OptLevel = 2;
32ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner///  Builder.populateFunctionPassManager(FPM);
33ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner///  Builder.populateModulePassManager(MPM);
34ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner///
35f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner/// In addition to setting up the basic passes, PassManagerBuilder allows
36f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner/// frontends to vend a plugin API, where plugins are allowed to add extensions
37f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner/// to the default pass manager.  They do this by specifying where in the pass
38f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner/// pipeline they want to be added, along with a callback function that adds
39f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner/// the pass(es).  For example, a plugin that wanted to add a loop optimization
40f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner/// could do something like this:
41f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner///
42f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner/// static void addMyLoopPass(const PMBuilder &Builder, PassManagerBase &PM) {
43f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner///   if (Builder.getOptLevel() > 2 && Builder.getOptSizeLevel() == 0)
44f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner///     PM.add(createMyAwesomePass());
45f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner/// }
46f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner///   ...
47f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner///   Builder.addExtension(PassManagerBuilder::EP_LoopOptimizerEnd,
48f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner///                        addMyLoopPass);
49f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner///   ...
50ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattnerclass PassManagerBuilder {
51f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattnerpublic:
52c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
53f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner  /// Extensions are passed the builder itself (so they can see how it is
54f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner  /// configured) as well as the pass manager to add stuff to.
55f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner  typedef void (*ExtensionFn)(const PassManagerBuilder &Builder,
56f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner                              PassManagerBase &PM);
57f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner  enum ExtensionPointTy {
58f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner    /// EP_EarlyAsPossible - This extension point allows adding passes before
59f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner    /// any other transformations, allowing them to see the code as it is coming
60f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner    /// out of the frontend.
61f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner    EP_EarlyAsPossible,
62c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
637d4c87ef6eea424b7a28392ea11137ed77b44b57Dan Gohman    /// EP_ModuleOptimizerEarly - This extension point allows adding passes
647d4c87ef6eea424b7a28392ea11137ed77b44b57Dan Gohman    /// just before the main module-level optimization passes.
657d4c87ef6eea424b7a28392ea11137ed77b44b57Dan Gohman    EP_ModuleOptimizerEarly,
667d4c87ef6eea424b7a28392ea11137ed77b44b57Dan Gohman
67f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner    /// EP_LoopOptimizerEnd - This extension point allows adding loop passes to
68f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner    /// the end of the loop optimizer.
699c04b5bd282bd5d03ab2114339d670ca95073664Dan Gohman    EP_LoopOptimizerEnd,
709c04b5bd282bd5d03ab2114339d670ca95073664Dan Gohman
719c04b5bd282bd5d03ab2114339d670ca95073664Dan Gohman    /// EP_ScalarOptimizerLate - This extension point allows adding optimization
729c04b5bd282bd5d03ab2114339d670ca95073664Dan Gohman    /// passes after most of the main optimizations, but before the last
739c04b5bd282bd5d03ab2114339d670ca95073664Dan Gohman    /// cleanup-ish optimizations.
74af65a8c54b66e9a78e2c7a9a810a33a73fb7f63aKostya Serebryany    EP_ScalarOptimizerLate,
75af65a8c54b66e9a78e2c7a9a810a33a73fb7f63aKostya Serebryany
761db394921b9635980555cc8d7e0d05b5e885784fKostya Serebryany    /// EP_OptimizerLast -- This extension point allows adding passes that
771db394921b9635980555cc8d7e0d05b5e885784fKostya Serebryany    /// run after everything else.
781db394921b9635980555cc8d7e0d05b5e885784fKostya Serebryany    EP_OptimizerLast,
791db394921b9635980555cc8d7e0d05b5e885784fKostya Serebryany
80af65a8c54b66e9a78e2c7a9a810a33a73fb7f63aKostya Serebryany    /// EP_EnabledOnOptLevel0 - This extension point allows adding passes that
81af65a8c54b66e9a78e2c7a9a810a33a73fb7f63aKostya Serebryany    /// should not be disabled by O0 optimization level. The passes will be
82af65a8c54b66e9a78e2c7a9a810a33a73fb7f63aKostya Serebryany    /// inserted after the inlining pass.
83af65a8c54b66e9a78e2c7a9a810a33a73fb7f63aKostya Serebryany    EP_EnabledOnOptLevel0
84f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner  };
85c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
86f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner  /// The Optimization Level - Specify the basic optimization level.
87f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner  ///    0 = -O0, 1 = -O1, 2 = -O2, 3 = -O3
88f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner  unsigned OptLevel;
89c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
90f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner  /// SizeLevel - How much we're optimizing for size.
91f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner  ///    0 = none, 1 = -Os, 2 = -Oz
92f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner  unsigned SizeLevel;
93c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
94f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner  /// LibraryInfo - Specifies information about the runtime library for the
95f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner  /// optimizer.  If this is non-null, it is added to both the function and
96f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner  /// per-module pass pipeline.
97f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner  TargetLibraryInfo *LibraryInfo;
98c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
99f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner  /// Inliner - Specifies the inliner to use.  If this is non-null, it is
100f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner  /// added to the per-module passes.
101f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner  Pass *Inliner;
102c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
103ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner  bool DisableSimplifyLibCalls;
104ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner  bool DisableUnitAtATime;
105ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner  bool DisableUnrollLoops;
106de5e5ec3045a73a06b1054417f9ac6c02929e9ceHal Finkel  bool Vectorize;
107c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
108f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattnerprivate:
109f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner  /// ExtensionList - This is list of all of the extensions that are registered.
110f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner  std::vector<std::pair<ExtensionPointTy, ExtensionFn> > Extensions;
111c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
112ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattnerpublic:
113c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  PassManagerBuilder();
114c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  ~PassManagerBuilder();
1157a817eae6cb00a2ba5ec2a4127775b839a357e4cDavid Chisnall  /// Adds an extension that will be used by all PassManagerBuilder instances.
1167a817eae6cb00a2ba5ec2a4127775b839a357e4cDavid Chisnall  /// This is intended to be used by plugins, to register a set of
1177a817eae6cb00a2ba5ec2a4127775b839a357e4cDavid Chisnall  /// optimisations to run automatically.
1187a817eae6cb00a2ba5ec2a4127775b839a357e4cDavid Chisnall  static void addGlobalExtension(ExtensionPointTy Ty, ExtensionFn Fn);
119c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  void addExtension(ExtensionPointTy Ty, ExtensionFn Fn);
120c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
121ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattnerprivate:
122c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  void addExtensionsToPM(ExtensionPointTy ETy, PassManagerBase &PM) const;
123c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  void addInitialAliasAnalysisPasses(PassManagerBase &PM) const;
124ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattnerpublic:
125c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola
126ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner  /// populateFunctionPassManager - This fills in the function pass manager,
127ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner  /// which is expected to be run on each function immediately as it is
128ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner  /// generated.  The idea is to reduce the size of the IR in memory.
129c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  void populateFunctionPassManager(FunctionPassManager &FPM);
130f5be7bdc909dae98fab6530c6ab378d6d2618443Chris Lattner
131ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner  /// populateModulePassManager - This sets up the primary pass manager.
132c684e83e4554bfaf6180426f86b9253b65dd46ecRafael Espindola  void populateModulePassManager(PassManagerBase &MPM);
13392a9cb6594e22e2e273f61922226616bf0b943dfChris Lattner  void populateLTOPassManager(PassManagerBase &PM, bool Internalize,
1343197b4453d214aa96de3a42da8f8fe189fff2077Bill Wendling                              bool RunInliner, bool DisableGVNLoadPRE = false);
135ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner};
1363197b4453d214aa96de3a42da8f8fe189fff2077Bill Wendling
1377a817eae6cb00a2ba5ec2a4127775b839a357e4cDavid Chisnall/// Registers a function for adding a standard set of passes.  This should be
1387a817eae6cb00a2ba5ec2a4127775b839a357e4cDavid Chisnall/// used by optimizer plugins to allow all front ends to transparently use
1397a817eae6cb00a2ba5ec2a4127775b839a357e4cDavid Chisnall/// them.  Create a static instance of this class in your plugin, providing a
1407a817eae6cb00a2ba5ec2a4127775b839a357e4cDavid Chisnall/// private function that the PassManagerBuilder can use to add your passes.
1417a817eae6cb00a2ba5ec2a4127775b839a357e4cDavid Chisnallstruct RegisterStandardPasses {
1427a817eae6cb00a2ba5ec2a4127775b839a357e4cDavid Chisnall  RegisterStandardPasses(PassManagerBuilder::ExtensionPointTy Ty,
1437a817eae6cb00a2ba5ec2a4127775b839a357e4cDavid Chisnall                         PassManagerBuilder::ExtensionFn Fn) {
1447a817eae6cb00a2ba5ec2a4127775b839a357e4cDavid Chisnall    PassManagerBuilder::addGlobalExtension(Ty, Fn);
1457a817eae6cb00a2ba5ec2a4127775b839a357e4cDavid Chisnall  }
1467a817eae6cb00a2ba5ec2a4127775b839a357e4cDavid Chisnall};
1473197b4453d214aa96de3a42da8f8fe189fff2077Bill Wendling
148ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner} // end namespace llvm
149ae6d5dc715ec7d3edd825a4b8ca9f6f9a3fbfb58Chris Lattner#endif
150