blob: 20c36c1ea560e7a763cb4952b45b307a49e36fb0 [file] [log] [blame]
Chris Lattner3e58d9b2003-10-13 05:33:01 +00001//===- Pass.cpp - LLVM Pass Infrastructure Implementation -----------------===//
Misha Brukmanfd939082005-04-21 23:48:37 +00002//
John Criswellb576c942003-10-20 19:43:21 +00003// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Misha Brukmanfd939082005-04-21 23:48:37 +00007//
John Criswellb576c942003-10-20 19:43:21 +00008//===----------------------------------------------------------------------===//
Chris Lattnerd6953282002-01-21 07:37:31 +00009//
10// This file implements the LLVM Pass infrastructure. It is primarily
11// responsible with ensuring that passes are executed and batched together
12// optimally.
13//
14//===----------------------------------------------------------------------===//
15
Chris Lattner41300862002-01-31 00:45:31 +000016#include "llvm/PassManager.h"
17#include "llvm/Module.h"
Misha Brukman69c856a2003-10-14 21:38:42 +000018#include "llvm/ModuleProvider.h"
Reid Spencer551ccae2004-09-01 22:55:40 +000019#include "llvm/ADT/STLExtras.h"
Chris Lattnerbaf2ecd2006-12-01 23:27:45 +000020#include "llvm/Support/ManagedStatic.h"
Jeff Cohenca5183d2007-03-05 00:00:42 +000021#include <algorithm>
Chris Lattner789bc842002-08-21 22:17:09 +000022#include <set>
Chris Lattner31f84992003-11-21 20:23:48 +000023using namespace llvm;
Brian Gaeked0fde302003-11-11 22:41:34 +000024
Chris Lattner27ad1372002-05-06 19:31:52 +000025//===----------------------------------------------------------------------===//
Chris Lattner41300862002-01-31 00:45:31 +000026// Pass Implementation
Chris Lattner35f07eb2002-01-22 00:17:48 +000027//
Chris Lattner41300862002-01-31 00:45:31 +000028
Devang Patelc7d0f4b2006-12-22 22:49:00 +000029// Force out-of-line virtual method.
Devang Patel6e21ff02007-04-26 21:33:42 +000030Pass::~Pass() {
31 delete Resolver;
32}
33
34// Force out-of-line virtual method.
Devang Patelc7d0f4b2006-12-22 22:49:00 +000035ModulePass::~ModulePass() { }
Chris Lattnerd6953282002-01-21 07:37:31 +000036
Chris Lattnerf1ab4542003-03-21 21:41:02 +000037bool Pass::mustPreserveAnalysisID(const PassInfo *AnalysisID) const {
Devang Patelcde53d32007-01-05 22:47:07 +000038 return Resolver->getAnalysisToUpdate(AnalysisID, true) != 0;
Chris Lattnerf1ab4542003-03-21 21:41:02 +000039}
40
Chris Lattner37d66c42002-07-30 16:27:02 +000041// dumpPassStructure - Implement the -debug-passes=Structure option
42void Pass::dumpPassStructure(unsigned Offset) {
Bill Wendling832171c2006-12-07 20:04:42 +000043 cerr << std::string(Offset*2, ' ') << getPassName() << "\n";
Chris Lattner37d66c42002-07-30 16:27:02 +000044}
Chris Lattner96c466b2002-04-29 14:57:45 +000045
Brian Gaekef822ee92004-02-28 21:55:18 +000046// getPassName - Use C++ RTTI to get a SOMEWHAT intelligible name for the pass.
Chris Lattner96c466b2002-04-29 14:57:45 +000047//
Chris Lattner44050fb2002-07-29 21:02:31 +000048const char *Pass::getPassName() const {
49 if (const PassInfo *PI = getPassInfo())
50 return PI->getPassName();
Chris Lattnerfe3e3f42007-10-18 16:11:18 +000051 return "Unnamed pass: implement Pass::getPassName()";
Chris Lattner44050fb2002-07-29 21:02:31 +000052}
Chris Lattner96c466b2002-04-29 14:57:45 +000053
Misha Brukman69c856a2003-10-14 21:38:42 +000054// print - Print out the internal state of the pass. This is called by Analyze
Misha Brukman5560c9d2003-08-18 14:43:39 +000055// to print out the contents of an analysis. Otherwise it is not necessary to
Chris Lattnera59cbb22002-07-27 01:12:17 +000056// implement this method.
57//
Reid Spencerce9653c2004-12-07 04:03:45 +000058void Pass::print(std::ostream &O,const Module*) const {
Chris Lattnera59cbb22002-07-27 01:12:17 +000059 O << "Pass::print not implemented for pass: '" << getPassName() << "'!\n";
60}
61
Bill Wendling832171c2006-12-07 20:04:42 +000062// dump - call print(cerr);
Chris Lattnera59cbb22002-07-27 01:12:17 +000063void Pass::dump() const {
Bill Wendling832171c2006-12-07 20:04:42 +000064 print(*cerr.stream(), 0);
Chris Lattnera59cbb22002-07-27 01:12:17 +000065}
66
Chris Lattner41300862002-01-31 00:45:31 +000067//===----------------------------------------------------------------------===//
Chris Lattner70b4f3e2002-09-25 21:59:11 +000068// ImmutablePass Implementation
69//
Devang Patelc7d0f4b2006-12-22 22:49:00 +000070// Force out-of-line virtual method.
71ImmutablePass::~ImmutablePass() { }
Chris Lattner70b4f3e2002-09-25 21:59:11 +000072
73//===----------------------------------------------------------------------===//
Chris Lattnerf57b8452002-04-27 06:56:12 +000074// FunctionPass Implementation
Chris Lattnerd6953282002-01-21 07:37:31 +000075//
Chris Lattner41300862002-01-31 00:45:31 +000076
Chris Lattnerf57b8452002-04-27 06:56:12 +000077// run - On a module, we run this pass by initializing, runOnFunction'ing once
78// for every function in the module, then by finalizing.
Chris Lattner41300862002-01-31 00:45:31 +000079//
Chris Lattnerbba61c02004-09-20 04:47:19 +000080bool FunctionPass::runOnModule(Module &M) {
Chris Lattner41300862002-01-31 00:45:31 +000081 bool Changed = doInitialization(M);
Misha Brukmanfd939082005-04-21 23:48:37 +000082
Chris Lattner7e708292002-06-25 16:13:24 +000083 for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
Reid Spencer5cbf9852007-01-30 20:08:39 +000084 if (!I->isDeclaration()) // Passes are not run on external functions!
Chris Lattnerf57b8452002-04-27 06:56:12 +000085 Changed |= runOnFunction(*I);
Misha Brukmanfd939082005-04-21 23:48:37 +000086
Chris Lattner41300862002-01-31 00:45:31 +000087 return Changed | doFinalization(M);
Chris Lattnerd6953282002-01-21 07:37:31 +000088}
89
Chris Lattnerf57b8452002-04-27 06:56:12 +000090// run - On a function, we simply initialize, run the function, then finalize.
Chris Lattner41300862002-01-31 00:45:31 +000091//
Chris Lattner7e708292002-06-25 16:13:24 +000092bool FunctionPass::run(Function &F) {
Reid Spencer5cbf9852007-01-30 20:08:39 +000093 if (F.isDeclaration()) return false;// Passes are not run on external functions!
Chris Lattner41300862002-01-31 00:45:31 +000094
Chris Lattnerbba61c02004-09-20 04:47:19 +000095 bool Changed = doInitialization(*F.getParent());
96 Changed |= runOnFunction(F);
97 return Changed | doFinalization(*F.getParent());
Chris Lattnerd6953282002-01-21 07:37:31 +000098}
Chris Lattnere2120622002-01-23 05:49:41 +000099
Chris Lattner41300862002-01-31 00:45:31 +0000100//===----------------------------------------------------------------------===//
101// BasicBlockPass Implementation
102//
103
Chris Lattnerf57b8452002-04-27 06:56:12 +0000104// To run this pass on a function, we simply call runOnBasicBlock once for each
105// function.
Chris Lattner41300862002-01-31 00:45:31 +0000106//
Chris Lattner7e708292002-06-25 16:13:24 +0000107bool BasicBlockPass::runOnFunction(Function &F) {
Chris Lattnere0a54f82002-09-12 17:06:40 +0000108 bool Changed = doInitialization(F);
Chris Lattner7e708292002-06-25 16:13:24 +0000109 for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I)
Chris Lattner41300862002-01-31 00:45:31 +0000110 Changed |= runOnBasicBlock(*I);
Chris Lattnere0a54f82002-09-12 17:06:40 +0000111 return Changed | doFinalization(F);
Chris Lattner41300862002-01-31 00:45:31 +0000112}
113
114// To run directly on the basic block, we initialize, runOnBasicBlock, then
115// finalize.
116//
Chris Lattnerbba61c02004-09-20 04:47:19 +0000117bool BasicBlockPass::runPass(BasicBlock &BB) {
Chris Lattnere0a54f82002-09-12 17:06:40 +0000118 Function &F = *BB.getParent();
119 Module &M = *F.getParent();
Chris Lattnerbba61c02004-09-20 04:47:19 +0000120 bool Changed = doInitialization(M);
121 Changed |= doInitialization(F);
122 Changed |= runOnBasicBlock(BB);
123 Changed |= doFinalization(F);
124 Changed |= doFinalization(M);
125 return Changed;
Chris Lattner41300862002-01-31 00:45:31 +0000126}
127
Chris Lattner54bbdb42002-07-23 18:08:00 +0000128//===----------------------------------------------------------------------===//
129// Pass Registration mechanism
130//
Chris Lattneree740832006-12-01 23:46:50 +0000131namespace {
Chris Lattnerbaf2ecd2006-12-01 23:27:45 +0000132class PassRegistrar {
Chris Lattneree740832006-12-01 23:46:50 +0000133 /// PassInfoMap - Keep track of the passinfo object for each registered llvm
134 /// pass.
Devang Pateleae540a2007-05-02 20:38:25 +0000135 std::map<intptr_t, PassInfo*> PassInfoMap;
Chris Lattneree740832006-12-01 23:46:50 +0000136
137 /// AnalysisGroupInfo - Keep track of information for each analysis group.
138 struct AnalysisGroupInfo {
139 const PassInfo *DefaultImpl;
140 std::set<const PassInfo *> Implementations;
141 AnalysisGroupInfo() : DefaultImpl(0) {}
142 };
143
144 /// AnalysisGroupInfoMap - Information for each analysis group.
145 std::map<const PassInfo *, AnalysisGroupInfo> AnalysisGroupInfoMap;
146
Chris Lattnerbaf2ecd2006-12-01 23:27:45 +0000147public:
148
Devang Pateleae540a2007-05-02 20:38:25 +0000149 const PassInfo *GetPassInfo(intptr_t TI) const {
150 std::map<intptr_t, PassInfo*>::const_iterator I = PassInfoMap.find(TI);
Chris Lattnerbaf2ecd2006-12-01 23:27:45 +0000151 return I != PassInfoMap.end() ? I->second : 0;
152 }
153
154 void RegisterPass(PassInfo &PI) {
155 bool Inserted =
Devang Pateleae540a2007-05-02 20:38:25 +0000156 PassInfoMap.insert(std::make_pair(PI.getTypeInfo(),&PI)).second;
Chris Lattner80d692b2007-05-02 04:25:31 +0000157 assert(Inserted && "Pass registered multiple times!");
Chris Lattnerbaf2ecd2006-12-01 23:27:45 +0000158 }
159
160 void UnregisterPass(PassInfo &PI) {
Devang Pateleae540a2007-05-02 20:38:25 +0000161 std::map<intptr_t, PassInfo*>::iterator I =
Chris Lattnerbaf2ecd2006-12-01 23:27:45 +0000162 PassInfoMap.find(PI.getTypeInfo());
163 assert(I != PassInfoMap.end() && "Pass registered but not in map!");
164
165 // Remove pass from the map.
166 PassInfoMap.erase(I);
167 }
168
169 void EnumerateWith(PassRegistrationListener *L) {
Devang Pateleae540a2007-05-02 20:38:25 +0000170 for (std::map<intptr_t, PassInfo*>::const_iterator I = PassInfoMap.begin(),
Chris Lattnerbaf2ecd2006-12-01 23:27:45 +0000171 E = PassInfoMap.end(); I != E; ++I)
172 L->passEnumerate(I->second);
173 }
Chris Lattneree740832006-12-01 23:46:50 +0000174
175
176 /// Analysis Group Mechanisms.
177 void RegisterAnalysisGroup(PassInfo *InterfaceInfo,
178 const PassInfo *ImplementationInfo,
179 bool isDefault) {
180 AnalysisGroupInfo &AGI = AnalysisGroupInfoMap[InterfaceInfo];
181 assert(AGI.Implementations.count(ImplementationInfo) == 0 &&
182 "Cannot add a pass to the same analysis group more than once!");
183 AGI.Implementations.insert(ImplementationInfo);
184 if (isDefault) {
185 assert(AGI.DefaultImpl == 0 && InterfaceInfo->getNormalCtor() == 0 &&
186 "Default implementation for analysis group already specified!");
187 assert(ImplementationInfo->getNormalCtor() &&
188 "Cannot specify pass as default if it does not have a default ctor");
189 AGI.DefaultImpl = ImplementationInfo;
190 InterfaceInfo->setNormalCtor(ImplementationInfo->getNormalCtor());
191 }
192 }
Chris Lattnerbaf2ecd2006-12-01 23:27:45 +0000193};
Chris Lattneree740832006-12-01 23:46:50 +0000194}
Chris Lattnerbaf2ecd2006-12-01 23:27:45 +0000195
Chris Lattner54bbdb42002-07-23 18:08:00 +0000196static std::vector<PassRegistrationListener*> *Listeners = 0;
197
Chris Lattnerd1458f12007-04-21 00:12:18 +0000198// FIXME: This should use ManagedStatic to manage the pass registrar.
199// Unfortunately, we can't do this, because passes are registered with static
200// ctors, and having llvm_shutdown clear this map prevents successful
201// ressurection after llvm_shutdown is run.
202static PassRegistrar *getPassRegistrar() {
203 static PassRegistrar *PassRegistrarObj = 0;
204 if (!PassRegistrarObj)
205 PassRegistrarObj = new PassRegistrar();
206 return PassRegistrarObj;
207}
208
Chris Lattner54bbdb42002-07-23 18:08:00 +0000209// getPassInfo - Return the PassInfo data structure that corresponds to this
210// pass...
211const PassInfo *Pass::getPassInfo() const {
Devang Pateleae540a2007-05-02 20:38:25 +0000212 return lookupPassInfo(PassID);
Chris Lattnerfb30fda2002-08-21 17:08:37 +0000213}
214
Devang Pateleae540a2007-05-02 20:38:25 +0000215const PassInfo *Pass::lookupPassInfo(intptr_t TI) {
Chris Lattnerd1458f12007-04-21 00:12:18 +0000216 return getPassRegistrar()->GetPassInfo(TI);
Chris Lattner54bbdb42002-07-23 18:08:00 +0000217}
218
Chris Lattner1ac2d512006-01-23 01:01:04 +0000219void RegisterPassBase::registerPass() {
Chris Lattnerd1458f12007-04-21 00:12:18 +0000220 getPassRegistrar()->RegisterPass(PIObj);
Chris Lattner54bbdb42002-07-23 18:08:00 +0000221
Chris Lattnerbaf2ecd2006-12-01 23:27:45 +0000222 // Notify any listeners.
Chris Lattner54bbdb42002-07-23 18:08:00 +0000223 if (Listeners)
224 for (std::vector<PassRegistrationListener*>::iterator
225 I = Listeners->begin(), E = Listeners->end(); I != E; ++I)
Chris Lattner1ac2d512006-01-23 01:01:04 +0000226 (*I)->passRegistered(&PIObj);
Chris Lattner54bbdb42002-07-23 18:08:00 +0000227}
228
Chris Lattner1ac2d512006-01-23 01:01:04 +0000229void RegisterPassBase::unregisterPass() {
Chris Lattnerd1458f12007-04-21 00:12:18 +0000230 getPassRegistrar()->UnregisterPass(PIObj);
Chris Lattner54bbdb42002-07-23 18:08:00 +0000231}
232
Chris Lattner789bc842002-08-21 22:17:09 +0000233//===----------------------------------------------------------------------===//
234// Analysis Group Implementation Code
235//===----------------------------------------------------------------------===//
236
Chris Lattner789bc842002-08-21 22:17:09 +0000237// RegisterAGBase implementation
238//
Devang Pateleae540a2007-05-02 20:38:25 +0000239RegisterAGBase::RegisterAGBase(intptr_t InterfaceID,
240 intptr_t PassID, bool isDefault)
241 : RegisterPassBase(InterfaceID),
Chris Lattner1ac2d512006-01-23 01:01:04 +0000242 ImplementationInfo(0), isDefaultImplementation(isDefault) {
Chris Lattner789bc842002-08-21 22:17:09 +0000243
Devang Pateleae540a2007-05-02 20:38:25 +0000244 InterfaceInfo = const_cast<PassInfo*>(Pass::lookupPassInfo(InterfaceID));
Chris Lattner1ac2d512006-01-23 01:01:04 +0000245 if (InterfaceInfo == 0) {
246 // First reference to Interface, register it now.
247 registerPass();
248 InterfaceInfo = &PIObj;
Chris Lattner789bc842002-08-21 22:17:09 +0000249 }
Chris Lattner2dd3d422006-08-27 22:21:55 +0000250 assert(PIObj.isAnalysisGroup() &&
Chris Lattner789bc842002-08-21 22:17:09 +0000251 "Trying to join an analysis group that is a normal pass!");
252
Devang Pateleae540a2007-05-02 20:38:25 +0000253 if (PassID) {
254 ImplementationInfo = Pass::lookupPassInfo(PassID);
Chris Lattner789bc842002-08-21 22:17:09 +0000255 assert(ImplementationInfo &&
256 "Must register pass before adding to AnalysisGroup!");
257
Chris Lattner1c28b422002-08-30 20:23:45 +0000258 // Make sure we keep track of the fact that the implementation implements
259 // the interface.
260 PassInfo *IIPI = const_cast<PassInfo*>(ImplementationInfo);
261 IIPI->addInterfaceImplemented(InterfaceInfo);
Chris Lattneree740832006-12-01 23:46:50 +0000262
Chris Lattnerd1458f12007-04-21 00:12:18 +0000263 getPassRegistrar()->RegisterAnalysisGroup(InterfaceInfo, IIPI, isDefault);
Chris Lattner789bc842002-08-21 22:17:09 +0000264 }
265}
266
267void RegisterAGBase::setGroupName(const char *Name) {
268 assert(InterfaceInfo->getPassName()[0] == 0 && "Interface Name already set!");
269 InterfaceInfo->setPassName(Name);
270}
271
Chris Lattner789bc842002-08-21 22:17:09 +0000272
Chris Lattner54bbdb42002-07-23 18:08:00 +0000273//===----------------------------------------------------------------------===//
274// PassRegistrationListener implementation
275//
276
277// PassRegistrationListener ctor - Add the current object to the list of
278// PassRegistrationListeners...
279PassRegistrationListener::PassRegistrationListener() {
280 if (!Listeners) Listeners = new std::vector<PassRegistrationListener*>();
281 Listeners->push_back(this);
282}
283
284// dtor - Remove object from list of listeners...
285PassRegistrationListener::~PassRegistrationListener() {
286 std::vector<PassRegistrationListener*>::iterator I =
287 std::find(Listeners->begin(), Listeners->end(), this);
288 assert(Listeners && I != Listeners->end() &&
289 "PassRegistrationListener not registered!");
290 Listeners->erase(I);
291
292 if (Listeners->empty()) {
293 delete Listeners;
294 Listeners = 0;
295 }
296}
297
298// enumeratePasses - Iterate over the registered passes, calling the
299// passEnumerate callback on each PassInfo object.
300//
301void PassRegistrationListener::enumeratePasses() {
Chris Lattnerd1458f12007-04-21 00:12:18 +0000302 getPassRegistrar()->EnumerateWith(this);
Chris Lattner54bbdb42002-07-23 18:08:00 +0000303}
Reid Spencere8f38482005-04-25 01:01:35 +0000304
Chris Lattner947c7682006-12-01 22:21:11 +0000305//===----------------------------------------------------------------------===//
306// AnalysisUsage Class Implementation
307//
308
Chris Lattnerbaf2ecd2006-12-01 23:27:45 +0000309namespace {
310 struct GetCFGOnlyPasses : public PassRegistrationListener {
311 std::vector<AnalysisID> &CFGOnlyList;
312 GetCFGOnlyPasses(std::vector<AnalysisID> &L) : CFGOnlyList(L) {}
313
314 void passEnumerate(const PassInfo *P) {
315 if (P->isCFGOnlyPass())
316 CFGOnlyList.push_back(P);
317 }
318 };
319}
320
Chris Lattner947c7682006-12-01 22:21:11 +0000321// setPreservesCFG - This function should be called to by the pass, iff they do
322// not:
323//
324// 1. Add or remove basic blocks from the function
325// 2. Modify terminator instructions in any way.
326//
327// This function annotates the AnalysisUsage info object to say that analyses
328// that only depend on the CFG are preserved by this pass.
329//
330void AnalysisUsage::setPreservesCFG() {
331 // Since this transformation doesn't modify the CFG, it preserves all analyses
332 // that only depend on the CFG (like dominators, loop info, etc...)
Chris Lattnerbaf2ecd2006-12-01 23:27:45 +0000333 GetCFGOnlyPasses(Preserved).enumeratePasses();
Chris Lattner947c7682006-12-01 22:21:11 +0000334}
335
336