aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Analysis/AliasAnalysisCounter.cpp
blob: d80a3f8bf9469317fee6ffa3d22f513fc068e7f3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//===- AliasAnalysisCounter.cpp - Alias Analysis Query Counter ------------===//
//
// This file implements a pass which can be used to count how many alias queries
// are being made and how the alias analysis implementation being used responds.
//
//===----------------------------------------------------------------------===//

#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/Pass.h"
#include <iostream>

namespace {
  unsigned No = 0, May = 0, Must = 0;

  struct AliasAnalysisCounter : public Pass, public AliasAnalysis {
    bool run(Module &M) { return false; }
    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
      AU.addRequired<AliasAnalysis>();
      AU.setPreservesAll();
    }

    Result count(Result R) {
      switch (R) {
      default: assert(0 && "Unknown alias type!");
      case NoAlias:   No++; return NoAlias;
      case MayAlias:  May++; return MayAlias;
      case MustAlias: Must++; return MustAlias;
      }
    }
    
    // Forwarding functions: just delegate to a real AA implementation, counting
    // the number of responses...
    Result alias(const Value *V1, const Value *V2) {
      return count(getAnalysis<AliasAnalysis>().alias(V1, V2));
    }
    Result canCallModify(const CallInst &CI, const Value *Ptr) {
      return count(getAnalysis<AliasAnalysis>().canCallModify(CI, Ptr));
    }
    Result canInvokeModify(const InvokeInst &I, const Value *Ptr) {
      return count(getAnalysis<AliasAnalysis>().canInvokeModify(I, Ptr));
    }
  };

  RegisterOpt<AliasAnalysisCounter>
  X("count-aa", "Count Alias Analysis Query Responses");
  RegisterAnalysisGroup<AliasAnalysis, AliasAnalysisCounter> Y;


  struct ResultPrinter {
    ~ResultPrinter() {
      unsigned Sum = No+May+Must;
      if (Sum) {            // Print a report if any counted queries occurred...
        std::cerr
          << "\n===== Alias Analysis Counter Report =====\n"
          << "  " << Sum << " Total Alias Queries Performed\n"
          << "  " << No << " no alias responses (" << No*100/Sum << "%)\n"
          << "  " << May << " may alias responses (" << May*100/Sum << "%)\n"
          << "  " << Must << " must alias responses (" <<Must*100/Sum<<"%)\n"
          << "  Alias Analysis Counter Summary: " << No*100/Sum << "%/"
          << May*100/Sum << "%/" << Must*100/Sum<<"%\n\n";
      }
    }
  } RP;
}