Apply fix for PR5135, Credit to Andreas Neustifter.
[oota-llvm.git] / lib / Analysis / ProfileVerifierPass.cpp
1 //===- ProfileVerifierPass.cpp - LLVM Pass to estimate profile info -------===//
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 a pass that checks profiling information for 
11 // plausibility.
12 //
13 //===----------------------------------------------------------------------===//
14 #define DEBUG_TYPE "profile-verifier"
15 #include "llvm/Instructions.h"
16 #include "llvm/Module.h"
17 #include "llvm/Pass.h"
18 #include "llvm/Analysis/ProfileInfo.h"
19 #include "llvm/Support/CommandLine.h"
20 #include "llvm/Support/CallSite.h"
21 #include "llvm/Support/CFG.h"
22 #include "llvm/Support/InstIterator.h"
23 #include "llvm/Support/raw_ostream.h"
24 #include "llvm/Support/Debug.h"
25 #include <set>
26 using namespace llvm;
27
28 static cl::opt<bool,false>
29 ProfileVerifierDisableAssertions("profile-verifier-noassert",
30      cl::desc("Disable assertions"));
31
32 namespace {
33   class ProfileVerifierPass : public FunctionPass {
34
35     struct DetailedBlockInfo {
36       const BasicBlock *BB;
37       double            BBWeight;
38       double            inWeight;
39       int               inCount;
40       double            outWeight;
41       int               outCount;
42     };
43
44     ProfileInfo *PI;
45     std::set<const BasicBlock*> BBisVisited;
46     std::set<const Function*>   FisVisited;
47     bool DisableAssertions;
48
49     // When debugging is enabled, the verifier prints a whole slew of debug
50     // information, otherwise its just the assert. These are all the helper
51     // functions.
52     bool PrintedDebugTree;
53     std::set<const BasicBlock*> BBisPrinted;
54     void debugEntry(DetailedBlockInfo*);
55     void printDebugInfo(const BasicBlock *BB);
56
57   public:
58     static char ID; // Class identification, replacement for typeinfo
59
60     explicit ProfileVerifierPass () : FunctionPass(&ID) {
61       DisableAssertions = ProfileVerifierDisableAssertions;
62     }
63     explicit ProfileVerifierPass (bool da) : FunctionPass(&ID), 
64                                              DisableAssertions(da) {
65     }
66
67     void getAnalysisUsage(AnalysisUsage &AU) const {
68       AU.setPreservesAll();
69       AU.addRequired<ProfileInfo>();
70     }
71
72     const char *getPassName() const {
73       return "Profiling information verifier";
74     }
75
76     /// run - Verify the profile information.
77     bool runOnFunction(Function &F);
78     void recurseBasicBlock(const BasicBlock*);
79
80     bool   exitReachable(const Function*);
81     double ReadOrAssert(ProfileInfo::Edge);
82     void   CheckValue(bool, const char*, DetailedBlockInfo*);
83   };
84 }  // End of anonymous namespace
85
86 char ProfileVerifierPass::ID = 0;
87 static RegisterPass<ProfileVerifierPass>
88 X("profile-verifier", "Verify profiling information", false, true);
89
90 namespace llvm {
91   FunctionPass *createProfileVerifierPass() {
92     return new ProfileVerifierPass(ProfileVerifierDisableAssertions); 
93   }
94 }
95
96 void ProfileVerifierPass::printDebugInfo(const BasicBlock *BB) {
97
98   if (BBisPrinted.find(BB) != BBisPrinted.end()) return;
99
100   double BBWeight = PI->getExecutionCount(BB);
101   if (BBWeight == ProfileInfo::MissingValue) { BBWeight = 0; }
102   double inWeight = 0;
103   int inCount = 0;
104   std::set<const BasicBlock*> ProcessedPreds;
105   for ( pred_const_iterator bbi = pred_begin(BB), bbe = pred_end(BB);
106         bbi != bbe; ++bbi ) {
107     if (ProcessedPreds.insert(*bbi).second) {
108       ProfileInfo::Edge E = PI->getEdge(*bbi,BB);
109       double EdgeWeight = PI->getEdgeWeight(E);
110       if (EdgeWeight == ProfileInfo::MissingValue) { EdgeWeight = 0; }
111       errs() << "calculated in-edge " << E << ": " << EdgeWeight << "\n";
112       inWeight += EdgeWeight;
113       inCount++;
114     }
115   }
116   double outWeight = 0;
117   int outCount = 0;
118   std::set<const BasicBlock*> ProcessedSuccs;
119   for ( succ_const_iterator bbi = succ_begin(BB), bbe = succ_end(BB);
120         bbi != bbe; ++bbi ) {
121     if (ProcessedSuccs.insert(*bbi).second) {
122       ProfileInfo::Edge E = PI->getEdge(BB,*bbi);
123       double EdgeWeight = PI->getEdgeWeight(E);
124       if (EdgeWeight == ProfileInfo::MissingValue) { EdgeWeight = 0; }
125       errs() << "calculated out-edge " << E << ": " << EdgeWeight << "\n";
126       outWeight += EdgeWeight;
127       outCount++;
128     }
129   }
130   errs()<<"Block "<<BB->getNameStr()<<" in "<<BB->getParent()->getNameStr()
131         <<",BBWeight="<<BBWeight<<",inWeight="<<inWeight<<",inCount="<<inCount
132         <<",outWeight="<<outWeight<<",outCount"<<outCount<<"\n";
133
134   // mark as visited and recurse into subnodes
135   BBisPrinted.insert(BB);
136   for ( succ_const_iterator bbi = succ_begin(BB), bbe = succ_end(BB); 
137         bbi != bbe; ++bbi ) {
138     printDebugInfo(*bbi);
139   }
140 }
141
142 void ProfileVerifierPass::debugEntry (DetailedBlockInfo *DI) {
143   errs() << "TROUBLE: Block " << DI->BB->getNameStr() << " in "
144          << DI->BB->getParent()->getNameStr()  << ":";
145   errs() << "BBWeight="  << DI->BBWeight   << ",";
146   errs() << "inWeight="  << DI->inWeight   << ",";
147   errs() << "inCount="   << DI->inCount    << ",";
148   errs() << "outWeight=" << DI->outWeight  << ",";
149   errs() << "outCount="  << DI->outCount   << "\n";
150   if (!PrintedDebugTree) {
151     PrintedDebugTree = true;
152     printDebugInfo(&(DI->BB->getParent()->getEntryBlock()));
153   }
154 }
155
156 // This compares A and B but considering maybe small differences.
157 static bool Equals(double A, double B) { 
158   double maxRelativeError = 0.0000001;
159   if (A == B)
160     return true;
161   double relativeError;
162   if (fabs(B) > fabs(A)) 
163     relativeError = fabs((A - B) / B);
164   else 
165     relativeError = fabs((A - B) / A);
166   if (relativeError <= maxRelativeError) return true; 
167   return false; 
168 }
169
170 // This checks if the function "exit" is reachable from an given function
171 // via calls, this is necessary to check if a profile is valid despite the
172 // counts not fitting exactly.
173 bool ProfileVerifierPass::exitReachable(const Function *F) {
174   if (!F) return false;
175
176   if (FisVisited.count(F)) return false;
177
178   Function *Exit = F->getParent()->getFunction("exit");
179   if (Exit == F) {
180     return true;
181   }
182
183   FisVisited.insert(F);
184   bool exits = false;
185   for (const_inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I) {
186     if (const CallInst *CI = dyn_cast<CallInst>(&*I)) {
187       exits |= exitReachable(CI->getCalledFunction());
188       if (exits) break;
189     }
190   }
191   return exits;
192 }
193
194 #define ASSERTMESSAGE(M) \
195     errs() << (M) << "\n"; \
196     if (!DisableAssertions) assert(0 && (M));
197
198 double ProfileVerifierPass::ReadOrAssert(ProfileInfo::Edge E) {
199   double EdgeWeight = PI->getEdgeWeight(E);
200   if (EdgeWeight == ProfileInfo::MissingValue) {
201     errs() << "Edge " << E << " in Function " 
202            << ProfileInfo::getFunction(E)->getNameStr() << ": ";
203     ASSERTMESSAGE("ASSERT:Edge has missing value");
204     return 0;
205   } else {
206     return EdgeWeight;
207   }
208 }
209
210 void ProfileVerifierPass::CheckValue(bool Error, const char *Message,
211                                      DetailedBlockInfo *DI) {
212   if (Error) {
213     DEBUG(debugEntry(DI));
214     errs() << "Block " << DI->BB->getNameStr() << " in Function " 
215            << DI->BB->getParent()->getNameStr() << ": ";
216     ASSERTMESSAGE(Message);
217   }
218   return;
219 }
220
221 // This calculates the Information for a block and then recurses into the
222 // successors.
223 void ProfileVerifierPass::recurseBasicBlock(const BasicBlock *BB) {
224
225   // Break the recursion by remembering all visited blocks.
226   if (BBisVisited.find(BB) != BBisVisited.end()) return;
227
228   // Use a data structure to store all the information, this can then be handed
229   // to debug printers.
230   DetailedBlockInfo DI;
231   DI.BB = BB;
232   DI.outCount = DI.inCount = 0;
233   DI.inWeight = DI.outWeight = 0.0;
234
235   // Read predecessors.
236   std::set<const BasicBlock*> ProcessedPreds;
237   pred_const_iterator bpi = pred_begin(BB), bpe = pred_end(BB);
238   // If there are none, check for (0,BB) edge.
239   if (bpi == bpe) {
240     DI.inWeight += ReadOrAssert(PI->getEdge(0,BB));
241     DI.inCount++;
242   }
243   for (;bpi != bpe; ++bpi) {
244     if (ProcessedPreds.insert(*bpi).second) {
245       DI.inWeight += ReadOrAssert(PI->getEdge(*bpi,BB));
246       DI.inCount++;
247     }
248   }
249
250   // Read successors.
251   std::set<const BasicBlock*> ProcessedSuccs;
252   succ_const_iterator bbi = succ_begin(BB), bbe = succ_end(BB);
253   // If there is an (0,BB) edge, consider it too. (This is done not only when
254   // there are no successors, but every time; not every function contains
255   // return blocks with no successors (think loop latch as return block)).
256   double w = PI->getEdgeWeight(PI->getEdge(BB,0));
257   if (w != ProfileInfo::MissingValue) {
258     DI.outWeight += w;
259     DI.outCount++;
260   }
261   for (;bbi != bbe; ++bbi) {
262     if (ProcessedSuccs.insert(*bbi).second) {
263       DI.outWeight += ReadOrAssert(PI->getEdge(BB,*bbi));
264       DI.outCount++;
265     }
266   }
267
268   // Read block weight.
269   DI.BBWeight = PI->getExecutionCount(BB);
270   CheckValue(DI.BBWeight == ProfileInfo::MissingValue,
271              "ASSERT:BasicBlock has missing value", &DI);
272
273   // Check if this block is a setjmp target.
274   bool isSetJmpTarget = false;
275   if (DI.outWeight > DI.inWeight) {
276     for (BasicBlock::const_iterator i = BB->begin(), ie = BB->end();
277          i != ie; ++i) {
278       if (const CallInst *CI = dyn_cast<CallInst>(&*i)) {
279         Function *F = CI->getCalledFunction();
280         if (F && (F->getNameStr() == "_setjmp")) {
281           isSetJmpTarget = true; break;
282         }
283       }
284     }
285   }
286   // Check if this block is eventually reaching exit.
287   bool isExitReachable = false;
288   if (DI.inWeight > DI.outWeight) {
289     for (BasicBlock::const_iterator i = BB->begin(), ie = BB->end();
290          i != ie; ++i) {
291       if (const CallInst *CI = dyn_cast<CallInst>(&*i)) {
292         FisVisited.clear();
293         isExitReachable |= exitReachable(CI->getCalledFunction());
294         if (isExitReachable) break;
295       }
296     }
297   }
298
299   if (DI.inCount > 0 && DI.outCount == 0) {
300      // If this is a block with no successors.
301     if (!isSetJmpTarget) {
302       CheckValue(!Equals(DI.inWeight,DI.BBWeight), 
303                  "ASSERT:inWeight and BBWeight do not match", &DI);
304     }
305   } else if (DI.inCount == 0 && DI.outCount > 0) {
306     // If this is a block with no predecessors.
307     if (!isExitReachable)
308       CheckValue(!Equals(DI.BBWeight,DI.outWeight), 
309                  "ASSERT:BBWeight and outWeight do not match", &DI);
310   } else {
311     // If this block has successors and predecessors.
312     if (DI.inWeight > DI.outWeight && !isExitReachable)
313       CheckValue(!Equals(DI.inWeight,DI.outWeight), 
314                  "ASSERT:inWeight and outWeight do not match", &DI);
315     if (DI.inWeight < DI.outWeight && !isSetJmpTarget)
316       CheckValue(!Equals(DI.inWeight,DI.outWeight), 
317                  "ASSERT:inWeight and outWeight do not match", &DI);
318   }
319
320
321   // Mark this block as visited, rescurse into successors.
322   BBisVisited.insert(BB);
323   for ( succ_const_iterator bbi = succ_begin(BB), bbe = succ_end(BB); 
324         bbi != bbe; ++bbi ) {
325     recurseBasicBlock(*bbi);
326   }
327 }
328
329 bool ProfileVerifierPass::runOnFunction(Function &F) {
330   PI = &getAnalysis<ProfileInfo>();
331
332   // Prepare global variables.
333   PrintedDebugTree = false;
334   BBisVisited.clear();
335
336   // Fetch entry block and recurse into it.
337   const BasicBlock *entry = &F.getEntryBlock();
338   recurseBasicBlock(entry);
339
340   if (!DisableAssertions)
341     assert((PI->getExecutionCount(&F)==PI->getExecutionCount(entry)) &&
342            "Function count and entry block count do not match");
343   return false;
344 }