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