Pass.h revision 476e9bd1146624fa17243ae55fdb156f905ba3d4
148486893f46d2e12e926682a3ecb908716bc66c4Chris Lattner//===- llvm/Pass.h - Base class for Passes ----------------------*- C++ -*-===// 29769ab22265b313171d201b5928688524a01bd87Misha Brukman// 36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// The LLVM Compiler Infrastructure 46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// 57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source 67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details. 79769ab22265b313171d201b5928688524a01bd87Misha Brukman// 86fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//===----------------------------------------------------------------------===// 91bffea0341968b3b2b0106c745d4602b6804e62fChris Lattner// 10986fced5f9b3ef06f514cba66db499acffdc9711Chris Lattner// This file defines a base class that indicates that a specified class is a 111bffea0341968b3b2b0106c745d4602b6804e62fChris Lattner// transformation pass implementation. 121bffea0341968b3b2b0106c745d4602b6804e62fChris Lattner// 13fb215b936df0034f9030e921c0c054ab11470762Misha Brukman// Passes are designed this way so that it is possible to run passes in a cache 14aff5bcebb7fb9880e0a3518a8e7c999e738d531cChris Lattner// and organizationally optimal order without having to specify it at the front 15aff5bcebb7fb9880e0a3518a8e7c999e738d531cChris Lattner// end. This allows arbitrary passes to be strung together and have them 16aff5bcebb7fb9880e0a3518a8e7c999e738d531cChris Lattner// executed as effeciently as possible. 171bffea0341968b3b2b0106c745d4602b6804e62fChris Lattner// 18aff5bcebb7fb9880e0a3518a8e7c999e738d531cChris Lattner// Passes should extend one of the classes below, depending on the guarantees 19aff5bcebb7fb9880e0a3518a8e7c999e738d531cChris Lattner// that it can make about what will be modified as it is run. For example, most 20f57b845547302d24ecb6a9e79d7bc386f761a6c9Chris Lattner// global optimizations should derive from FunctionPass, because they do not add 21d30efaf56ed1e374240b4c2fe2ea7054cbd7cb52Chris Lattner// or delete functions, they operate on the internals of the function. 221bffea0341968b3b2b0106c745d4602b6804e62fChris Lattner// 234c76fc048bb9a3c5f760a50ea114f0605b9561d9Chris Lattner// Note that this file #includes PassSupport.h and PassAnalysisSupport.h (at the 244c76fc048bb9a3c5f760a50ea114f0605b9561d9Chris Lattner// bottom), so the APIs exposed by these files are also automatically available 254c76fc048bb9a3c5f760a50ea114f0605b9561d9Chris Lattner// to all users of this file. 264c76fc048bb9a3c5f760a50ea114f0605b9561d9Chris Lattner// 271bffea0341968b3b2b0106c745d4602b6804e62fChris Lattner//===----------------------------------------------------------------------===// 281bffea0341968b3b2b0106c745d4602b6804e62fChris Lattner 29986fced5f9b3ef06f514cba66db499acffdc9711Chris Lattner#ifndef LLVM_PASS_H 30986fced5f9b3ef06f514cba66db499acffdc9711Chris Lattner#define LLVM_PASS_H 311bffea0341968b3b2b0106c745d4602b6804e62fChris Lattner 328b67f774e9c38b7718b2b300b628388f966df4e0Chandler Carruth#include "llvm/System/DataTypes.h" 33be67780f31958b05ad3c510ca3a973d327517e86Chris Lattner#include <cassert> 34630fcb86785f96501126e52009619b475403dc62Misha Brukman#include <utility> 35630fcb86785f96501126e52009619b475403dc62Misha Brukman#include <vector> 36d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 37d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 38d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 391fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass BasicBlock; 40e7506a366e8bd56c97d10beb68e4db953aebaecaChris Lattnerclass Function; 4105ad462d1b8e0486879ecd910c3ff4541bd8604cChris Lattnerclass Module; 42f57b845547302d24ecb6a9e79d7bc386f761a6c9Chris Lattnerclass AnalysisUsage; 434c76fc048bb9a3c5f760a50ea114f0605b9561d9Chris Lattnerclass PassInfo; 4470b4f3e05106761e99cc56919767155cad0e2d3aChris Lattnerclass ImmutablePass; 4509e6e4303f1aac10fea6860e7736c234fcbf56ccDevang Patelclass PMStack; 46cde53d3c1e9d6a2add5de847b44818fbb1d69c20Devang Patelclass AnalysisResolver; 4797149737f27457b0411e49af3e4539688e29848fDevang Patelclass PMDataManager; 4845cfe545ec8177262dabc70580ce05feaa1c3880Chris Lattnerclass raw_ostream; 498a261e44f71a433b7d9af373c3e3dfa6fea67146Dan Gohmanclass StringRef; 50aff5bcebb7fb9880e0a3518a8e7c999e738d531cChris Lattner 51a59cbb2043c08f3cfb8fb379f0d336e21e070be8Chris Lattner// AnalysisID - Use the PassInfo to identify a pass... 52a59cbb2043c08f3cfb8fb379f0d336e21e070be8Chris Lattnertypedef const PassInfo* AnalysisID; 53a59cbb2043c08f3cfb8fb379f0d336e21e070be8Chris Lattner 54be1ffc6b8d3db7b1a9d512a1d53afd075d8e58c9Devang Patel/// Different types of internal pass managers. External pass managers 55be1ffc6b8d3db7b1a9d512a1d53afd075d8e58c9Devang Patel/// (PassManager and FunctionPassManager) are not represented here. 56be1ffc6b8d3db7b1a9d512a1d53afd075d8e58c9Devang Patel/// Ordering of pass manager types is important here. 57be1ffc6b8d3db7b1a9d512a1d53afd075d8e58c9Devang Patelenum PassManagerType { 58be1ffc6b8d3db7b1a9d512a1d53afd075d8e58c9Devang Patel PMT_Unknown = 0, 59be1ffc6b8d3db7b1a9d512a1d53afd075d8e58c9Devang Patel PMT_ModulePassManager = 1, /// MPPassManager 60be1ffc6b8d3db7b1a9d512a1d53afd075d8e58c9Devang Patel PMT_CallGraphPassManager, /// CGPassManager 61be1ffc6b8d3db7b1a9d512a1d53afd075d8e58c9Devang Patel PMT_FunctionPassManager, /// FPPassManager 62be1ffc6b8d3db7b1a9d512a1d53afd075d8e58c9Devang Patel PMT_LoopPassManager, /// LPPassManager 63fe613905b371ef7160968cdaabf6074cfa10f4a0Devang Patel PMT_BasicBlockPassManager, /// BBPassManager 64fe613905b371ef7160968cdaabf6074cfa10f4a0Devang Patel PMT_Last 65be1ffc6b8d3db7b1a9d512a1d53afd075d8e58c9Devang Patel}; 66be1ffc6b8d3db7b1a9d512a1d53afd075d8e58c9Devang Patel 67476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner// Different types of passes. 68476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattnerenum PassKind { 69476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner PT_BasicBlock, 70476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner PT_Loop, 71476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner PT_Function, 72476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner PT_CallGraphSCC, 73476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner PT_Module, 74476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner PT_PassManager 75476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner}; 76476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner 771bffea0341968b3b2b0106c745d4602b6804e62fChris Lattner//===----------------------------------------------------------------------===// 7826199059268a05739c84ebf465fcdbf7ded861dfChris Lattner/// Pass interface - Implemented by all 'passes'. Subclass this if you are an 7926199059268a05739c84ebf465fcdbf7ded861dfChris Lattner/// interprocedural optimization or you do not fit into any of the more 8026199059268a05739c84ebf465fcdbf7ded861dfChris Lattner/// constrained passes described below. 8126199059268a05739c84ebf465fcdbf7ded861dfChris Lattner/// 8205ad462d1b8e0486879ecd910c3ff4541bd8604cChris Lattnerclass Pass { 83cde53d3c1e9d6a2add5de847b44818fbb1d69c20Devang Patel AnalysisResolver *Resolver; // Used to resolve analysis 84eae540a037d17d218767f21b6d3b45f395df4619Devang Patel intptr_t PassID; 85476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner PassKind Kind; 86f9b2297380d57d35c707864a9d55c1e00da39700Chris Lattner void operator=(const Pass&); // DO NOT IMPLEMENT 87f9b2297380d57d35c707864a9d55c1e00da39700Chris Lattner Pass(const Pass &); // DO NOT IMPLEMENT 88a8185fe50bdc2de23c00c2ada1a632e17adcf6c5Owen Anderson 8905ad462d1b8e0486879ecd910c3ff4541bd8604cChris Lattnerpublic: 90476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner explicit Pass(PassKind K, intptr_t pid) : Resolver(0), PassID(pid), Kind(K) { 91d24931632b480e0472e88df200c4ef80649e48f1Torok Edwin assert(pid && "pid cannot be 0"); 92d24931632b480e0472e88df200c4ef80649e48f1Torok Edwin } 93476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner explicit Pass(PassKind K, const void *pid) 94476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner : Resolver(0), PassID((intptr_t)pid), Kind(K) { 95d24931632b480e0472e88df200c4ef80649e48f1Torok Edwin assert(pid && "pid cannot be 0"); 96d24931632b480e0472e88df200c4ef80649e48f1Torok Edwin } 976e21ff0b0a8e4f0878431afa5628bb1c2db0b8e1Devang Patel virtual ~Pass(); 9805ad462d1b8e0486879ecd910c3ff4541bd8604cChris Lattner 99476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner 100476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner PassKind getPassKind() const { return Kind; } 101476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner 10226199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// getPassName - Return a nice clean name for a pass. This usually 10326199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// implemented in terms of the name that is registered by one of the 104b973d5f9b59f75854493bc37a9eb0f3032be0864Dan Gohman /// Registration templates, but can be overloaded directly. 10526199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// 10696c466b06ab0c830b07329c1b16037f585ccbe40Chris Lattner virtual const char *getPassName() const; 107aff5bcebb7fb9880e0a3518a8e7c999e738d531cChris Lattner 10826199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// getPassInfo - Return the PassInfo data structure that corresponds to this 10926199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// pass... If the pass has not been registered, this will return null. 11026199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// 1114c76fc048bb9a3c5f760a50ea114f0605b9561d9Chris Lattner const PassInfo *getPassInfo() const; 1124c76fc048bb9a3c5f760a50ea114f0605b9561d9Chris Lattner 11326199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// print - Print out the internal state of the pass. This is called by 11426199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// Analyze to print out the contents of an analysis. Otherwise it is not 1155560c9d49ccae132cabf1155f18aa0480dce3edaMisha Brukman /// necessary to implement this method. Beware that the module pointer MAY be 11626199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// null. This automatically forwards to a virtual function that does not 11726199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// provide the Module* in case the analysis doesn't need it it can just be 11826199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// ignored. 11926199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// 12045cfe545ec8177262dabc70580ce05feaa1c3880Chris Lattner virtual void print(raw_ostream &O, const Module *M) const; 121275872e79950dafc6699f6502cee52f74b84a22aDaniel Dunbar void dump() const; // dump - Print to stderr. 122a59cbb2043c08f3cfb8fb379f0d336e21e070be8Chris Lattner 12322a1cf9d3a5c829d260bcf44ffe6b34ecf16076cDevang Patel /// Each pass is responsible for assigning a pass manager to itself. 12422a1cf9d3a5c829d260bcf44ffe6b34ecf16076cDevang Patel /// PMS is the stack of available pass manager. 12513d57320bd212483463d4f8992d5787b29eda5dfBill Wendling virtual void assignPassManager(PMStack &, 12613d57320bd212483463d4f8992d5787b29eda5dfBill Wendling PassManagerType = PMT_Unknown) {} 12722a1cf9d3a5c829d260bcf44ffe6b34ecf16076cDevang Patel /// Check if available pass managers are suitable for this pass or not. 128eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman virtual void preparePassManager(PMStack &); 1298f93b7fc36dbeba428c6dd122c07fe0777baa664Devang Patel 1308f93b7fc36dbeba428c6dd122c07fe0777baa664Devang Patel /// Return what kind of Pass Manager can manage this pass. 131eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman virtual PassManagerType getPotentialPassManagerType() const; 13222a1cf9d3a5c829d260bcf44ffe6b34ecf16076cDevang Patel 133cde53d3c1e9d6a2add5de847b44818fbb1d69c20Devang Patel // Access AnalysisResolver 134b42295df4da77a34519d0c49840a8b997d3f0b7cDevang Patel inline void setResolver(AnalysisResolver *AR) { 135476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner assert(!Resolver && "Resolver is already set"); 136b42295df4da77a34519d0c49840a8b997d3f0b7cDevang Patel Resolver = AR; 137b42295df4da77a34519d0c49840a8b997d3f0b7cDevang Patel } 138b42295df4da77a34519d0c49840a8b997d3f0b7cDevang Patel inline AnalysisResolver *getResolver() { 139b42295df4da77a34519d0c49840a8b997d3f0b7cDevang Patel return Resolver; 140b42295df4da77a34519d0c49840a8b997d3f0b7cDevang Patel } 141a59cbb2043c08f3cfb8fb379f0d336e21e070be8Chris Lattner 14226199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// getAnalysisUsage - This function should be overriden by passes that need 14326199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// analysis information to do their job. If a pass specifies that it uses a 14426199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// particular analysis result to this function, it can then use the 14526199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// getAnalysis<AnalysisType>() function, below. 14626199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// 147eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman virtual void getAnalysisUsage(AnalysisUsage &) const; 14805ad462d1b8e0486879ecd910c3ff4541bd8604cChris Lattner 14926199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// releaseMemory() - This member can be implemented by a pass if it wants to 15026199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// be able to release its memory when it is no longer needed. The default 15126199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// behavior of passes is to hold onto memory for the entire duration of their 15226199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// lifetime (which is the entire compile time). For pipelined passes, this 15326199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// is not a big deal because that memory gets recycled every time the pass is 15426199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// invoked on another program unit. For IP passes, it is more important to 15526199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// free memory when it is unused. 15626199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// 15726199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// Optionally implement this function to release pass memory when it is no 15826199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// longer used. 15926199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// 160eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman virtual void releaseMemory(); 161ce885e9f9d03fa1d9dd5e2abba5e95953473288fChris Lattner 1622033097b1f5b1889a5d801febbc7848c7b8ca439Chris Lattner /// getAdjustedAnalysisPointer - This method is used when a pass implements 1632033097b1f5b1889a5d801febbc7848c7b8ca439Chris Lattner /// an analysis interface through multiple inheritance. If needed, it should 1642033097b1f5b1889a5d801febbc7848c7b8ca439Chris Lattner /// override this to adjust the this pointer as needed for the specified pass 1652033097b1f5b1889a5d801febbc7848c7b8ca439Chris Lattner /// info. 1662033097b1f5b1889a5d801febbc7848c7b8ca439Chris Lattner virtual void *getAdjustedAnalysisPointer(const PassInfo *PI) { 1672033097b1f5b1889a5d801febbc7848c7b8ca439Chris Lattner return this; 1682033097b1f5b1889a5d801febbc7848c7b8ca439Chris Lattner } 1695e664b8f7c5ba877058a3a1cdfcce8e6b7388a6aChris Lattner virtual ImmutablePass *getAsImmutablePass() { return 0; } 1703660ecabbb85b31308f38938ce3f56f0a330a84bChris Lattner virtual PMDataManager *getAsPMDataManager() { return 0; } 1712033097b1f5b1889a5d801febbc7848c7b8ca439Chris Lattner 1729750b5d5779e6efec10a93633dd1d36c5f61dbc3Devang Patel /// verifyAnalysis() - This member can be implemented by a analysis pass to 1739750b5d5779e6efec10a93633dd1d36c5f61dbc3Devang Patel /// check state of analysis information. 174eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman virtual void verifyAnalysis() const; 1759750b5d5779e6efec10a93633dd1d36c5f61dbc3Devang Patel 17605ad462d1b8e0486879ecd910c3ff4541bd8604cChris Lattner // dumpPassStructure - Implement the -debug-passes=PassStructure option 17705ad462d1b8e0486879ecd910c3ff4541bd8604cChris Lattner virtual void dumpPassStructure(unsigned Offset = 0); 17805ad462d1b8e0486879ecd910c3ff4541bd8604cChris Lattner 179fb30fda1de96251017ae092f469de4b290b6b61bChris Lattner template<typename AnalysisClass> 180fb30fda1de96251017ae092f469de4b290b6b61bChris Lattner static const PassInfo *getClassPassInfo() { 181276222a5ae189ed5c6a2afb248d4c8f0335585b4Reid Spencer return lookupPassInfo(intptr_t(&AnalysisClass::ID)); 182fb30fda1de96251017ae092f469de4b290b6b61bChris Lattner } 183fb30fda1de96251017ae092f469de4b290b6b61bChris Lattner 184fb30fda1de96251017ae092f469de4b290b6b61bChris Lattner // lookupPassInfo - Return the pass info object for the specified pass class, 185fb30fda1de96251017ae092f469de4b290b6b61bChris Lattner // or null if it is not known. 186eae540a037d17d218767f21b6d3b45f395df4619Devang Patel static const PassInfo *lookupPassInfo(intptr_t TI); 187fb30fda1de96251017ae092f469de4b290b6b61bChris Lattner 1888a261e44f71a433b7d9af373c3e3dfa6fea67146Dan Gohman // lookupPassInfo - Return the pass info object for the pass with the given 1898a261e44f71a433b7d9af373c3e3dfa6fea67146Dan Gohman // argument string, or null if it is not known. 1902928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbar static const PassInfo *lookupPassInfo(StringRef Arg); 1918a261e44f71a433b7d9af373c3e3dfa6fea67146Dan Gohman 1921465d61bdd36cfd6021036a527895f0dd358e97dDuncan Sands /// getAnalysisIfAvailable<AnalysisType>() - Subclasses use this function to 1931465d61bdd36cfd6021036a527895f0dd358e97dDuncan Sands /// get analysis information that might be around, for example to update it. 1941465d61bdd36cfd6021036a527895f0dd358e97dDuncan Sands /// This is different than getAnalysis in that it can fail (if the analysis 1951465d61bdd36cfd6021036a527895f0dd358e97dDuncan Sands /// results haven't been computed), so should only be used if you can handle 1961465d61bdd36cfd6021036a527895f0dd358e97dDuncan Sands /// the case when the analysis is not available. This method is often used by 1971465d61bdd36cfd6021036a527895f0dd358e97dDuncan Sands /// transformation APIs to update analysis results for a pass automatically as 1981465d61bdd36cfd6021036a527895f0dd358e97dDuncan Sands /// the transform is performed. 199f9bbe214fdd7391d2798c6e2d3d281f02f6dcc43Chris Lattner /// 2001465d61bdd36cfd6021036a527895f0dd358e97dDuncan Sands template<typename AnalysisType> AnalysisType * 2011465d61bdd36cfd6021036a527895f0dd358e97dDuncan Sands getAnalysisIfAvailable() const; // Defined in PassAnalysisSupport.h 202f9bbe214fdd7391d2798c6e2d3d281f02f6dcc43Chris Lattner 203f1ab454b71efae1a5cee7f9285d91b75ead6a8a7Chris Lattner /// mustPreserveAnalysisID - This method serves the same function as 2041465d61bdd36cfd6021036a527895f0dd358e97dDuncan Sands /// getAnalysisIfAvailable, but works if you just have an AnalysisID. This 205f1ab454b71efae1a5cee7f9285d91b75ead6a8a7Chris Lattner /// obviously cannot give you a properly typed instance of the class if you 2061465d61bdd36cfd6021036a527895f0dd358e97dDuncan Sands /// don't have the class name available (use getAnalysisIfAvailable if you 2071465d61bdd36cfd6021036a527895f0dd358e97dDuncan Sands /// do), but it can tell you if you need to preserve the pass at least. 208f1ab454b71efae1a5cee7f9285d91b75ead6a8a7Chris Lattner /// 209f1ab454b71efae1a5cee7f9285d91b75ead6a8a7Chris Lattner bool mustPreserveAnalysisID(const PassInfo *AnalysisID) const; 210f1ab454b71efae1a5cee7f9285d91b75ead6a8a7Chris Lattner 21126199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// getAnalysis<AnalysisType>() - This function is used by subclasses to get 21226199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// to the analysis information that they claim to use by overriding the 21326199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// getAnalysisUsage function. 21426199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// 21505ad462d1b8e0486879ecd910c3ff4541bd8604cChris Lattner template<typename AnalysisType> 2163f2577decba715615597352c4b3e2a551d44b64cDevang Patel AnalysisType &getAnalysis() const; // Defined in PassAnalysisSupport.h 21776a8f7fb5a325ab635f55f811803eb3ca034f8faChris Lattner 21876a8f7fb5a325ab635f55f811803eb3ca034f8faChris Lattner template<typename AnalysisType> 2197ab42aec4266ef1b474ae03f3cb94ce509aa94a7Dan Gohman AnalysisType &getAnalysis(Function &F); // Defined in PassAnalysisSupport.h 2206b1df0e863963929634d769f39cbce68f030f051Devang Patel 2216b1df0e863963929634d769f39cbce68f030f051Devang Patel template<typename AnalysisType> 2223f2577decba715615597352c4b3e2a551d44b64cDevang Patel AnalysisType &getAnalysisID(const PassInfo *PI) const; 2238f93b7fc36dbeba428c6dd122c07fe0777baa664Devang Patel 2246b1df0e863963929634d769f39cbce68f030f051Devang Patel template<typename AnalysisType> 2256b1df0e863963929634d769f39cbce68f030f051Devang Patel AnalysisType &getAnalysisID(const PassInfo *PI, Function &F); 226aff5bcebb7fb9880e0a3518a8e7c999e738d531cChris Lattner}; 227aff5bcebb7fb9880e0a3518a8e7c999e738d531cChris Lattner 228aff5bcebb7fb9880e0a3518a8e7c999e738d531cChris Lattner 229b12914bfc0f76a7a48357162d5f4c39a1343e69bChris Lattner//===----------------------------------------------------------------------===// 230b12914bfc0f76a7a48357162d5f4c39a1343e69bChris Lattner/// ModulePass class - This class is used to implement unstructured 231fb215b936df0034f9030e921c0c054ab11470762Misha Brukman/// interprocedural optimizations and analyses. ModulePasses may do anything 232b12914bfc0f76a7a48357162d5f4c39a1343e69bChris Lattner/// they want to the program. 233b12914bfc0f76a7a48357162d5f4c39a1343e69bChris Lattner/// 2341fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass ModulePass : public Pass { 2351fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 236b12914bfc0f76a7a48357162d5f4c39a1343e69bChris Lattner /// runOnModule - Virtual method overriden by subclasses to process the module 237b12914bfc0f76a7a48357162d5f4c39a1343e69bChris Lattner /// being operated on. 238b12914bfc0f76a7a48357162d5f4c39a1343e69bChris Lattner virtual bool runOnModule(Module &M) = 0; 239b12914bfc0f76a7a48357162d5f4c39a1343e69bChris Lattner 240be1ffc6b8d3db7b1a9d512a1d53afd075d8e58c9Devang Patel virtual void assignPassManager(PMStack &PMS, 241bed2946a96ecb15b0b636fa74cb26ce61b1c648eAnton Korobeynikov PassManagerType T = PMT_ModulePassManager); 2428f93b7fc36dbeba428c6dd122c07fe0777baa664Devang Patel 2438f93b7fc36dbeba428c6dd122c07fe0777baa664Devang Patel /// Return what kind of Pass Manager can manage this pass. 244eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman virtual PassManagerType getPotentialPassManagerType() const; 2458f93b7fc36dbeba428c6dd122c07fe0777baa664Devang Patel 246476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner explicit ModulePass(intptr_t pid) : Pass(PT_Module, pid) {} 247476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner explicit ModulePass(const void *pid) : Pass(PT_Module, pid) {} 248c7d0f4be88cc7fa33d51736e0f53d3e00e69efb4Devang Patel // Force out-of-line virtual method. 249c7d0f4be88cc7fa33d51736e0f53d3e00e69efb4Devang Patel virtual ~ModulePass(); 250b12914bfc0f76a7a48357162d5f4c39a1343e69bChris Lattner}; 25170b4f3e05106761e99cc56919767155cad0e2d3aChris Lattner 25270b4f3e05106761e99cc56919767155cad0e2d3aChris Lattner 25370b4f3e05106761e99cc56919767155cad0e2d3aChris Lattner//===----------------------------------------------------------------------===// 25470b4f3e05106761e99cc56919767155cad0e2d3aChris Lattner/// ImmutablePass class - This class is used to provide information that does 25570b4f3e05106761e99cc56919767155cad0e2d3aChris Lattner/// not need to be run. This is useful for things like target information and 25670b4f3e05106761e99cc56919767155cad0e2d3aChris Lattner/// "basic" versions of AnalysisGroups. 25770b4f3e05106761e99cc56919767155cad0e2d3aChris Lattner/// 2581fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerclass ImmutablePass : public ModulePass { 2591fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 260d2c0b28c33ccf7a219f0adfcd348615493fb8e91Chris Lattner /// initializePass - This method may be overriden by immutable passes to allow 261d2c0b28c33ccf7a219f0adfcd348615493fb8e91Chris Lattner /// them to perform various initialization actions they require. This is 262d2c0b28c33ccf7a219f0adfcd348615493fb8e91Chris Lattner /// primarily because an ImmutablePass can "require" another ImmutablePass, 263d2c0b28c33ccf7a219f0adfcd348615493fb8e91Chris Lattner /// and if it does, the overloaded version of initializePass may get access to 264d2c0b28c33ccf7a219f0adfcd348615493fb8e91Chris Lattner /// these passes with getAnalysis<>. 265d2c0b28c33ccf7a219f0adfcd348615493fb8e91Chris Lattner /// 266eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman virtual void initializePass(); 26770b4f3e05106761e99cc56919767155cad0e2d3aChris Lattner 2685e664b8f7c5ba877058a3a1cdfcce8e6b7388a6aChris Lattner virtual ImmutablePass *getAsImmutablePass() { return this; } 2695e664b8f7c5ba877058a3a1cdfcce8e6b7388a6aChris Lattner 270d2c0b28c33ccf7a219f0adfcd348615493fb8e91Chris Lattner /// ImmutablePasses are never run. 271d2c0b28c33ccf7a219f0adfcd348615493fb8e91Chris Lattner /// 27213d57320bd212483463d4f8992d5787b29eda5dfBill Wendling bool runOnModule(Module &) { return false; } 27370b4f3e05106761e99cc56919767155cad0e2d3aChris Lattner 274c758209153ca0f6da6737f25ada269c573fba456Devang Patel explicit ImmutablePass(intptr_t pid) : ModulePass(pid) {} 275c758209153ca0f6da6737f25ada269c573fba456Devang Patel explicit ImmutablePass(const void *pid) 276c758209153ca0f6da6737f25ada269c573fba456Devang Patel : ModulePass(pid) {} 277529ac2f286b89a3f39efb91914897cef7e07b0d6Chris Lattner 278c7d0f4be88cc7fa33d51736e0f53d3e00e69efb4Devang Patel // Force out-of-line virtual method. 279c7d0f4be88cc7fa33d51736e0f53d3e00e69efb4Devang Patel virtual ~ImmutablePass(); 28070b4f3e05106761e99cc56919767155cad0e2d3aChris Lattner}; 28170b4f3e05106761e99cc56919767155cad0e2d3aChris Lattner 282aff5bcebb7fb9880e0a3518a8e7c999e738d531cChris Lattner//===----------------------------------------------------------------------===// 28326199059268a05739c84ebf465fcdbf7ded861dfChris Lattner/// FunctionPass class - This class is used to implement most global 28426199059268a05739c84ebf465fcdbf7ded861dfChris Lattner/// optimizations. Optimizations should subclass this class if they meet the 28526199059268a05739c84ebf465fcdbf7ded861dfChris Lattner/// following constraints: 28626199059268a05739c84ebf465fcdbf7ded861dfChris Lattner/// 2871d06fbe8935f479c0438798f86237d6264ce60d3Misha Brukman/// 1. Optimizations are organized globally, i.e., a function at a time 28826199059268a05739c84ebf465fcdbf7ded861dfChris Lattner/// 2. Optimizing a function does not cause the addition or removal of any 28926199059268a05739c84ebf465fcdbf7ded861dfChris Lattner/// functions in the module 29026199059268a05739c84ebf465fcdbf7ded861dfChris Lattner/// 291a65f5fd21b946c33876d87105974ebcce5d37d0aDevang Patelclass FunctionPass : public Pass { 2921fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerpublic: 293476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner explicit FunctionPass(intptr_t pid) : Pass(PT_Function, pid) {} 294476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner explicit FunctionPass(const void *pid) : Pass(PT_Function, pid) {} 295eae540a037d17d218767f21b6d3b45f395df4619Devang Patel 29626199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// doInitialization - Virtual method overridden by subclasses to do 2975560c9d49ccae132cabf1155f18aa0480dce3edaMisha Brukman /// any necessary per-module initialization. 29826199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// 299eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman virtual bool doInitialization(Module &); 300e922c0201916e0b980ab3cfe91e1413e68d55647Owen Anderson 30126199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// runOnFunction - Virtual method overriden by subclasses to do the 30226199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// per-function processing of the pass. 30326199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// 30418961504fc2b299578dba817900a0696cf3ccc4dChris Lattner virtual bool runOnFunction(Function &F) = 0; 3051bffea0341968b3b2b0106c745d4602b6804e62fChris Lattner 30626199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// doFinalization - Virtual method overriden by subclasses to do any post 30726199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// processing needed after all passes have run. 30826199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// 309eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman virtual bool doFinalization(Module &); 3101bffea0341968b3b2b0106c745d4602b6804e62fChris Lattner 311b12914bfc0f76a7a48357162d5f4c39a1343e69bChris Lattner /// runOnModule - On a module, we run this pass by initializing, 312b12914bfc0f76a7a48357162d5f4c39a1343e69bChris Lattner /// ronOnFunction'ing once for every function in the module, then by 313b12914bfc0f76a7a48357162d5f4c39a1343e69bChris Lattner /// finalizing. 31426199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// 315b12914bfc0f76a7a48357162d5f4c39a1343e69bChris Lattner virtual bool runOnModule(Module &M); 3161bffea0341968b3b2b0106c745d4602b6804e62fChris Lattner 31726199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// run - On a function, we simply initialize, run the function, then 31826199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// finalize. 31926199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// 32018961504fc2b299578dba817900a0696cf3ccc4dChris Lattner bool run(Function &F); 32105ad462d1b8e0486879ecd910c3ff4541bd8604cChris Lattner 322be1ffc6b8d3db7b1a9d512a1d53afd075d8e58c9Devang Patel virtual void assignPassManager(PMStack &PMS, 323bed2946a96ecb15b0b636fa74cb26ce61b1c648eAnton Korobeynikov PassManagerType T = PMT_FunctionPassManager); 3248f93b7fc36dbeba428c6dd122c07fe0777baa664Devang Patel 3258f93b7fc36dbeba428c6dd122c07fe0777baa664Devang Patel /// Return what kind of Pass Manager can manage this pass. 326eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman virtual PassManagerType getPotentialPassManagerType() const; 327aff5bcebb7fb9880e0a3518a8e7c999e738d531cChris Lattner}; 3281bffea0341968b3b2b0106c745d4602b6804e62fChris Lattner 3291bffea0341968b3b2b0106c745d4602b6804e62fChris Lattner 3301bffea0341968b3b2b0106c745d4602b6804e62fChris Lattner 331aff5bcebb7fb9880e0a3518a8e7c999e738d531cChris Lattner//===----------------------------------------------------------------------===// 33226199059268a05739c84ebf465fcdbf7ded861dfChris Lattner/// BasicBlockPass class - This class is used to implement most local 33326199059268a05739c84ebf465fcdbf7ded861dfChris Lattner/// optimizations. Optimizations should subclass this class if they 33426199059268a05739c84ebf465fcdbf7ded861dfChris Lattner/// meet the following constraints: 33526199059268a05739c84ebf465fcdbf7ded861dfChris Lattner/// 1. Optimizations are local, operating on either a basic block or 33626199059268a05739c84ebf465fcdbf7ded861dfChris Lattner/// instruction at a time. 33726199059268a05739c84ebf465fcdbf7ded861dfChris Lattner/// 2. Optimizations do not modify the CFG of the contained function, or any 33826199059268a05739c84ebf465fcdbf7ded861dfChris Lattner/// other basic block in the function. 339fb215b936df0034f9030e921c0c054ab11470762Misha Brukman/// 3. Optimizations conform to all of the constraints of FunctionPasses. 34026199059268a05739c84ebf465fcdbf7ded861dfChris Lattner/// 3414d447f512122a8c3784f4ab2c55b4b1be47db82eDevang Patelclass BasicBlockPass : public Pass { 34262281a132f11e742a96ff9caeaaaa17900020acdJeff Cohenpublic: 343476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner explicit BasicBlockPass(intptr_t pid) : Pass(PT_BasicBlock, pid) {} 344476e9bd1146624fa17243ae55fdb156f905ba3d4Chris Lattner explicit BasicBlockPass(const void *pid) : Pass(PT_BasicBlock, pid) {} 345eae540a037d17d218767f21b6d3b45f395df4619Devang Patel 346d0713f94af4d2dbd97ab251a43e3d290a13e860eChris Lattner /// doInitialization - Virtual method overridden by subclasses to do 3475560c9d49ccae132cabf1155f18aa0480dce3edaMisha Brukman /// any necessary per-module initialization. 348d0713f94af4d2dbd97ab251a43e3d290a13e860eChris Lattner /// 349eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman virtual bool doInitialization(Module &); 350d0713f94af4d2dbd97ab251a43e3d290a13e860eChris Lattner 351d0713f94af4d2dbd97ab251a43e3d290a13e860eChris Lattner /// doInitialization - Virtual method overridden by BasicBlockPass subclasses 3525560c9d49ccae132cabf1155f18aa0480dce3edaMisha Brukman /// to do any necessary per-function initialization. 353d0713f94af4d2dbd97ab251a43e3d290a13e860eChris Lattner /// 354eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman virtual bool doInitialization(Function &); 355d0713f94af4d2dbd97ab251a43e3d290a13e860eChris Lattner 35626199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// runOnBasicBlock - Virtual method overriden by subclasses to do the 35726199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// per-basicblock processing of the pass. 35826199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// 35918961504fc2b299578dba817900a0696cf3ccc4dChris Lattner virtual bool runOnBasicBlock(BasicBlock &BB) = 0; 3601bffea0341968b3b2b0106c745d4602b6804e62fChris Lattner 361d0713f94af4d2dbd97ab251a43e3d290a13e860eChris Lattner /// doFinalization - Virtual method overriden by BasicBlockPass subclasses to 362d0713f94af4d2dbd97ab251a43e3d290a13e860eChris Lattner /// do any post processing needed after all passes have run. 36326199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// 364eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman virtual bool doFinalization(Function &); 365d0713f94af4d2dbd97ab251a43e3d290a13e860eChris Lattner 366d0713f94af4d2dbd97ab251a43e3d290a13e860eChris Lattner /// doFinalization - Virtual method overriden by subclasses to do any post 367d0713f94af4d2dbd97ab251a43e3d290a13e860eChris Lattner /// processing needed after all passes have run. 368d0713f94af4d2dbd97ab251a43e3d290a13e860eChris Lattner /// 369eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman virtual bool doFinalization(Module &); 370d0713f94af4d2dbd97ab251a43e3d290a13e860eChris Lattner 371d0713f94af4d2dbd97ab251a43e3d290a13e860eChris Lattner 372d0713f94af4d2dbd97ab251a43e3d290a13e860eChris Lattner // To run this pass on a function, we simply call runOnBasicBlock once for 373d0713f94af4d2dbd97ab251a43e3d290a13e860eChris Lattner // each function. 374d0713f94af4d2dbd97ab251a43e3d290a13e860eChris Lattner // 375d0713f94af4d2dbd97ab251a43e3d290a13e860eChris Lattner bool runOnFunction(Function &F); 376aff5bcebb7fb9880e0a3518a8e7c999e738d531cChris Lattner 377be1ffc6b8d3db7b1a9d512a1d53afd075d8e58c9Devang Patel virtual void assignPassManager(PMStack &PMS, 378bed2946a96ecb15b0b636fa74cb26ce61b1c648eAnton Korobeynikov PassManagerType T = PMT_BasicBlockPassManager); 3798f93b7fc36dbeba428c6dd122c07fe0777baa664Devang Patel 3808f93b7fc36dbeba428c6dd122c07fe0777baa664Devang Patel /// Return what kind of Pass Manager can manage this pass. 381eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman virtual PassManagerType getPotentialPassManagerType() const; 38225919cb7802f2682b159a040ba07c5bd12b54efaDevang Patel}; 38325919cb7802f2682b159a040ba07c5bd12b54efaDevang Patel 3841f079267dc8281f9cb92b23910de621b3387265aReid Spencer/// If the user specifies the -time-passes argument on an LLVM tool command line 3851f079267dc8281f9cb92b23910de621b3387265aReid Spencer/// then the value of this boolean will be true, otherwise false. 3861f079267dc8281f9cb92b23910de621b3387265aReid Spencer/// @brief This is the storage for the -time-passes option. 3871f079267dc8281f9cb92b23910de621b3387265aReid Spencerextern bool TimePassesIsEnabled; 3881f079267dc8281f9cb92b23910de621b3387265aReid Spencer 389d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 390d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 3914c76fc048bb9a3c5f760a50ea114f0605b9561d9Chris Lattner// Include support files that contain important APIs commonly used by Passes, 3921d06fbe8935f479c0438798f86237d6264ce60d3Misha Brukman// but that we want to separate out to make it easier to read the header files. 393f57b845547302d24ecb6a9e79d7bc386f761a6c9Chris Lattner// 3944c76fc048bb9a3c5f760a50ea114f0605b9561d9Chris Lattner#include "llvm/PassSupport.h" 3954c76fc048bb9a3c5f760a50ea114f0605b9561d9Chris Lattner#include "llvm/PassAnalysisSupport.h" 39605ad462d1b8e0486879ecd910c3ff4541bd8604cChris Lattner 3971bffea0341968b3b2b0106c745d4602b6804e62fChris Lattner#endif 398