Allow counting multiple passes, and print the pass name counted
[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   class AliasAnalysisCounter : public Pass, public AliasAnalysis {
14     unsigned No, May, Must;
15     const char *Name;
16   public:
17     AliasAnalysisCounter() : No(0), May(0), Must(0) {}
18     ~AliasAnalysisCounter() {
19       unsigned Sum = No+May+Must;
20       if (Sum) {            // Print a report if any counted queries occurred...
21         std::cerr
22           << "\n===== Alias Analysis Counter Report =====\n"
23           << "  Analysis counted: " << Name << "\n"
24           << "  " << Sum << " Total Alias Queries Performed\n"
25           << "  " << No << " no alias responses (" << No*100/Sum << "%)\n"
26           << "  " << May << " may alias responses (" << May*100/Sum << "%)\n"
27           << "  " << Must << " must alias responses (" <<Must*100/Sum<<"%)\n"
28           << "  Alias Analysis Counter Summary: " << No*100/Sum << "%/"
29           << May*100/Sum << "%/" << Must*100/Sum<<"%\n\n";
30       }
31     }
32
33     bool run(Module &M) {
34       Name = dynamic_cast<Pass*>(&getAnalysis<AliasAnalysis>())->getPassName();
35       return false;
36     }
37
38     virtual void getAnalysisUsage(AnalysisUsage &AU) const {
39       AU.addRequired<AliasAnalysis>();
40       AU.setPreservesAll();
41     }
42
43     Result count(Result R) {
44       switch (R) {
45       default: assert(0 && "Unknown alias type!");
46       case NoAlias:   No++; return NoAlias;
47       case MayAlias:  May++; return MayAlias;
48       case MustAlias: Must++; return MustAlias;
49       }
50     }
51     
52     // Forwarding functions: just delegate to a real AA implementation, counting
53     // the number of responses...
54     Result alias(const Value *V1, const Value *V2) {
55       return count(getAnalysis<AliasAnalysis>().alias(V1, V2));
56     }
57     Result canCallModify(const CallInst &CI, const Value *Ptr) {
58       return count(getAnalysis<AliasAnalysis>().canCallModify(CI, Ptr));
59     }
60     Result canInvokeModify(const InvokeInst &I, const Value *Ptr) {
61       return count(getAnalysis<AliasAnalysis>().canInvokeModify(I, Ptr));
62     }
63   };
64
65   RegisterOpt<AliasAnalysisCounter>
66   X("count-aa", "Count Alias Analysis Query Responses");
67   RegisterAnalysisGroup<AliasAnalysis, AliasAnalysisCounter> Y;
68 }