32 unsigned No, May, Partial, Must;
33 unsigned NoMR, JustRef, JustMod, MR;
39 No = May = Partial = Must = 0;
40 NoMR = JustRef = JustMod = MR = 0;
43 void printLine(
const char *Desc,
unsigned Val,
unsigned Sum) {
44 errs() <<
" " << Val <<
" " << Desc <<
" responses ("
45 << Val*100/Sum <<
"%)\n";
47 ~AliasAnalysisCounter() {
48 unsigned AASum = No+May+Partial+Must;
49 unsigned MRSum = NoMR+JustRef+JustMod+MR;
51 errs() <<
"\n===== Alias Analysis Counter Report =====\n"
52 <<
" Analysis counted:\n"
53 <<
" " << AASum <<
" Total Alias Queries Performed\n";
57 printLine(
"partial alias", Partial, AASum);
59 errs() <<
" Alias Analysis Counter Summary: " << No*100/AASum <<
"%/"
60 << May*100/AASum <<
"%/"
61 << Partial*100/AASum <<
"%/"
62 << Must*100/AASum<<
"%\n\n";
65 errs() <<
" " << MRSum <<
" Total Mod/Ref Queries Performed\n";
71 errs() <<
" Mod/Ref Analysis Counter Summary: " <<NoMR*100/MRSum
72 <<
"%/" << JustRef*100/MRSum <<
"%/" << JustMod*100/MRSum
73 <<
"%/" << MR*100/MRSum <<
"%\n\n";
78 bool runOnModule(
Module &M) {
80 InitializeAliasAnalysis(
this);
94 virtual void *getAdjustedAnalysisPointer(
AnalysisID PI) {
101 bool pointsToConstantMemory(
const Location &Loc,
bool OrLocal) {
102 return getAnalysis<AliasAnalysis>().pointsToConstantMemory(Loc, OrLocal);
107 AliasResult alias(
const Location &LocA,
const Location &LocB);
110 const Location &Loc);
120 "Count Alias Analysis Query Responses",
false,
true,
false)
123 return new AliasAnalysisCounter();
127 AliasAnalysisCounter::alias(
const Location &LocA,
const Location &LocB) {
128 AliasResult R = getAnalysis<AliasAnalysis>().alias(LocA, LocB);
130 const char *AliasString = 0;
132 case NoAlias: No++; AliasString =
"No alias";
break;
133 case MayAlias: May++; AliasString =
"May alias";
break;
134 case PartialAlias: Partial++; AliasString =
"Partial alias";
break;
135 case MustAlias: Must++; AliasString =
"Must alias";
break;
139 errs() << AliasString <<
":\t";
140 errs() <<
"[" << LocA.Size <<
"B] ";
143 errs() <<
"[" << LocB.Size <<
"B] ";
153 const Location &Loc) {
154 ModRefResult R = getAnalysis<AliasAnalysis>().getModRefInfo(CS, Loc);
156 const char *MRString = 0;
158 case NoModRef: NoMR++; MRString =
"NoModRef";
break;
159 case Ref: JustRef++; MRString =
"JustRef";
break;
160 case Mod: JustMod++; MRString =
"JustMod";
break;
161 case ModRef: MR++; MRString =
"ModRef";
break;
165 errs() << MRString <<
": Ptr: ";
166 errs() <<
"[" << Loc.Size <<
"B] ";
static PassRegistry * getPassRegistry()
ModRefResult getModRefInfo(const Instruction *I, const Location &Loc)
The main container class for the LLVM Intermediate Representation.
void WriteAsOperand(raw_ostream &, const Value *, bool PrintTy=true, const Module *Context=0)
AnalysisUsage & addRequired()
INITIALIZE_AG_PASS(AliasAnalysisCounter, AliasAnalysis,"count-aa","Count Alias Analysis Query Responses", false, true, false) ModulePass *llvm
ModulePass * createAliasAnalysisCounterPass()
ID
LLVM Calling Convention Representation.
void initializeAliasAnalysisCounterPass(PassRegistry &)
static cl::opt< bool > PrintAllFailures("count-aa-print-all-failed-queries", cl::ReallyHidden)
initializer< Ty > init(const Ty &Val)
InstrTy * getInstruction() const
static cl::opt< bool > PrintAll("count-aa-print-all-queries", cl::ReallyHidden, cl::init(true))
static void printLine(raw_ostream &OS, const Twine &Prefix, char Fill, StringRef Suffix)
ImmutableCallSite - establish a view to a call site for examination.
virtual void getAnalysisUsage(AnalysisUsage &AU) const