ProfileVerifierPass.cpp revision 198090
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>
26using namespace llvm;
27
28static cl::opt<bool,false>
29ProfileVerifierDisableAssertions("profile-verifier-noassert",
30     cl::desc("Disable assertions"));
31
32namespace {
33  class VISIBILITY_HIDDEN 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
86char ProfileVerifierPass::ID = 0;
87static RegisterPass<ProfileVerifierPass>
88X("profile-verifier", "Verify profiling information", false, true);
89
90namespace llvm {
91  FunctionPass *createProfileVerifierPass() {
92    return new ProfileVerifierPass(ProfileVerifierDisableAssertions);
93  }
94}
95
96void 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
142void 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.
157static 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.
173bool 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
198double 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
210void 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.
223void 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 = DI.inWeight = DI.outWeight = 0;
233
234  // Read predecessors.
235  std::set<const BasicBlock*> ProcessedPreds;
236  pred_const_iterator bpi = pred_begin(BB), bpe = pred_end(BB);
237  // If there are none, check for (0,BB) edge.
238  if (bpi == bpe) {
239    DI.inWeight += ReadOrAssert(PI->getEdge(0,BB));
240    DI.inCount++;
241  }
242  for (;bpi != bpe; ++bpi) {
243    if (ProcessedPreds.insert(*bpi).second) {
244      DI.inWeight += ReadOrAssert(PI->getEdge(*bpi,BB));
245      DI.inCount++;
246    }
247  }
248
249  // Read successors.
250  std::set<const BasicBlock*> ProcessedSuccs;
251  succ_const_iterator bbi = succ_begin(BB), bbe = succ_end(BB);
252  // If there is an (0,BB) edge, consider it too. (This is done not only when
253  // there are no successors, but every time; not every function contains
254  // return blocks with no successors (think loop latch as return block)).
255  double w = PI->getEdgeWeight(PI->getEdge(BB,0));
256  if (w != ProfileInfo::MissingValue) {
257    DI.outWeight += w;
258    DI.outCount++;
259  }
260  for (;bbi != bbe; ++bbi) {
261    if (ProcessedSuccs.insert(*bbi).second) {
262      DI.outWeight += ReadOrAssert(PI->getEdge(BB,*bbi));
263      DI.outCount++;
264    }
265  }
266
267  // Read block weight.
268  DI.BBWeight = PI->getExecutionCount(BB);
269  CheckValue(DI.BBWeight == ProfileInfo::MissingValue,
270             "ASSERT:BasicBlock has missing value", &DI);
271
272  // Check if this block is a setjmp target.
273  bool isSetJmpTarget = false;
274  if (DI.outWeight > DI.inWeight) {
275    for (BasicBlock::const_iterator i = BB->begin(), ie = BB->end();
276         i != ie; ++i) {
277      if (const CallInst *CI = dyn_cast<CallInst>(&*i)) {
278        Function *F = CI->getCalledFunction();
279        if (F && (F->getNameStr() == "_setjmp")) {
280          isSetJmpTarget = true; break;
281        }
282      }
283    }
284  }
285  // Check if this block is eventually reaching exit.
286  bool isExitReachable = false;
287  if (DI.inWeight > DI.outWeight) {
288    for (BasicBlock::const_iterator i = BB->begin(), ie = BB->end();
289         i != ie; ++i) {
290      if (const CallInst *CI = dyn_cast<CallInst>(&*i)) {
291        FisVisited.clear();
292        isExitReachable |= exitReachable(CI->getCalledFunction());
293        if (isExitReachable) break;
294      }
295    }
296  }
297
298  if (DI.inCount > 0 && DI.outCount == 0) {
299     // If this is a block with no successors.
300    if (!isSetJmpTarget) {
301      CheckValue(!Equals(DI.inWeight,DI.BBWeight),
302                 "ASSERT:inWeight and BBWeight do not match", &DI);
303    }
304  } else if (DI.inCount == 0 && DI.outCount > 0) {
305    // If this is a block with no predecessors.
306    if (!isExitReachable)
307      CheckValue(!Equals(DI.BBWeight,DI.outWeight),
308                 "ASSERT:BBWeight and outWeight do not match", &DI);
309  } else {
310    // If this block has successors and predecessors.
311    if (DI.inWeight > DI.outWeight && !isExitReachable)
312      CheckValue(!Equals(DI.inWeight,DI.outWeight),
313                 "ASSERT:inWeight and outWeight do not match", &DI);
314    if (DI.inWeight < DI.outWeight && !isSetJmpTarget)
315      CheckValue(!Equals(DI.inWeight,DI.outWeight),
316                 "ASSERT:inWeight and outWeight do not match", &DI);
317  }
318
319
320  // Mark this block as visited, rescurse into successors.
321  BBisVisited.insert(BB);
322  for ( succ_const_iterator bbi = succ_begin(BB), bbe = succ_end(BB);
323        bbi != bbe; ++bbi ) {
324    recurseBasicBlock(*bbi);
325  }
326}
327
328bool ProfileVerifierPass::runOnFunction(Function &F) {
329  PI = &getAnalysis<ProfileInfo>();
330
331  // Prepare global variables.
332  PrintedDebugTree = false;
333  BBisVisited.clear();
334
335  // Fetch entry block and recurse into it.
336  const BasicBlock *entry = &F.getEntryBlock();
337  recurseBasicBlock(entry);
338
339  if (!DisableAssertions)
340    assert((PI->getExecutionCount(&F)==PI->getExecutionCount(entry)) &&
341           "Function count and entry block count do not match");
342  return false;
343}
344