blob: fcd5edc768b7256986e04d91aafa6ae8bba49f9a [file] [log] [blame]
Chris Lattnere9966812003-02-07 19:46:03 +00001//===- AliasAnalysisCounter.cpp - Alias Analysis Query Counter ------------===//
Misha Brukman01808ca2005-04-21 21:13:18 +00002//
John Criswell482202a2003-10-20 19:43:21 +00003// The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
Misha Brukman01808ca2005-04-21 21:13:18 +00007//
John Criswell482202a2003-10-20 19:43:21 +00008//===----------------------------------------------------------------------===//
Chris Lattnere9966812003-02-07 19:46:03 +00009//
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
Jeff Cohencede1ce2005-01-08 22:01:16 +000015#include "llvm/Analysis/Passes.h"
Chris Lattnere9966812003-02-07 19:46:03 +000016#include "llvm/Pass.h"
Chris Lattnerccb6faa2005-03-23 21:59:07 +000017#include "llvm/Analysis/AliasAnalysis.h"
18#include "llvm/Assembly/Writer.h"
19#include "llvm/Support/CommandLine.h"
Reid Spencerf75727a2007-02-05 23:42:17 +000020#include "llvm/Support/Compiler.h"
Bill Wendling597d4512006-11-28 22:46:12 +000021#include "llvm/Support/Streams.h"
Chris Lattnerbff51162003-12-10 15:34:03 +000022using namespace llvm;
Brian Gaeke960707c2003-11-11 22:41:34 +000023
Chris Lattnere9966812003-02-07 19:46:03 +000024namespace {
Chris Lattnerccb6faa2005-03-23 21:59:07 +000025 cl::opt<bool>
26 PrintAll("count-aa-print-all-queries", cl::ReallyHidden);
27 cl::opt<bool>
28 PrintAllFailures("count-aa-print-all-failed-queries", cl::ReallyHidden);
29
Reid Spencerf75727a2007-02-05 23:42:17 +000030 class VISIBILITY_HIDDEN AliasAnalysisCounter
31 : public ModulePass, public AliasAnalysis {
Chris Lattner9a734b62003-02-07 20:39:17 +000032 unsigned No, May, Must;
Chris Lattnerd1e32082003-02-26 19:27:05 +000033 unsigned NoMR, JustRef, JustMod, MR;
Chris Lattner9a734b62003-02-07 20:39:17 +000034 const char *Name;
Chris Lattnerccb6faa2005-03-23 21:59:07 +000035 Module *M;
Chris Lattner9a734b62003-02-07 20:39:17 +000036 public:
Chris Lattnerd1e32082003-02-26 19:27:05 +000037 AliasAnalysisCounter() {
38 No = May = Must = 0;
39 NoMR = JustRef = JustMod = MR = 0;
40 }
41
42 void printLine(const char *Desc, unsigned Val, unsigned Sum) {
Bill Wendlingf3baad32006-12-07 01:30:32 +000043 cerr << " " << Val << " " << Desc << " responses ("
44 << Val*100/Sum << "%)\n";
Chris Lattnerd1e32082003-02-26 19:27:05 +000045 }
Chris Lattner9a734b62003-02-07 20:39:17 +000046 ~AliasAnalysisCounter() {
Chris Lattnerd1e32082003-02-26 19:27:05 +000047 unsigned AASum = No+May+Must;
48 unsigned MRSum = NoMR+JustRef+JustMod+MR;
49 if (AASum + MRSum) { // Print a report if any counted queries occurred...
Bill Wendlingf3baad32006-12-07 01:30:32 +000050 cerr << "\n===== Alias Analysis Counter Report =====\n"
51 << " Analysis counted: " << Name << "\n"
52 << " " << AASum << " Total Alias Queries Performed\n";
Chris Lattner702a42b2003-06-17 15:07:20 +000053 if (AASum) {
54 printLine("no alias", No, AASum);
55 printLine("may alias", May, AASum);
56 printLine("must alias", Must, AASum);
Bill Wendlingf3baad32006-12-07 01:30:32 +000057 cerr << " Alias Analysis Counter Summary: " << No*100/AASum << "%/"
58 << May*100/AASum << "%/" << Must*100/AASum<<"%\n\n";
Chris Lattner702a42b2003-06-17 15:07:20 +000059 }
Chris Lattnerd1e32082003-02-26 19:27:05 +000060
Bill Wendlingf3baad32006-12-07 01:30:32 +000061 cerr << " " << MRSum << " Total Mod/Ref Queries Performed\n";
Chris Lattner702a42b2003-06-17 15:07:20 +000062 if (MRSum) {
63 printLine("no mod/ref", NoMR, MRSum);
64 printLine("ref", JustRef, MRSum);
65 printLine("mod", JustMod, MRSum);
66 printLine("mod/ref", MR, MRSum);
Bill Wendlingf3baad32006-12-07 01:30:32 +000067 cerr << " Mod/Ref Analysis Counter Summary: " <<NoMR*100/MRSum<< "%/"
68 << JustRef*100/MRSum << "%/" << JustMod*100/MRSum << "%/"
69 << MR*100/MRSum <<"%\n\n";
Chris Lattner702a42b2003-06-17 15:07:20 +000070 }
Chris Lattner9a734b62003-02-07 20:39:17 +000071 }
72 }
Chris Lattnere9966812003-02-07 19:46:03 +000073
Chris Lattner4f2cf032004-09-20 04:48:05 +000074 bool runOnModule(Module &M) {
Chris Lattnerccb6faa2005-03-23 21:59:07 +000075 this->M = &M;
Chris Lattnerd1e32082003-02-26 19:27:05 +000076 InitializeAliasAnalysis(this);
Chris Lattner9a734b62003-02-07 20:39:17 +000077 Name = dynamic_cast<Pass*>(&getAnalysis<AliasAnalysis>())->getPassName();
78 return false;
79 }
80
Chris Lattnere9966812003-02-07 19:46:03 +000081 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
Chris Lattnerd1e32082003-02-26 19:27:05 +000082 AliasAnalysis::getAnalysisUsage(AU);
Chris Lattnere9966812003-02-07 19:46:03 +000083 AU.addRequired<AliasAnalysis>();
84 AU.setPreservesAll();
85 }
86
Chris Lattnerd4414442004-03-15 04:06:46 +000087 // FIXME: We could count these too...
88 bool pointsToConstantMemory(const Value *P) {
89 return getAnalysis<AliasAnalysis>().pointsToConstantMemory(P);
90 }
91 bool doesNotAccessMemory(Function *F) {
92 return getAnalysis<AliasAnalysis>().doesNotAccessMemory(F);
93 }
94 bool onlyReadsMemory(Function *F) {
95 return getAnalysis<AliasAnalysis>().onlyReadsMemory(F);
96 }
Misha Brukman01808ca2005-04-21 21:13:18 +000097
98
Chris Lattnere9966812003-02-07 19:46:03 +000099 // Forwarding functions: just delegate to a real AA implementation, counting
100 // the number of responses...
Chris Lattnerd1e32082003-02-26 19:27:05 +0000101 AliasResult alias(const Value *V1, unsigned V1Size,
Chris Lattnerccb6faa2005-03-23 21:59:07 +0000102 const Value *V2, unsigned V2Size);
103
104 ModRefResult getModRefInfo(CallSite CS, Value *P, unsigned Size);
Reid Spencer5c132bc2004-12-07 08:11:24 +0000105 ModRefResult getModRefInfo(CallSite CS1, CallSite CS2) {
106 return AliasAnalysis::getModRefInfo(CS1,CS2);
107 }
Chris Lattnere9966812003-02-07 19:46:03 +0000108 };
109
Chris Lattnerc2d3d312006-08-27 22:42:52 +0000110 RegisterPass<AliasAnalysisCounter>
Chris Lattnere9966812003-02-07 19:46:03 +0000111 X("count-aa", "Count Alias Analysis Query Responses");
Chris Lattner97c9f202006-08-28 00:42:29 +0000112 RegisterAnalysisGroup<AliasAnalysis> Y(X);
Chris Lattnere9966812003-02-07 19:46:03 +0000113}
Jeff Cohencede1ce2005-01-08 22:01:16 +0000114
115ModulePass *llvm::createAliasAnalysisCounterPass() {
116 return new AliasAnalysisCounter();
117}
Chris Lattnerccb6faa2005-03-23 21:59:07 +0000118
Misha Brukman01808ca2005-04-21 21:13:18 +0000119AliasAnalysis::AliasResult
Chris Lattnerccb6faa2005-03-23 21:59:07 +0000120AliasAnalysisCounter::alias(const Value *V1, unsigned V1Size,
121 const Value *V2, unsigned V2Size) {
122 AliasResult R = getAnalysis<AliasAnalysis>().alias(V1, V1Size, V2, V2Size);
Misha Brukman01808ca2005-04-21 21:13:18 +0000123
Chris Lattnerccb6faa2005-03-23 21:59:07 +0000124 const char *AliasString;
125 switch (R) {
126 default: assert(0 && "Unknown alias type!");
127 case NoAlias: No++; AliasString = "No alias"; break;
128 case MayAlias: May++; AliasString = "May alias"; break;
129 case MustAlias: Must++; AliasString = "Must alias"; break;
130 }
131
132 if (PrintAll || (PrintAllFailures && R == MayAlias)) {
Bill Wendlingf3baad32006-12-07 01:30:32 +0000133 cerr << AliasString << ":\t";
134 cerr << "[" << V1Size << "B] ";
Bill Wendling355fc5a2006-12-07 20:28:15 +0000135 WriteAsOperand(*cerr.stream(), V1, true, M) << ", ";
Bill Wendlingf3baad32006-12-07 01:30:32 +0000136 cerr << "[" << V2Size << "B] ";
Bill Wendling355fc5a2006-12-07 20:28:15 +0000137 WriteAsOperand(*cerr.stream(), V2, true, M) << "\n";
Chris Lattnerccb6faa2005-03-23 21:59:07 +0000138 }
139
140 return R;
141}
142
Misha Brukman01808ca2005-04-21 21:13:18 +0000143AliasAnalysis::ModRefResult
Chris Lattnerccb6faa2005-03-23 21:59:07 +0000144AliasAnalysisCounter::getModRefInfo(CallSite CS, Value *P, unsigned Size) {
145 ModRefResult R = getAnalysis<AliasAnalysis>().getModRefInfo(CS, P, Size);
146
147 const char *MRString;
148 switch (R) {
149 default: assert(0 && "Unknown mod/ref type!");
150 case NoModRef: NoMR++; MRString = "NoModRef"; break;
151 case Ref: JustRef++; MRString = "JustRef"; break;
152 case Mod: JustMod++; MRString = "JustMod"; break;
153 case ModRef: MR++; MRString = "ModRef"; break;
154 }
155
156 if (PrintAll || (PrintAllFailures && R == ModRef)) {
Bill Wendlingf3baad32006-12-07 01:30:32 +0000157 cerr << MRString << ": Ptr: ";
158 cerr << "[" << Size << "B] ";
Bill Wendling355fc5a2006-12-07 20:28:15 +0000159 WriteAsOperand(*cerr.stream(), P, true, M);
Bill Wendlingf3baad32006-12-07 01:30:32 +0000160 cerr << "\t<->" << *CS.getInstruction();
Chris Lattnerccb6faa2005-03-23 21:59:07 +0000161 }
162 return R;
163}