46437849c773121af463955885aa90034961d20d
[oota-llvm.git] / lib / Analysis / AliasAnalysisCounter.cpp
1 //===- AliasAnalysisCounter.cpp - Alias Analysis Query Counter ------------===//
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 which can be used to count how many alias queries
11 // are being made and how the alias analysis implementation being used responds.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #include "llvm/Analysis/AliasAnalysisCounter.h"
16 #include "llvm/Analysis/AliasAnalysis.h"
17 #include "llvm/IR/Module.h"
18 #include "llvm/Pass.h"
19 #include "llvm/Support/CommandLine.h"
20 #include "llvm/Support/Debug.h"
21 #include "llvm/Support/ErrorHandling.h"
22 #include "llvm/Support/raw_ostream.h"
23 using namespace llvm;
24
25 static cl::opt<bool> PrintAll("count-aa-print-all-queries", cl::ReallyHidden,
26                               cl::init(true));
27 static cl::opt<bool> PrintAllFailures("count-aa-print-all-failed-queries",
28                                       cl::ReallyHidden);
29
30 char AliasAnalysisCounter::ID = 0;
31 INITIALIZE_AG_PASS(AliasAnalysisCounter, AliasAnalysis, "count-aa",
32                    "Count Alias Analysis Query Responses", false, true, false)
33
34 ModulePass *llvm::createAliasAnalysisCounterPass() {
35   return new AliasAnalysisCounter();
36 }
37
38 AliasResult AliasAnalysisCounter::alias(const MemoryLocation &LocA,
39                                         const MemoryLocation &LocB) {
40   AliasResult R = getAnalysis<AliasAnalysis>().alias(LocA, LocB);
41
42   const char *AliasString = nullptr;
43   switch (R) {
44   case NoAlias:
45     No++;
46     AliasString = "No alias";
47     break;
48   case MayAlias:
49     May++;
50     AliasString = "May alias";
51     break;
52   case PartialAlias:
53     Partial++;
54     AliasString = "Partial alias";
55     break;
56   case MustAlias:
57     Must++;
58     AliasString = "Must alias";
59     break;
60   }
61
62   if (PrintAll || (PrintAllFailures && R == MayAlias)) {
63     errs() << AliasString << ":\t";
64     errs() << "[" << LocA.Size << "B] ";
65     LocA.Ptr->printAsOperand(errs(), true, M);
66     errs() << ", ";
67     errs() << "[" << LocB.Size << "B] ";
68     LocB.Ptr->printAsOperand(errs(), true, M);
69     errs() << "\n";
70   }
71
72   return R;
73 }
74
75 ModRefInfo AliasAnalysisCounter::getModRefInfo(ImmutableCallSite CS,
76                                                const MemoryLocation &Loc) {
77   ModRefInfo R = getAnalysis<AliasAnalysis>().getModRefInfo(CS, Loc);
78
79   const char *MRString = nullptr;
80   switch (R) {
81   case MRI_NoModRef:
82     NoMR++;
83     MRString = "MRI_NoModRef";
84     break;
85   case MRI_Ref:
86     JustRef++;
87     MRString = "JustRef";
88     break;
89   case MRI_Mod:
90     JustMod++;
91     MRString = "JustMod";
92     break;
93   case MRI_ModRef:
94     MR++;
95     MRString = "MRI_ModRef";
96     break;
97   }
98
99   if (PrintAll || (PrintAllFailures && R == MRI_ModRef)) {
100     errs() << MRString << ":  Ptr: ";
101     errs() << "[" << Loc.Size << "B] ";
102     Loc.Ptr->printAsOperand(errs(), true, M);
103     errs() << "\t<->" << *CS.getInstruction() << '\n';
104   }
105   return R;
106 }