19798ca55e1c5e07b175dbb7bbae3b50dbffeec94Chris Lattner//===- AliasAnalysisEvaluator.cpp - Alias Analysis Accuracy Evaluator -----===//
22b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman//
3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//                     The LLVM Compiler Infrastructure
4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
72b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman//
8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===//
99798ca55e1c5e07b175dbb7bbae3b50dbffeec94Chris Lattner
10de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Analysis/AliasAnalysisEvaluator.h"
11d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/SetVector.h"
12d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Analysis/AliasAnalysis.h"
130b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Constants.h"
14f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm/IR/DataLayout.h"
150b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DerivedTypes.h"
160b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Function.h"
17f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm/IR/Module.h"
1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/InstIterator.h"
190b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Instructions.h"
20bc1dbe95b87a1931f9187597da26a1810250a40aMisha Brukman#include "llvm/Pass.h"
21d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/CommandLine.h"
2244d98a76dc5c41cd6e57b4a5cce73075120ce80aDavid Greene#include "llvm/Support/Debug.h"
23ce63ffb52f249b62cdf2d250c128007b13f27e71Daniel Dunbar#include "llvm/Support/raw_ostream.h"
249a4f8ef78757882ceb2edbf90f37439deb112c88Chris Lattnerusing namespace llvm;
25d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
26844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanstatic cl::opt<bool> PrintAll("print-all-alias-modref-info", cl::ReallyHidden);
270e872cb4707cbfc260279132e290ed595e47d2cdChris Lattner
28844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanstatic cl::opt<bool> PrintNoAlias("print-no-aliases", cl::ReallyHidden);
29844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanstatic cl::opt<bool> PrintMayAlias("print-may-aliases", cl::ReallyHidden);
303d9f1ca5afd909bfcea243fb27c96013a9134484Dan Gohmanstatic cl::opt<bool> PrintPartialAlias("print-partial-aliases", cl::ReallyHidden);
31844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanstatic cl::opt<bool> PrintMustAlias("print-must-aliases", cl::ReallyHidden);
32bc1dbe95b87a1931f9187597da26a1810250a40aMisha Brukman
33844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanstatic cl::opt<bool> PrintNoModRef("print-no-modref", cl::ReallyHidden);
34844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanstatic cl::opt<bool> PrintMod("print-mod", cl::ReallyHidden);
35844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanstatic cl::opt<bool> PrintRef("print-ref", cl::ReallyHidden);
36844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanstatic cl::opt<bool> PrintModRef("print-modref", cl::ReallyHidden);
37638b381713e32a0a9fb2a83c43b600683116df52Chris Lattner
3837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesstatic cl::opt<bool> EvalAAMD("evaluate-aa-metadata", cl::ReallyHidden);
39a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren
40791102fb1192ac9483274e54cbc42480c9b1af10Chris Lattnerstatic void PrintResults(const char *Msg, bool P, const Value *V1,
41791102fb1192ac9483274e54cbc42480c9b1af10Chris Lattner                         const Value *V2, const Module *M) {
42de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (PrintAll || P) {
43791102fb1192ac9483274e54cbc42480c9b1af10Chris Lattner    std::string o1, o2;
44791102fb1192ac9483274e54cbc42480c9b1af10Chris Lattner    {
45791102fb1192ac9483274e54cbc42480c9b1af10Chris Lattner      raw_string_ostream os1(o1), os2(o2);
4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      V1->printAsOperand(os1, true, M);
4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      V2->printAsOperand(os2, true, M);
48791102fb1192ac9483274e54cbc42480c9b1af10Chris Lattner    }
49791102fb1192ac9483274e54cbc42480c9b1af10Chris Lattner
50c0734e3c994b55d054916921ef2d5eb9bc04f28dGabor Greif    if (o2 < o1)
51ce63ffb52f249b62cdf2d250c128007b13f27e71Daniel Dunbar      std::swap(o1, o2);
524850a89b77e7dc677c2b73508f2a4c10386c844fDavid Greene    errs() << "  " << Msg << ":\t"
53ce63ffb52f249b62cdf2d250c128007b13f27e71Daniel Dunbar           << o1 << ", "
54ce63ffb52f249b62cdf2d250c128007b13f27e71Daniel Dunbar           << o2 << "\n";
55638b381713e32a0a9fb2a83c43b600683116df52Chris Lattner  }
56638b381713e32a0a9fb2a83c43b600683116df52Chris Lattner}
57638b381713e32a0a9fb2a83c43b600683116df52Chris Lattner
582b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukmanstatic inline void
59ad48cc71dcd218216e5e7df6d05c481946a65879Chris LattnerPrintModRefResults(const char *Msg, bool P, Instruction *I, Value *Ptr,
60ad48cc71dcd218216e5e7df6d05c481946a65879Chris Lattner                   Module *M) {
61de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (PrintAll || P) {
624850a89b77e7dc677c2b73508f2a4c10386c844fDavid Greene    errs() << "  " << Msg << ":  Ptr: ";
6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    Ptr->printAsOperand(errs(), true, M);
644850a89b77e7dc677c2b73508f2a4c10386c844fDavid Greene    errs() << "\t<->" << *I << '\n';
65ad48cc71dcd218216e5e7df6d05c481946a65879Chris Lattner  }
66ad48cc71dcd218216e5e7df6d05c481946a65879Chris Lattner}
67ad48cc71dcd218216e5e7df6d05c481946a65879Chris Lattner
683dcc91ee8c48f210d302937ecbbf0d277f8b656eDan Gohmanstatic inline void
693dcc91ee8c48f210d302937ecbbf0d277f8b656eDan GohmanPrintModRefResults(const char *Msg, bool P, CallSite CSA, CallSite CSB,
703dcc91ee8c48f210d302937ecbbf0d277f8b656eDan Gohman                   Module *M) {
71de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (PrintAll || P) {
723dcc91ee8c48f210d302937ecbbf0d277f8b656eDan Gohman    errs() << "  " << Msg << ": " << *CSA.getInstruction()
733dcc91ee8c48f210d302937ecbbf0d277f8b656eDan Gohman           << " <-> " << *CSB.getInstruction() << '\n';
743dcc91ee8c48f210d302937ecbbf0d277f8b656eDan Gohman  }
753dcc91ee8c48f210d302937ecbbf0d277f8b656eDan Gohman}
763dcc91ee8c48f210d302937ecbbf0d277f8b656eDan Gohman
77a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Renstatic inline void
78a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman RenPrintLoadStoreResults(const char *Msg, bool P, const Value *V1,
79a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren                      const Value *V2, const Module *M) {
80de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (PrintAll || P) {
81a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren    errs() << "  " << Msg << ": " << *V1
82a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren           << " <-> " << *V2 << '\n';
83a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren  }
84a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren}
85a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren
86fcf0f082f485e45f591c0d1cbaa9a2ad8691e2c3Gabor Greifstatic inline bool isInterestingPointer(Value *V) {
87fcf0f082f485e45f591c0d1cbaa9a2ad8691e2c3Gabor Greif  return V->getType()->isPointerTy()
88fcf0f082f485e45f591c0d1cbaa9a2ad8691e2c3Gabor Greif      && !isa<ConstantPointerNull>(V);
89fcf0f082f485e45f591c0d1cbaa9a2ad8691e2c3Gabor Greif}
90fcf0f082f485e45f591c0d1cbaa9a2ad8691e2c3Gabor Greif
91de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarPreservedAnalyses AAEvaluator::run(Function &F, AnalysisManager<Function> &AM) {
92de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  runInternal(F, AM.getResult<AAManager>(F));
93de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return PreservedAnalyses::all();
94de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
95de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
96de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid AAEvaluator::runInternal(Function &F, AAResults &AA) {
97f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const DataLayout &DL = F.getParent()->getDataLayout();
98de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
99de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ++FunctionCount;
1009e86f4364b912ae743490ba01d6989acfd12c046Dan Gohman
1019e86f4364b912ae743490ba01d6989acfd12c046Dan Gohman  SetVector<Value *> Pointers;
102f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  SmallSetVector<CallSite, 16> CallSites;
103a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren  SetVector<Value *> Loads;
104a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren  SetVector<Value *> Stores;
1059e86f4364b912ae743490ba01d6989acfd12c046Dan Gohman
106f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  for (auto &I : F.args())
107f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (I.getType()->isPointerTy())    // Add all pointer arguments.
108f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      Pointers.insert(&I);
1099798ca55e1c5e07b175dbb7bbae3b50dbffeec94Chris Lattner
1101842a90e0bf7b9137fb595828c6e07c5b629b2adChris Lattner  for (inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I) {
111fcf0f082f485e45f591c0d1cbaa9a2ad8691e2c3Gabor Greif    if (I->getType()->isPointerTy()) // Add all pointer instructions.
1126ffe551f657c948d6a473a198ecbd1188bf9ce45Chris Lattner      Pointers.insert(&*I);
11337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    if (EvalAAMD && isa<LoadInst>(&*I))
114a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren      Loads.insert(&*I);
11537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    if (EvalAAMD && isa<StoreInst>(&*I))
116a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren      Stores.insert(&*I);
117ddc77c458abaa920bb68564cba9e8b04d7b96172Chris Lattner    Instruction &Inst = *I;
1180c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    if (auto CS = CallSite(&Inst)) {
119fcf0f082f485e45f591c0d1cbaa9a2ad8691e2c3Gabor Greif      Value *Callee = CS.getCalledValue();
120fcf0f082f485e45f591c0d1cbaa9a2ad8691e2c3Gabor Greif      // Skip actual functions for direct function calls.
121fcf0f082f485e45f591c0d1cbaa9a2ad8691e2c3Gabor Greif      if (!isa<Function>(Callee) && isInterestingPointer(Callee))
122fcf0f082f485e45f591c0d1cbaa9a2ad8691e2c3Gabor Greif        Pointers.insert(Callee);
123fcf0f082f485e45f591c0d1cbaa9a2ad8691e2c3Gabor Greif      // Consider formals.
124de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      for (Use &DataOp : CS.data_ops())
125de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        if (isInterestingPointer(DataOp))
126de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          Pointers.insert(DataOp);
1275d4b32ef96ef91026517ea1769faa7066467d0a9Gabor Greif      CallSites.insert(CS);
128fcf0f082f485e45f591c0d1cbaa9a2ad8691e2c3Gabor Greif    } else {
129fcf0f082f485e45f591c0d1cbaa9a2ad8691e2c3Gabor Greif      // Consider all operands.
130fcf0f082f485e45f591c0d1cbaa9a2ad8691e2c3Gabor Greif      for (Instruction::op_iterator OI = Inst.op_begin(), OE = Inst.op_end();
131fcf0f082f485e45f591c0d1cbaa9a2ad8691e2c3Gabor Greif           OI != OE; ++OI)
132fcf0f082f485e45f591c0d1cbaa9a2ad8691e2c3Gabor Greif        if (isInterestingPointer(*OI))
133fcf0f082f485e45f591c0d1cbaa9a2ad8691e2c3Gabor Greif          Pointers.insert(*OI);
134fcf0f082f485e45f591c0d1cbaa9a2ad8691e2c3Gabor Greif    }
135bc1dbe95b87a1931f9187597da26a1810250a40aMisha Brukman  }
136bc1dbe95b87a1931f9187597da26a1810250a40aMisha Brukman
137de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (PrintAll || PrintNoAlias || PrintMayAlias || PrintPartialAlias ||
138de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      PrintMustAlias || PrintNoModRef || PrintMod || PrintRef || PrintModRef)
1399e86f4364b912ae743490ba01d6989acfd12c046Dan Gohman    errs() << "Function: " << F.getName() << ": " << Pointers.size()
1409e86f4364b912ae743490ba01d6989acfd12c046Dan Gohman           << " pointers, " << CallSites.size() << " call sites\n";
141638b381713e32a0a9fb2a83c43b600683116df52Chris Lattner
1429798ca55e1c5e07b175dbb7bbae3b50dbffeec94Chris Lattner  // iterate over the worklist, and run the full (n^2)/2 disambiguations
143a8c711cb235bf2705a4dbfbe34b23e6c57451c58Dan Gohman  for (SetVector<Value *>::iterator I1 = Pointers.begin(), E = Pointers.end();
1441ed80b66b192ce695431b14eecc5121ef057251bChris Lattner       I1 != E; ++I1) {
145f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    uint64_t I1Size = MemoryLocation::UnknownSize;
146db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner    Type *I1ElTy = cast<PointerType>((*I1)->getType())->getElementType();
147f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if (I1ElTy->isSized()) I1Size = DL.getTypeStoreSize(I1ElTy);
1481ed80b66b192ce695431b14eecc5121ef057251bChris Lattner
149a8c711cb235bf2705a4dbfbe34b23e6c57451c58Dan Gohman    for (SetVector<Value *>::iterator I2 = Pointers.begin(); I2 != I1; ++I2) {
150f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      uint64_t I2Size = MemoryLocation::UnknownSize;
151db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner      Type *I2ElTy =cast<PointerType>((*I2)->getType())->getElementType();
152f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      if (I2ElTy->isSized()) I2Size = DL.getTypeStoreSize(I2ElTy);
1531ed80b66b192ce695431b14eecc5121ef057251bChris Lattner
1549e86f4364b912ae743490ba01d6989acfd12c046Dan Gohman      switch (AA.alias(*I1, I1Size, *I2, I2Size)) {
155f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      case NoAlias:
1569e86f4364b912ae743490ba01d6989acfd12c046Dan Gohman        PrintResults("NoAlias", PrintNoAlias, *I1, *I2, F.getParent());
157f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        ++NoAliasCount;
158f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        break;
159f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      case MayAlias:
1609e86f4364b912ae743490ba01d6989acfd12c046Dan Gohman        PrintResults("MayAlias", PrintMayAlias, *I1, *I2, F.getParent());
161f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        ++MayAliasCount;
162f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        break;
163f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      case PartialAlias:
1643d9f1ca5afd909bfcea243fb27c96013a9134484Dan Gohman        PrintResults("PartialAlias", PrintPartialAlias, *I1, *I2,
1653d9f1ca5afd909bfcea243fb27c96013a9134484Dan Gohman                     F.getParent());
166f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        ++PartialAliasCount;
167f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        break;
168f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      case MustAlias:
1699e86f4364b912ae743490ba01d6989acfd12c046Dan Gohman        PrintResults("MustAlias", PrintMustAlias, *I1, *I2, F.getParent());
170f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        ++MustAliasCount;
171f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        break;
1729798ca55e1c5e07b175dbb7bbae3b50dbffeec94Chris Lattner      }
1731ed80b66b192ce695431b14eecc5121ef057251bChris Lattner    }
1741ed80b66b192ce695431b14eecc5121ef057251bChris Lattner  }
1759798ca55e1c5e07b175dbb7bbae3b50dbffeec94Chris Lattner
17637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  if (EvalAAMD) {
177a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren    // iterate over all pairs of load, store
178de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    for (Value *Load : Loads) {
179de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      for (Value *Store : Stores) {
180de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        switch (AA.alias(MemoryLocation::get(cast<LoadInst>(Load)),
181de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                         MemoryLocation::get(cast<StoreInst>(Store)))) {
182f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        case NoAlias:
183de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          PrintLoadStoreResults("NoAlias", PrintNoAlias, Load, Store,
184a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren                                F.getParent());
185f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          ++NoAliasCount;
186f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          break;
187f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        case MayAlias:
188de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          PrintLoadStoreResults("MayAlias", PrintMayAlias, Load, Store,
189a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren                                F.getParent());
190f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          ++MayAliasCount;
191f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          break;
192f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        case PartialAlias:
193de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          PrintLoadStoreResults("PartialAlias", PrintPartialAlias, Load, Store,
194a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren                                F.getParent());
195f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          ++PartialAliasCount;
196f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          break;
197f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        case MustAlias:
198de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          PrintLoadStoreResults("MustAlias", PrintMustAlias, Load, Store,
199a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren                                F.getParent());
200f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          ++MustAliasCount;
201f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          break;
202a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren        }
203a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren      }
204a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren    }
205a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren
206a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren    // iterate over all pairs of store, store
207a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren    for (SetVector<Value *>::iterator I1 = Stores.begin(), E = Stores.end();
208a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren         I1 != E; ++I1) {
209a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren      for (SetVector<Value *>::iterator I2 = Stores.begin(); I2 != I1; ++I2) {
2106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        switch (AA.alias(MemoryLocation::get(cast<StoreInst>(*I1)),
2116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                         MemoryLocation::get(cast<StoreInst>(*I2)))) {
212f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        case NoAlias:
213a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren          PrintLoadStoreResults("NoAlias", PrintNoAlias, *I1, *I2,
214a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren                                F.getParent());
215f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          ++NoAliasCount;
216f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          break;
217f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        case MayAlias:
218a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren          PrintLoadStoreResults("MayAlias", PrintMayAlias, *I1, *I2,
219a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren                                F.getParent());
220f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          ++MayAliasCount;
221f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          break;
222f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        case PartialAlias:
223a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren          PrintLoadStoreResults("PartialAlias", PrintPartialAlias, *I1, *I2,
224a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren                                F.getParent());
225f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          ++PartialAliasCount;
226f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          break;
227f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        case MustAlias:
228a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren          PrintLoadStoreResults("MustAlias", PrintMustAlias, *I1, *I2,
229a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren                                F.getParent());
230f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          ++MustAliasCount;
231f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          break;
232a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren        }
233a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren      }
234a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren    }
235a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren  }
236a2e3834d1644889484ef3a8a94189b7369e3eaf9Manman Ren
237bc1dbe95b87a1931f9187597da26a1810250a40aMisha Brukman  // Mod/ref alias analysis: compare all pairs of calls and values
238de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (CallSite C : CallSites) {
239de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Instruction *I = C.getInstruction();
2402b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman
241de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    for (auto Pointer : Pointers) {
242f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      uint64_t Size = MemoryLocation::UnknownSize;
243de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Type *ElTy = cast<PointerType>(Pointer->getType())->getElementType();
244f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      if (ElTy->isSized()) Size = DL.getTypeStoreSize(ElTy);
2452b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman
246de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      switch (AA.getModRefInfo(C, Pointer, Size)) {
247f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      case MRI_NoModRef:
248de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        PrintModRefResults("NoModRef", PrintNoModRef, I, Pointer,
249de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                           F.getParent());
250f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        ++NoModRefCount;
251f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        break;
252f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      case MRI_Mod:
253de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        PrintModRefResults("Just Mod", PrintMod, I, Pointer, F.getParent());
254f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        ++ModCount;
255f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        break;
256f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      case MRI_Ref:
257de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        PrintModRefResults("Just Ref", PrintRef, I, Pointer, F.getParent());
258f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        ++RefCount;
259f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        break;
260f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      case MRI_ModRef:
261de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        PrintModRefResults("Both ModRef", PrintModRef, I, Pointer,
262de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                           F.getParent());
263f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        ++ModRefCount;
264f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        break;
265bc1dbe95b87a1931f9187597da26a1810250a40aMisha Brukman      }
2661ed80b66b192ce695431b14eecc5121ef057251bChris Lattner    }
267cb19d679076724a86b62a1821e422ad69ab3d9c5Chris Lattner  }
2682b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman
2693dcc91ee8c48f210d302937ecbbf0d277f8b656eDan Gohman  // Mod/ref alias analysis: compare all pairs of calls
270f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  for (auto C = CallSites.begin(), Ce = CallSites.end(); C != Ce; ++C) {
271f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    for (auto D = CallSites.begin(); D != Ce; ++D) {
2723dcc91ee8c48f210d302937ecbbf0d277f8b656eDan Gohman      if (D == C)
2733dcc91ee8c48f210d302937ecbbf0d277f8b656eDan Gohman        continue;
2743dcc91ee8c48f210d302937ecbbf0d277f8b656eDan Gohman      switch (AA.getModRefInfo(*C, *D)) {
275f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      case MRI_NoModRef:
2763dcc91ee8c48f210d302937ecbbf0d277f8b656eDan Gohman        PrintModRefResults("NoModRef", PrintNoModRef, *C, *D, F.getParent());
277f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        ++NoModRefCount;
278f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        break;
279f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      case MRI_Mod:
280907857d74630430be024cbb67da960147fa7a1d9Dan Gohman        PrintModRefResults("Just Mod", PrintMod, *C, *D, F.getParent());
281f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        ++ModCount;
282f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        break;
283f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      case MRI_Ref:
284907857d74630430be024cbb67da960147fa7a1d9Dan Gohman        PrintModRefResults("Just Ref", PrintRef, *C, *D, F.getParent());
285f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        ++RefCount;
286f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        break;
287f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      case MRI_ModRef:
288907857d74630430be024cbb67da960147fa7a1d9Dan Gohman        PrintModRefResults("Both ModRef", PrintModRef, *C, *D, F.getParent());
289f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        ++ModRefCount;
290f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        break;
2913dcc91ee8c48f210d302937ecbbf0d277f8b656eDan Gohman      }
2923dcc91ee8c48f210d302937ecbbf0d277f8b656eDan Gohman    }
2933dcc91ee8c48f210d302937ecbbf0d277f8b656eDan Gohman  }
2949798ca55e1c5e07b175dbb7bbae3b50dbffeec94Chris Lattner}
2959798ca55e1c5e07b175dbb7bbae3b50dbffeec94Chris Lattner
296de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic void PrintPercent(int64_t Num, int64_t Sum) {
297de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  errs() << "(" << Num * 100LL / Sum << "." << ((Num * 1000LL / Sum) % 10)
298de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar         << "%)\n";
299e70492d0e298487f9cb8dd37cfcf9c4a060cc21cChris Lattner}
300e70492d0e298487f9cb8dd37cfcf9c4a060cc21cChris Lattner
301de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarAAEvaluator::~AAEvaluator() {
302de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (FunctionCount == 0)
303de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return;
304de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
305de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  int64_t AliasSum =
306f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      NoAliasCount + MayAliasCount + PartialAliasCount + MustAliasCount;
3074850a89b77e7dc677c2b73508f2a4c10386c844fDavid Greene  errs() << "===== Alias Analysis Evaluator Report =====\n";
308bc1dbe95b87a1931f9187597da26a1810250a40aMisha Brukman  if (AliasSum == 0) {
3094850a89b77e7dc677c2b73508f2a4c10386c844fDavid Greene    errs() << "  Alias Analysis Evaluator Summary: No pointers!\n";
3102b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman  } else {
3114850a89b77e7dc677c2b73508f2a4c10386c844fDavid Greene    errs() << "  " << AliasSum << " Total Alias Queries Performed\n";
312f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    errs() << "  " << NoAliasCount << " no alias responses ";
313f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    PrintPercent(NoAliasCount, AliasSum);
314f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    errs() << "  " << MayAliasCount << " may alias responses ";
315f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    PrintPercent(MayAliasCount, AliasSum);
316f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    errs() << "  " << PartialAliasCount << " partial alias responses ";
317f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    PrintPercent(PartialAliasCount, AliasSum);
318f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    errs() << "  " << MustAliasCount << " must alias responses ";
319f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    PrintPercent(MustAliasCount, AliasSum);
3204850a89b77e7dc677c2b73508f2a4c10386c844fDavid Greene    errs() << "  Alias Analysis Evaluator Pointer Alias Summary: "
321f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar           << NoAliasCount * 100 / AliasSum << "%/"
322f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar           << MayAliasCount * 100 / AliasSum << "%/"
323f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar           << PartialAliasCount * 100 / AliasSum << "%/"
324f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar           << MustAliasCount * 100 / AliasSum << "%\n";
325bc1dbe95b87a1931f9187597da26a1810250a40aMisha Brukman  }
326bc1dbe95b87a1931f9187597da26a1810250a40aMisha Brukman
327bc1dbe95b87a1931f9187597da26a1810250a40aMisha Brukman  // Display the summary for mod/ref analysis
328de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  int64_t ModRefSum = NoModRefCount + ModCount + RefCount + ModRefCount;
329bc1dbe95b87a1931f9187597da26a1810250a40aMisha Brukman  if (ModRefSum == 0) {
330f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    errs() << "  Alias Analysis Mod/Ref Evaluator Summary: no "
331f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar              "mod/ref!\n";
332bc1dbe95b87a1931f9187597da26a1810250a40aMisha Brukman  } else {
3334850a89b77e7dc677c2b73508f2a4c10386c844fDavid Greene    errs() << "  " << ModRefSum << " Total ModRef Queries Performed\n";
334f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    errs() << "  " << NoModRefCount << " no mod/ref responses ";
335f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    PrintPercent(NoModRefCount, ModRefSum);
336f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    errs() << "  " << ModCount << " mod responses ";
337f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    PrintPercent(ModCount, ModRefSum);
338f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    errs() << "  " << RefCount << " ref responses ";
339f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    PrintPercent(RefCount, ModRefSum);
340f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    errs() << "  " << ModRefCount << " mod & ref responses ";
341f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    PrintPercent(ModRefCount, ModRefSum);
3424850a89b77e7dc677c2b73508f2a4c10386c844fDavid Greene    errs() << "  Alias Analysis Evaluator Mod/Ref Summary: "
343f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar           << NoModRefCount * 100 / ModRefSum << "%/"
344f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar           << ModCount * 100 / ModRefSum << "%/" << RefCount * 100 / ModRefSum
345f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar           << "%/" << ModRefCount * 100 / ModRefSum << "%\n";
3462c1d7cf13b3c049c40627416315841ccbe6b123fChris Lattner  }
347de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
3489e86f4364b912ae743490ba01d6989acfd12c046Dan Gohman
349de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarnamespace llvm {
350de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass AAEvalLegacyPass : public FunctionPass {
351de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::unique_ptr<AAEvaluator> P;
352de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
353de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
354de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  static char ID; // Pass identification, replacement for typeid
355de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  AAEvalLegacyPass() : FunctionPass(ID) {
356de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    initializeAAEvalLegacyPassPass(*PassRegistry::getPassRegistry());
357de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
358de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
359de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void getAnalysisUsage(AnalysisUsage &AU) const override {
360de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    AU.addRequired<AAResultsWrapperPass>();
361de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    AU.setPreservesAll();
362de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
363de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
364de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool doInitialization(Module &M) override {
365de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    P.reset(new AAEvaluator());
366de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return false;
367de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
368de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
369de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool runOnFunction(Function &F) override {
370de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    P->runInternal(F, getAnalysis<AAResultsWrapperPass>().getAAResults());
371de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return false;
372de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
373de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool doFinalization(Module &M) override {
374de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    P.reset();
375de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return false;
376de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
377de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
3789798ca55e1c5e07b175dbb7bbae3b50dbffeec94Chris Lattner}
379de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
380de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarchar AAEvalLegacyPass::ID = 0;
381de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarINITIALIZE_PASS_BEGIN(AAEvalLegacyPass, "aa-eval",
382de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                      "Exhaustive Alias Analysis Precision Evaluator", false,
383de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                      true)
384de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarINITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)
385de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarINITIALIZE_PASS_END(AAEvalLegacyPass, "aa-eval",
386de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                    "Exhaustive Alias Analysis Precision Evaluator", false,
387de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                    true)
388de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
389de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarFunctionPass *llvm::createAAEvalPass() { return new AAEvalLegacyPass(); }
390