- 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;
+char AliasAnalysisCounter::ID = 0;
+INITIALIZE_AG_PASS(AliasAnalysisCounter, AliasAnalysis, "count-aa",
+ "Count Alias Analysis Query Responses", false, true, false)
+
+ModulePass *llvm::createAliasAnalysisCounterPass() {
+ return new AliasAnalysisCounter();
+}
+
+AliasAnalysis::AliasResult
+AliasAnalysisCounter::alias(const Location &LocA, const Location &LocB) {
+ AliasResult R = getAnalysis<AliasAnalysis>().alias(LocA, LocB);
+
+ const char *AliasString = nullptr;
+ switch (R) {
+ case NoAlias: No++; AliasString = "No alias"; break;
+ case MayAlias: May++; AliasString = "May alias"; break;
+ case PartialAlias: Partial++; AliasString = "Partial alias"; break;
+ case MustAlias: Must++; AliasString = "Must alias"; break;
+ }
+
+ if (PrintAll || (PrintAllFailures && R == MayAlias)) {
+ errs() << AliasString << ":\t";
+ errs() << "[" << LocA.Size << "B] ";
+ LocA.Ptr->printAsOperand(errs(), true, M);
+ errs() << ", ";
+ errs() << "[" << LocB.Size << "B] ";
+ LocB.Ptr->printAsOperand(errs(), true, M);
+ errs() << "\n";
+ }
+
+ return R;
+}
+
+AliasAnalysis::ModRefResult
+AliasAnalysisCounter::getModRefInfo(ImmutableCallSite CS,
+ const Location &Loc) {
+ ModRefResult R = getAnalysis<AliasAnalysis>().getModRefInfo(CS, Loc);
+
+ const char *MRString = nullptr;
+ switch (R) {
+ case NoModRef: NoMR++; MRString = "NoModRef"; break;
+ case Ref: JustRef++; MRString = "JustRef"; break;
+ case Mod: JustMod++; MRString = "JustMod"; break;
+ case ModRef: MR++; MRString = "ModRef"; break;
+ }
+
+ if (PrintAll || (PrintAllFailures && R == ModRef)) {
+ errs() << MRString << ": Ptr: ";
+ errs() << "[" << Loc.Size << "B] ";
+ Loc.Ptr->printAsOperand(errs(), true, M);
+ errs() << "\t<->" << *CS.getInstruction() << '\n';
+ }
+ return R;