d80a3f8bf9469317fee6ffa3d22f513fc068e7f3
[oota-llvm.git] / lib / Analysis / AliasAnalysisCounter.cpp
1 //===- AliasAnalysisCounter.cpp - Alias Analysis Query Counter ------------===//
2 //
3 // This file implements a pass which can be used to count how many alias queries
4 // are being made and how the alias analysis implementation being used responds.
5 //
6 //===----------------------------------------------------------------------===//
7
8 #include "llvm/Analysis/AliasAnalysis.h"
9 #include "llvm/Pass.h"
10 #include <iostream>
11
12 namespace {
13   unsigned No = 0, May = 0, Must = 0;
14
15   struct AliasAnalysisCounter : public Pass, public AliasAnalysis {
16     bool run(Module &M) { return false; }
17     virtual void getAnalysisUsage(AnalysisUsage &AU) const {
18       AU.addRequired<AliasAnalysis>();
19       AU.setPreservesAll();
20     }
21
22     Result count(Result R) {
23       switch (R) {
24       default: assert(0 && "Unknown alias type!");
25       case NoAlias:   No++; return NoAlias;
26       case MayAlias:  May++; return MayAlias;
27       case MustAlias: Must++; return MustAlias;
28       }
29     }
30     
31     // Forwarding functions: just delegate to a real AA implementation, counting
32     // the number of responses...
33     Result alias(const Value *V1, const Value *V2) {
34       return count(getAnalysis<AliasAnalysis>().alias(V1, V2));
35     }
36     Result canCallModify(const CallInst &CI, const Value *Ptr) {
37       return count(getAnalysis<AliasAnalysis>().canCallModify(CI, Ptr));
38     }
39     Result canInvokeModify(const InvokeInst &I, const Value *Ptr) {
40       return count(getAnalysis<AliasAnalysis>().canInvokeModify(I, Ptr));
41     }
42   };
43
44   RegisterOpt<AliasAnalysisCounter>
45   X("count-aa", "Count Alias Analysis Query Responses");
46   RegisterAnalysisGroup<AliasAnalysis, AliasAnalysisCounter> Y;
47
48
49   struct ResultPrinter {
50     ~ResultPrinter() {
51       unsigned Sum = No+May+Must;
52       if (Sum) {            // Print a report if any counted queries occurred...
53         std::cerr
54           << "\n===== Alias Analysis Counter Report =====\n"
55           << "  " << Sum << " Total Alias Queries Performed\n"
56           << "  " << No << " no alias responses (" << No*100/Sum << "%)\n"
57           << "  " << May << " may alias responses (" << May*100/Sum << "%)\n"
58           << "  " << Must << " must alias responses (" <<Must*100/Sum<<"%)\n"
59           << "  Alias Analysis Counter Summary: " << No*100/Sum << "%/"
60           << May*100/Sum << "%/" << Must*100/Sum<<"%\n\n";
61       }
62     }
63   } RP;
64 }