remove CallGraphNode::replaceCallSite, it is redundant with other APIs.
[oota-llvm.git] / lib / Analysis / IPA / CallGraphSCCPass.cpp
1 //===- CallGraphSCCPass.cpp - Pass that operates BU on call graph ---------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements the CallGraphSCCPass class, which is used for passes
11 // which are implemented as bottom-up traversals on the call graph.  Because
12 // there may be cycles in the call graph, passes of this type operate on the
13 // call-graph in SCC order: that is, they process function bottom-up, except for
14 // recursive functions, which they process all at once.
15 //
16 //===----------------------------------------------------------------------===//
17
18 #define DEBUG_TYPE "cgscc-passmgr"
19 #include "llvm/CallGraphSCCPass.h"
20 #include "llvm/Analysis/CallGraph.h"
21 #include "llvm/ADT/SCCIterator.h"
22 #include "llvm/PassManagers.h"
23 #include "llvm/Function.h"
24 #include "llvm/Support/Debug.h"
25 #include "llvm/Support/raw_ostream.h"
26 using namespace llvm;
27
28 //===----------------------------------------------------------------------===//
29 // CGPassManager
30 //
31 /// CGPassManager manages FPPassManagers and CalLGraphSCCPasses.
32
33 namespace {
34
35 class CGPassManager : public ModulePass, public PMDataManager {
36 public:
37   static char ID;
38   explicit CGPassManager(int Depth) 
39     : ModulePass(&ID), PMDataManager(Depth) { }
40
41   /// run - Execute all of the passes scheduled for execution.  Keep track of
42   /// whether any of the passes modifies the module, and if so, return true.
43   bool runOnModule(Module &M);
44
45   bool doInitialization(CallGraph &CG);
46   bool doFinalization(CallGraph &CG);
47
48   /// Pass Manager itself does not invalidate any analysis info.
49   void getAnalysisUsage(AnalysisUsage &Info) const {
50     // CGPassManager walks SCC and it needs CallGraph.
51     Info.addRequired<CallGraph>();
52     Info.setPreservesAll();
53   }
54
55   virtual const char *getPassName() const {
56     return "CallGraph Pass Manager";
57   }
58
59   // Print passes managed by this manager
60   void dumpPassStructure(unsigned Offset) {
61     errs().indent(Offset*2) << "Call Graph SCC Pass Manager\n";
62     for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {
63       Pass *P = getContainedPass(Index);
64       P->dumpPassStructure(Offset + 1);
65       dumpLastUses(P, Offset+1);
66     }
67   }
68
69   Pass *getContainedPass(unsigned N) {
70     assert(N < PassVector.size() && "Pass number out of range!");
71     return static_cast<Pass *>(PassVector[N]);
72   }
73
74   virtual PassManagerType getPassManagerType() const { 
75     return PMT_CallGraphPassManager; 
76   }
77   
78 private:
79   bool RunPassOnSCC(Pass *P, std::vector<CallGraphNode*> &CurSCC,
80                     CallGraph &CG, bool &CallGraphUpToDate);
81   void RefreshCallGraph(std::vector<CallGraphNode*> &CurSCC, CallGraph &CG,
82                         bool IsCheckingMode);
83 };
84
85 } // end anonymous namespace.
86
87 char CGPassManager::ID = 0;
88
89 bool CGPassManager::RunPassOnSCC(Pass *P, std::vector<CallGraphNode*> &CurSCC,
90                                  CallGraph &CG, bool &CallGraphUpToDate) {
91   bool Changed = false;
92   if (CallGraphSCCPass *CGSP = dynamic_cast<CallGraphSCCPass*>(P)) {
93     if (!CallGraphUpToDate) {
94       RefreshCallGraph(CurSCC, CG, false);
95       CallGraphUpToDate = true;
96     }
97     
98     StartPassTimer(P);
99     Changed = CGSP->runOnSCC(CurSCC);
100     StopPassTimer(P);
101     
102     // After the CGSCCPass is done, when assertions are enabled, use
103     // RefreshCallGraph to verify that the callgraph was correctly updated.
104 #ifndef NDEBUG
105     if (Changed)
106       RefreshCallGraph(CurSCC, CG, true);
107 #endif
108     
109     return Changed;
110   }
111   
112   StartPassTimer(P);
113   FPPassManager *FPP = dynamic_cast<FPPassManager *>(P);
114   assert(FPP && "Invalid CGPassManager member");
115   
116   // Run pass P on all functions in the current SCC.
117   for (unsigned i = 0, e = CurSCC.size(); i != e; ++i) {
118     if (Function *F = CurSCC[i]->getFunction()) {
119       dumpPassInfo(P, EXECUTION_MSG, ON_FUNCTION_MSG, F->getName());
120       Changed |= FPP->runOnFunction(*F);
121     }
122   }
123   StopPassTimer(P);
124   
125   // The function pass(es) modified the IR, they may have clobbered the
126   // callgraph.
127   if (Changed && CallGraphUpToDate) {
128     DEBUG(errs() << "CGSCCPASSMGR: Pass Dirtied SCC: "
129                  << P->getPassName() << '\n');
130     CallGraphUpToDate = false;
131   }
132   return Changed;
133 }
134
135
136 /// RefreshCallGraph - Scan the functions in the specified CFG and resync the
137 /// callgraph with the call sites found in it.  This is used after
138 /// FunctionPasses have potentially munged the callgraph, and can be used after
139 /// CallGraphSCC passes to verify that they correctly updated the callgraph.
140 ///
141 void CGPassManager::RefreshCallGraph(std::vector<CallGraphNode*> &CurSCC,
142                                      CallGraph &CG, bool CheckingMode) {
143   DenseMap<Value*, CallGraphNode*> CallSites;
144   
145   DEBUG(errs() << "CGSCCPASSMGR: Refreshing SCC with " << CurSCC.size()
146                << " nodes:\n";
147         for (unsigned i = 0, e = CurSCC.size(); i != e; ++i)
148           CurSCC[i]->dump();
149         );
150
151   bool MadeChange = false;
152   
153   // Scan all functions in the SCC.
154   for (unsigned sccidx = 0, e = CurSCC.size(); sccidx != e; ++sccidx) {
155     CallGraphNode *CGN = CurSCC[sccidx];
156     Function *F = CGN->getFunction();
157     if (F == 0 || F->isDeclaration()) continue;
158     
159     // Walk the function body looking for call sites.  Sync up the call sites in
160     // CGN with those actually in the function.
161     
162     // Get the set of call sites currently in the function.
163     for (CallGraphNode::iterator I = CGN->begin(), E = CGN->end(); I != E; ){
164       // If this call site is null, then the function pass deleted the call
165       // entirely and the WeakVH nulled it out.  
166       if (I->first == 0 ||
167           // If we've already seen this call site, then the FunctionPass RAUW'd
168           // one call with another, which resulted in two "uses" in the edge
169           // list of the same call.
170           CallSites.count(I->first) ||
171
172           // If the call edge is not from a call or invoke, then the function
173           // pass RAUW'd a call with another value.  This can happen when
174           // constant folding happens of well known functions etc.
175           CallSite::get(I->first).getInstruction() == 0) {
176         assert(!CheckingMode &&
177                "CallGraphSCCPass did not update the CallGraph correctly!");
178         
179         // Just remove the edge from the set of callees.
180         CGN->removeCallEdge(I);
181         E = CGN->end();
182         continue;
183       }
184       
185       assert(!CallSites.count(I->first) &&
186              "Call site occurs in node multiple times");
187       CallSites.insert(std::make_pair(I->first, I->second));
188       ++I;
189     }
190     
191     // Loop over all of the instructions in the function, getting the callsites.
192     for (Function::iterator BB = F->begin(), E = F->end(); BB != E; ++BB)
193       for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) {
194         CallSite CS = CallSite::get(I);
195         if (!CS.getInstruction()) continue;
196         
197         // If this call site already existed in the callgraph, just verify it
198         // matches up to expectations and remove it from CallSites.
199         DenseMap<Value*, CallGraphNode*>::iterator ExistingIt =
200           CallSites.find(CS.getInstruction());
201         if (ExistingIt != CallSites.end()) {
202           CallGraphNode *ExistingNode = ExistingIt->second;
203
204           // Remove from CallSites since we have now seen it.
205           CallSites.erase(ExistingIt);
206           
207           // Verify that the callee is right.
208           if (ExistingNode->getFunction() == CS.getCalledFunction())
209             continue;
210           
211           // If we are in checking mode, we are not allowed to actually mutate
212           // the callgraph.  If this is a case where we can infer that the
213           // callgraph is less precise than it could be (e.g. an indirect call
214           // site could be turned direct), don't reject it in checking mode, and
215           // don't tweak it to be more precise.
216           if (CheckingMode && CS.getCalledFunction() &&
217               ExistingNode->getFunction() == 0)
218             continue;
219           
220           assert(!CheckingMode &&
221                  "CallGraphSCCPass did not update the CallGraph correctly!");
222           
223           // If not, we either went from a direct call to indirect, indirect to
224           // direct, or direct to different direct.
225           CallGraphNode *CalleeNode;
226           if (Function *Callee = CS.getCalledFunction())
227             CalleeNode = CG.getOrInsertFunction(Callee);
228           else
229             CalleeNode = CG.getCallsExternalNode();
230           
231           ExistingIt->second = CalleeNode;
232           MadeChange = true;
233           continue;
234         }
235         
236         assert(!CheckingMode &&
237                "CallGraphSCCPass did not update the CallGraph correctly!");
238
239         // If the call site didn't exist in the CGN yet, add it.  We assume that
240         // newly introduced call sites won't be indirect.  This could be fixed
241         // in the future.
242         CallGraphNode *CalleeNode;
243         if (Function *Callee = CS.getCalledFunction())
244           CalleeNode = CG.getOrInsertFunction(Callee);
245         else
246           CalleeNode = CG.getCallsExternalNode();
247         
248         CGN->addCalledFunction(CS, CalleeNode);
249         MadeChange = true;
250       }
251     
252     // After scanning this function, if we still have entries in callsites, then
253     // they are dangling pointers.  WeakVH should save us for this, so abort if
254     // this happens.
255     assert(CallSites.empty() && "Dangling pointers found in call sites map");
256     
257     // Periodically do an explicit clear to remove tombstones when processing
258     // large scc's.
259     if ((sccidx & 15) == 0)
260       CallSites.clear();
261   }
262
263   DEBUG(if (MadeChange) {
264           errs() << "CGSCCPASSMGR: Refreshed SCC is now:\n";
265           for (unsigned i = 0, e = CurSCC.size(); i != e; ++i)
266             CurSCC[i]->dump();
267          } else {
268            errs() << "CGSCCPASSMGR: SCC Refresh didn't change call graph.\n";
269          }
270         );
271 }
272
273 /// run - Execute all of the passes scheduled for execution.  Keep track of
274 /// whether any of the passes modifies the module, and if so, return true.
275 bool CGPassManager::runOnModule(Module &M) {
276   CallGraph &CG = getAnalysis<CallGraph>();
277   bool Changed = doInitialization(CG);
278
279   std::vector<CallGraphNode*> CurSCC;
280   
281   // Walk the callgraph in bottom-up SCC order.
282   for (scc_iterator<CallGraph*> CGI = scc_begin(&CG), E = scc_end(&CG);
283        CGI != E;) {
284     // Copy the current SCC and increment past it so that the pass can hack
285     // on the SCC if it wants to without invalidating our iterator.
286     CurSCC = *CGI;
287     ++CGI;
288     
289     
290     // CallGraphUpToDate - Keep track of whether the callgraph is known to be
291     // up-to-date or not.  The CGSSC pass manager runs two types of passes:
292     // CallGraphSCC Passes and other random function passes.  Because other
293     // random function passes are not CallGraph aware, they may clobber the
294     // call graph by introducing new calls or deleting other ones.  This flag
295     // is set to false when we run a function pass so that we know to clean up
296     // the callgraph when we need to run a CGSCCPass again.
297     bool CallGraphUpToDate = true;
298     
299     // Run all passes on current SCC.
300     for (unsigned PassNo = 0, e = getNumContainedPasses();
301          PassNo != e; ++PassNo) {
302       Pass *P = getContainedPass(PassNo);
303
304       dumpPassInfo(P, EXECUTION_MSG, ON_CG_MSG, "");
305       dumpRequiredSet(P);
306
307       initializeAnalysisImpl(P);
308
309       // Actually run this pass on the current SCC.
310       Changed |= RunPassOnSCC(P, CurSCC, CG, CallGraphUpToDate);
311
312       if (Changed)
313         dumpPassInfo(P, MODIFICATION_MSG, ON_CG_MSG, "");
314       dumpPreservedSet(P);
315
316       verifyPreservedAnalysis(P);      
317       removeNotPreservedAnalysis(P);
318       recordAvailableAnalysis(P);
319       removeDeadPasses(P, "", ON_CG_MSG);
320     }
321     
322     // If the callgraph was left out of date (because the last pass run was a
323     // functionpass), refresh it before we move on to the next SCC.
324     if (!CallGraphUpToDate)
325       RefreshCallGraph(CurSCC, CG, false);
326   }
327   Changed |= doFinalization(CG);
328   return Changed;
329 }
330
331 /// Initialize CG
332 bool CGPassManager::doInitialization(CallGraph &CG) {
333   bool Changed = false;
334   for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {  
335     Pass *P = getContainedPass(Index);
336     if (CallGraphSCCPass *CGSP = dynamic_cast<CallGraphSCCPass *>(P)) {
337       Changed |= CGSP->doInitialization(CG);
338     } else {
339       FPPassManager *FP = dynamic_cast<FPPassManager *>(P);
340       assert (FP && "Invalid CGPassManager member");
341       Changed |= FP->doInitialization(CG.getModule());
342     }
343   }
344   return Changed;
345 }
346
347 /// Finalize CG
348 bool CGPassManager::doFinalization(CallGraph &CG) {
349   bool Changed = false;
350   for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) {  
351     Pass *P = getContainedPass(Index);
352     if (CallGraphSCCPass *CGSP = dynamic_cast<CallGraphSCCPass *>(P)) {
353       Changed |= CGSP->doFinalization(CG);
354     } else {
355       FPPassManager *FP = dynamic_cast<FPPassManager *>(P);
356       assert (FP && "Invalid CGPassManager member");
357       Changed |= FP->doFinalization(CG.getModule());
358     }
359   }
360   return Changed;
361 }
362
363 /// Assign pass manager to manage this pass.
364 void CallGraphSCCPass::assignPassManager(PMStack &PMS,
365                                          PassManagerType PreferredType) {
366   // Find CGPassManager 
367   while (!PMS.empty() &&
368          PMS.top()->getPassManagerType() > PMT_CallGraphPassManager)
369     PMS.pop();
370
371   assert (!PMS.empty() && "Unable to handle Call Graph Pass");
372   CGPassManager *CGP = dynamic_cast<CGPassManager *>(PMS.top());
373
374   // Create new Call Graph SCC Pass Manager if it does not exist. 
375   if (!CGP) {
376
377     assert (!PMS.empty() && "Unable to create Call Graph Pass Manager");
378     PMDataManager *PMD = PMS.top();
379
380     // [1] Create new Call Graph Pass Manager
381     CGP = new CGPassManager(PMD->getDepth() + 1);
382
383     // [2] Set up new manager's top level manager
384     PMTopLevelManager *TPM = PMD->getTopLevelManager();
385     TPM->addIndirectPassManager(CGP);
386
387     // [3] Assign manager to manage this new manager. This may create
388     // and push new managers into PMS
389     Pass *P = dynamic_cast<Pass *>(CGP);
390     TPM->schedulePass(P);
391
392     // [4] Push new manager into PMS
393     PMS.push(CGP);
394   }
395
396   CGP->add(this);
397 }
398
399 /// getAnalysisUsage - For this class, we declare that we require and preserve
400 /// the call graph.  If the derived class implements this method, it should
401 /// always explicitly call the implementation here.
402 void CallGraphSCCPass::getAnalysisUsage(AnalysisUsage &AU) const {
403   AU.addRequired<CallGraph>();
404   AU.addPreserved<CallGraph>();
405 }