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