Home | History | Annotate | Download | only in Analysis
      1 //===- AliasSetTracker.cpp - Alias Sets Tracker implementation-------------===//
      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 the AliasSetTracker and AliasSet classes.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "llvm/Analysis/AliasSetTracker.h"
     15 #include "llvm/Analysis/AliasAnalysis.h"
     16 #include "llvm/IR/DataLayout.h"
     17 #include "llvm/IR/InstIterator.h"
     18 #include "llvm/IR/Instructions.h"
     19 #include "llvm/IR/IntrinsicInst.h"
     20 #include "llvm/IR/Module.h"
     21 #include "llvm/IR/LLVMContext.h"
     22 #include "llvm/IR/Type.h"
     23 #include "llvm/Pass.h"
     24 #include "llvm/Support/Debug.h"
     25 #include "llvm/Support/ErrorHandling.h"
     26 #include "llvm/Support/raw_ostream.h"
     27 using namespace llvm;
     28 
     29 /// mergeSetIn - Merge the specified alias set into this alias set.
     30 ///
     31 void AliasSet::mergeSetIn(AliasSet &AS, AliasSetTracker &AST) {
     32   assert(!AS.Forward && "Alias set is already forwarding!");
     33   assert(!Forward && "This set is a forwarding set!!");
     34 
     35   // Update the alias and access types of this set...
     36   Access |= AS.Access;
     37   Alias  |= AS.Alias;
     38   Volatile |= AS.Volatile;
     39 
     40   if (Alias == SetMustAlias) {
     41     // Check that these two merged sets really are must aliases.  Since both
     42     // used to be must-alias sets, we can just check any pointer from each set
     43     // for aliasing.
     44     AliasAnalysis &AA = AST.getAliasAnalysis();
     45     PointerRec *L = getSomePointer();
     46     PointerRec *R = AS.getSomePointer();
     47 
     48     // If the pointers are not a must-alias pair, this set becomes a may alias.
     49     if (AA.alias(MemoryLocation(L->getValue(), L->getSize(), L->getAAInfo()),
     50                  MemoryLocation(R->getValue(), R->getSize(), R->getAAInfo())) !=
     51         MustAlias)
     52       Alias = SetMayAlias;
     53   }
     54 
     55   bool ASHadUnknownInsts = !AS.UnknownInsts.empty();
     56   if (UnknownInsts.empty()) {            // Merge call sites...
     57     if (ASHadUnknownInsts) {
     58       std::swap(UnknownInsts, AS.UnknownInsts);
     59       addRef();
     60     }
     61   } else if (ASHadUnknownInsts) {
     62     UnknownInsts.insert(UnknownInsts.end(), AS.UnknownInsts.begin(), AS.UnknownInsts.end());
     63     AS.UnknownInsts.clear();
     64   }
     65 
     66   AS.Forward = this;  // Forward across AS now...
     67   addRef();           // AS is now pointing to us...
     68 
     69   // Merge the list of constituent pointers...
     70   if (AS.PtrList) {
     71     *PtrListEnd = AS.PtrList;
     72     AS.PtrList->setPrevInList(PtrListEnd);
     73     PtrListEnd = AS.PtrListEnd;
     74 
     75     AS.PtrList = nullptr;
     76     AS.PtrListEnd = &AS.PtrList;
     77     assert(*AS.PtrListEnd == nullptr && "End of list is not null?");
     78   }
     79   if (ASHadUnknownInsts)
     80     AS.dropRef(AST);
     81 }
     82 
     83 void AliasSetTracker::removeAliasSet(AliasSet *AS) {
     84   if (AliasSet *Fwd = AS->Forward) {
     85     Fwd->dropRef(*this);
     86     AS->Forward = nullptr;
     87   }
     88   AliasSets.erase(AS);
     89 }
     90 
     91 void AliasSet::removeFromTracker(AliasSetTracker &AST) {
     92   assert(RefCount == 0 && "Cannot remove non-dead alias set from tracker!");
     93   AST.removeAliasSet(this);
     94 }
     95 
     96 void AliasSet::addPointer(AliasSetTracker &AST, PointerRec &Entry,
     97                           uint64_t Size, const AAMDNodes &AAInfo,
     98                           bool KnownMustAlias) {
     99   assert(!Entry.hasAliasSet() && "Entry already in set!");
    100 
    101   // Check to see if we have to downgrade to _may_ alias.
    102   if (isMustAlias() && !KnownMustAlias)
    103     if (PointerRec *P = getSomePointer()) {
    104       AliasAnalysis &AA = AST.getAliasAnalysis();
    105       AliasResult Result =
    106           AA.alias(MemoryLocation(P->getValue(), P->getSize(), P->getAAInfo()),
    107                    MemoryLocation(Entry.getValue(), Size, AAInfo));
    108       if (Result != MustAlias)
    109         Alias = SetMayAlias;
    110       else                  // First entry of must alias must have maximum size!
    111         P->updateSizeAndAAInfo(Size, AAInfo);
    112       assert(Result != NoAlias && "Cannot be part of must set!");
    113     }
    114 
    115   Entry.setAliasSet(this);
    116   Entry.updateSizeAndAAInfo(Size, AAInfo);
    117 
    118   // Add it to the end of the list...
    119   assert(*PtrListEnd == nullptr && "End of list is not null?");
    120   *PtrListEnd = &Entry;
    121   PtrListEnd = Entry.setPrevInList(PtrListEnd);
    122   assert(*PtrListEnd == nullptr && "End of list is not null?");
    123   addRef();               // Entry points to alias set.
    124 }
    125 
    126 void AliasSet::addUnknownInst(Instruction *I, AliasAnalysis &AA) {
    127   if (UnknownInsts.empty())
    128     addRef();
    129   UnknownInsts.emplace_back(I);
    130 
    131   if (!I->mayWriteToMemory()) {
    132     Alias = SetMayAlias;
    133     Access |= RefAccess;
    134     return;
    135   }
    136 
    137   // FIXME: This should use mod/ref information to make this not suck so bad
    138   Alias = SetMayAlias;
    139   Access = ModRefAccess;
    140 }
    141 
    142 /// aliasesPointer - Return true if the specified pointer "may" (or must)
    143 /// alias one of the members in the set.
    144 ///
    145 bool AliasSet::aliasesPointer(const Value *Ptr, uint64_t Size,
    146                               const AAMDNodes &AAInfo,
    147                               AliasAnalysis &AA) const {
    148   if (Alias == SetMustAlias) {
    149     assert(UnknownInsts.empty() && "Illegal must alias set!");
    150 
    151     // If this is a set of MustAliases, only check to see if the pointer aliases
    152     // SOME value in the set.
    153     PointerRec *SomePtr = getSomePointer();
    154     assert(SomePtr && "Empty must-alias set??");
    155     return AA.alias(MemoryLocation(SomePtr->getValue(), SomePtr->getSize(),
    156                                    SomePtr->getAAInfo()),
    157                     MemoryLocation(Ptr, Size, AAInfo));
    158   }
    159 
    160   // If this is a may-alias set, we have to check all of the pointers in the set
    161   // to be sure it doesn't alias the set...
    162   for (iterator I = begin(), E = end(); I != E; ++I)
    163     if (AA.alias(MemoryLocation(Ptr, Size, AAInfo),
    164                  MemoryLocation(I.getPointer(), I.getSize(), I.getAAInfo())))
    165       return true;
    166 
    167   // Check the unknown instructions...
    168   if (!UnknownInsts.empty()) {
    169     for (unsigned i = 0, e = UnknownInsts.size(); i != e; ++i)
    170       if (AA.getModRefInfo(UnknownInsts[i],
    171                            MemoryLocation(Ptr, Size, AAInfo)) != MRI_NoModRef)
    172         return true;
    173   }
    174 
    175   return false;
    176 }
    177 
    178 bool AliasSet::aliasesUnknownInst(const Instruction *Inst,
    179                                   AliasAnalysis &AA) const {
    180   if (!Inst->mayReadOrWriteMemory())
    181     return false;
    182 
    183   for (unsigned i = 0, e = UnknownInsts.size(); i != e; ++i) {
    184     ImmutableCallSite C1(getUnknownInst(i)), C2(Inst);
    185     if (!C1 || !C2 || AA.getModRefInfo(C1, C2) != MRI_NoModRef ||
    186         AA.getModRefInfo(C2, C1) != MRI_NoModRef)
    187       return true;
    188   }
    189 
    190   for (iterator I = begin(), E = end(); I != E; ++I)
    191     if (AA.getModRefInfo(Inst, MemoryLocation(I.getPointer(), I.getSize(),
    192                                               I.getAAInfo())) != MRI_NoModRef)
    193       return true;
    194 
    195   return false;
    196 }
    197 
    198 void AliasSetTracker::clear() {
    199   // Delete all the PointerRec entries.
    200   for (PointerMapType::iterator I = PointerMap.begin(), E = PointerMap.end();
    201        I != E; ++I)
    202     I->second->eraseFromList();
    203 
    204   PointerMap.clear();
    205 
    206   // The alias sets should all be clear now.
    207   AliasSets.clear();
    208 }
    209 
    210 
    211 /// mergeAliasSetsForPointer - Given a pointer, merge all alias sets that may
    212 /// alias the pointer. Return the unified set, or nullptr if no set that aliases
    213 /// the pointer was found.
    214 AliasSet *AliasSetTracker::mergeAliasSetsForPointer(const Value *Ptr,
    215                                                     uint64_t Size,
    216                                                     const AAMDNodes &AAInfo) {
    217   AliasSet *FoundSet = nullptr;
    218   for (iterator I = begin(), E = end(); I != E;) {
    219     iterator Cur = I++;
    220     if (Cur->Forward || !Cur->aliasesPointer(Ptr, Size, AAInfo, AA)) continue;
    221 
    222     if (!FoundSet) {      // If this is the first alias set ptr can go into.
    223       FoundSet = &*Cur;   // Remember it.
    224     } else {              // Otherwise, we must merge the sets.
    225       FoundSet->mergeSetIn(*Cur, *this);     // Merge in contents.
    226     }
    227   }
    228 
    229   return FoundSet;
    230 }
    231 
    232 /// containsPointer - Return true if the specified location is represented by
    233 /// this alias set, false otherwise.  This does not modify the AST object or
    234 /// alias sets.
    235 bool AliasSetTracker::containsPointer(const Value *Ptr, uint64_t Size,
    236                                       const AAMDNodes &AAInfo) const {
    237   for (const AliasSet &AS : *this)
    238     if (!AS.Forward && AS.aliasesPointer(Ptr, Size, AAInfo, AA))
    239       return true;
    240   return false;
    241 }
    242 
    243 bool AliasSetTracker::containsUnknown(const Instruction *Inst) const {
    244   for (const AliasSet &AS : *this)
    245     if (!AS.Forward && AS.aliasesUnknownInst(Inst, AA))
    246       return true;
    247   return false;
    248 }
    249 
    250 AliasSet *AliasSetTracker::findAliasSetForUnknownInst(Instruction *Inst) {
    251   AliasSet *FoundSet = nullptr;
    252   for (iterator I = begin(), E = end(); I != E;) {
    253     iterator Cur = I++;
    254     if (Cur->Forward || !Cur->aliasesUnknownInst(Inst, AA))
    255       continue;
    256     if (!FoundSet)            // If this is the first alias set ptr can go into.
    257       FoundSet = &*Cur;       // Remember it.
    258     else if (!Cur->Forward)   // Otherwise, we must merge the sets.
    259       FoundSet->mergeSetIn(*Cur, *this);     // Merge in contents.
    260   }
    261   return FoundSet;
    262 }
    263 
    264 
    265 
    266 
    267 /// getAliasSetForPointer - Return the alias set that the specified pointer
    268 /// lives in.
    269 AliasSet &AliasSetTracker::getAliasSetForPointer(Value *Pointer, uint64_t Size,
    270                                                  const AAMDNodes &AAInfo,
    271                                                  bool *New) {
    272   AliasSet::PointerRec &Entry = getEntryFor(Pointer);
    273 
    274   // Check to see if the pointer is already known.
    275   if (Entry.hasAliasSet()) {
    276     // If the size changed, we may need to merge several alias sets.
    277     // Note that we can *not* return the result of mergeAliasSetsForPointer
    278     // due to a quirk of alias analysis behavior. Since alias(undef, undef)
    279     // is NoAlias, mergeAliasSetsForPointer(undef, ...) will not find the
    280     // the right set for undef, even if it exists.
    281     if (Entry.updateSizeAndAAInfo(Size, AAInfo))
    282       mergeAliasSetsForPointer(Pointer, Size, AAInfo);
    283     // Return the set!
    284     return *Entry.getAliasSet(*this)->getForwardedTarget(*this);
    285   }
    286 
    287   if (AliasSet *AS = mergeAliasSetsForPointer(Pointer, Size, AAInfo)) {
    288     // Add it to the alias set it aliases.
    289     AS->addPointer(*this, Entry, Size, AAInfo);
    290     return *AS;
    291   }
    292 
    293   if (New) *New = true;
    294   // Otherwise create a new alias set to hold the loaded pointer.
    295   AliasSets.push_back(new AliasSet());
    296   AliasSets.back().addPointer(*this, Entry, Size, AAInfo);
    297   return AliasSets.back();
    298 }
    299 
    300 bool AliasSetTracker::add(Value *Ptr, uint64_t Size, const AAMDNodes &AAInfo) {
    301   bool NewPtr;
    302   addPointer(Ptr, Size, AAInfo, AliasSet::NoAccess, NewPtr);
    303   return NewPtr;
    304 }
    305 
    306 
    307 bool AliasSetTracker::add(LoadInst *LI) {
    308   if (isStrongerThanMonotonic(LI->getOrdering())) return addUnknown(LI);
    309 
    310   AAMDNodes AAInfo;
    311   LI->getAAMetadata(AAInfo);
    312 
    313   AliasSet::AccessLattice Access = AliasSet::RefAccess;
    314   bool NewPtr;
    315   const DataLayout &DL = LI->getModule()->getDataLayout();
    316   AliasSet &AS = addPointer(LI->getOperand(0),
    317                             DL.getTypeStoreSize(LI->getType()),
    318                             AAInfo, Access, NewPtr);
    319   if (LI->isVolatile()) AS.setVolatile();
    320   return NewPtr;
    321 }
    322 
    323 bool AliasSetTracker::add(StoreInst *SI) {
    324   if (isStrongerThanMonotonic(SI->getOrdering())) return addUnknown(SI);
    325 
    326   AAMDNodes AAInfo;
    327   SI->getAAMetadata(AAInfo);
    328 
    329   AliasSet::AccessLattice Access = AliasSet::ModAccess;
    330   bool NewPtr;
    331   const DataLayout &DL = SI->getModule()->getDataLayout();
    332   Value *Val = SI->getOperand(0);
    333   AliasSet &AS = addPointer(SI->getOperand(1),
    334                             DL.getTypeStoreSize(Val->getType()),
    335                             AAInfo, Access, NewPtr);
    336   if (SI->isVolatile()) AS.setVolatile();
    337   return NewPtr;
    338 }
    339 
    340 bool AliasSetTracker::add(VAArgInst *VAAI) {
    341   AAMDNodes AAInfo;
    342   VAAI->getAAMetadata(AAInfo);
    343 
    344   bool NewPtr;
    345   addPointer(VAAI->getOperand(0), MemoryLocation::UnknownSize, AAInfo,
    346              AliasSet::ModRefAccess, NewPtr);
    347   return NewPtr;
    348 }
    349 
    350 bool AliasSetTracker::add(MemSetInst *MSI) {
    351   AAMDNodes AAInfo;
    352   MSI->getAAMetadata(AAInfo);
    353 
    354   bool NewPtr;
    355   uint64_t Len;
    356 
    357   if (ConstantInt *C = dyn_cast<ConstantInt>(MSI->getLength()))
    358     Len = C->getZExtValue();
    359   else
    360     Len = MemoryLocation::UnknownSize;
    361 
    362   AliasSet &AS =
    363       addPointer(MSI->getRawDest(), Len, AAInfo, AliasSet::ModAccess, NewPtr);
    364   if (MSI->isVolatile())
    365     AS.setVolatile();
    366   return NewPtr;
    367 }
    368 
    369 bool AliasSetTracker::addUnknown(Instruction *Inst) {
    370   if (isa<DbgInfoIntrinsic>(Inst))
    371     return true; // Ignore DbgInfo Intrinsics.
    372   if (!Inst->mayReadOrWriteMemory())
    373     return true; // doesn't alias anything
    374 
    375   AliasSet *AS = findAliasSetForUnknownInst(Inst);
    376   if (AS) {
    377     AS->addUnknownInst(Inst, AA);
    378     return false;
    379   }
    380   AliasSets.push_back(new AliasSet());
    381   AS = &AliasSets.back();
    382   AS->addUnknownInst(Inst, AA);
    383   return true;
    384 }
    385 
    386 bool AliasSetTracker::add(Instruction *I) {
    387   // Dispatch to one of the other add methods.
    388   if (LoadInst *LI = dyn_cast<LoadInst>(I))
    389     return add(LI);
    390   if (StoreInst *SI = dyn_cast<StoreInst>(I))
    391     return add(SI);
    392   if (VAArgInst *VAAI = dyn_cast<VAArgInst>(I))
    393     return add(VAAI);
    394   if (MemSetInst *MSI = dyn_cast<MemSetInst>(I))
    395     return add(MSI);
    396   return addUnknown(I);
    397   // FIXME: add support of memcpy and memmove.
    398 }
    399 
    400 void AliasSetTracker::add(BasicBlock &BB) {
    401   for (auto &I : BB)
    402     add(&I);
    403 }
    404 
    405 void AliasSetTracker::add(const AliasSetTracker &AST) {
    406   assert(&AA == &AST.AA &&
    407          "Merging AliasSetTracker objects with different Alias Analyses!");
    408 
    409   // Loop over all of the alias sets in AST, adding the pointers contained
    410   // therein into the current alias sets.  This can cause alias sets to be
    411   // merged together in the current AST.
    412   for (const AliasSet &AS : AST) {
    413     if (AS.Forward)
    414       continue; // Ignore forwarding alias sets
    415 
    416     // If there are any call sites in the alias set, add them to this AST.
    417     for (unsigned i = 0, e = AS.UnknownInsts.size(); i != e; ++i)
    418       add(AS.UnknownInsts[i]);
    419 
    420     // Loop over all of the pointers in this alias set.
    421     bool X;
    422     for (AliasSet::iterator ASI = AS.begin(), E = AS.end(); ASI != E; ++ASI) {
    423       AliasSet &NewAS = addPointer(ASI.getPointer(), ASI.getSize(),
    424                                    ASI.getAAInfo(),
    425                                    (AliasSet::AccessLattice)AS.Access, X);
    426       if (AS.isVolatile()) NewAS.setVolatile();
    427     }
    428   }
    429 }
    430 
    431 /// remove - Remove the specified (potentially non-empty) alias set from the
    432 /// tracker.
    433 void AliasSetTracker::remove(AliasSet &AS) {
    434   // Drop all call sites.
    435   if (!AS.UnknownInsts.empty())
    436     AS.dropRef(*this);
    437   AS.UnknownInsts.clear();
    438 
    439   // Clear the alias set.
    440   unsigned NumRefs = 0;
    441   while (!AS.empty()) {
    442     AliasSet::PointerRec *P = AS.PtrList;
    443 
    444     Value *ValToRemove = P->getValue();
    445 
    446     // Unlink and delete entry from the list of values.
    447     P->eraseFromList();
    448 
    449     // Remember how many references need to be dropped.
    450     ++NumRefs;
    451 
    452     // Finally, remove the entry.
    453     PointerMap.erase(ValToRemove);
    454   }
    455 
    456   // Stop using the alias set, removing it.
    457   AS.RefCount -= NumRefs;
    458   if (AS.RefCount == 0)
    459     AS.removeFromTracker(*this);
    460 }
    461 
    462 bool
    463 AliasSetTracker::remove(Value *Ptr, uint64_t Size, const AAMDNodes &AAInfo) {
    464   AliasSet *AS = mergeAliasSetsForPointer(Ptr, Size, AAInfo);
    465   if (!AS) return false;
    466   remove(*AS);
    467   return true;
    468 }
    469 
    470 bool AliasSetTracker::remove(LoadInst *LI) {
    471   const DataLayout &DL = LI->getModule()->getDataLayout();
    472   uint64_t Size = DL.getTypeStoreSize(LI->getType());
    473 
    474   AAMDNodes AAInfo;
    475   LI->getAAMetadata(AAInfo);
    476 
    477   AliasSet *AS = mergeAliasSetsForPointer(LI->getOperand(0), Size, AAInfo);
    478   if (!AS) return false;
    479   remove(*AS);
    480   return true;
    481 }
    482 
    483 bool AliasSetTracker::remove(StoreInst *SI) {
    484   const DataLayout &DL = SI->getModule()->getDataLayout();
    485   uint64_t Size = DL.getTypeStoreSize(SI->getOperand(0)->getType());
    486 
    487   AAMDNodes AAInfo;
    488   SI->getAAMetadata(AAInfo);
    489 
    490   AliasSet *AS = mergeAliasSetsForPointer(SI->getOperand(1), Size, AAInfo);
    491   if (!AS) return false;
    492   remove(*AS);
    493   return true;
    494 }
    495 
    496 bool AliasSetTracker::remove(VAArgInst *VAAI) {
    497   AAMDNodes AAInfo;
    498   VAAI->getAAMetadata(AAInfo);
    499 
    500   AliasSet *AS = mergeAliasSetsForPointer(VAAI->getOperand(0),
    501                                           MemoryLocation::UnknownSize, AAInfo);
    502   if (!AS) return false;
    503   remove(*AS);
    504   return true;
    505 }
    506 
    507 bool AliasSetTracker::remove(MemSetInst *MSI) {
    508   AAMDNodes AAInfo;
    509   MSI->getAAMetadata(AAInfo);
    510   uint64_t Len;
    511 
    512   if (ConstantInt *C = dyn_cast<ConstantInt>(MSI->getLength()))
    513     Len = C->getZExtValue();
    514   else
    515     Len = MemoryLocation::UnknownSize;
    516 
    517   AliasSet *AS = mergeAliasSetsForPointer(MSI->getRawDest(), Len, AAInfo);
    518   if (!AS)
    519     return false;
    520   remove(*AS);
    521   return true;
    522 }
    523 
    524 bool AliasSetTracker::removeUnknown(Instruction *I) {
    525   if (!I->mayReadOrWriteMemory())
    526     return false; // doesn't alias anything
    527 
    528   AliasSet *AS = findAliasSetForUnknownInst(I);
    529   if (!AS) return false;
    530   remove(*AS);
    531   return true;
    532 }
    533 
    534 bool AliasSetTracker::remove(Instruction *I) {
    535   // Dispatch to one of the other remove methods...
    536   if (LoadInst *LI = dyn_cast<LoadInst>(I))
    537     return remove(LI);
    538   if (StoreInst *SI = dyn_cast<StoreInst>(I))
    539     return remove(SI);
    540   if (VAArgInst *VAAI = dyn_cast<VAArgInst>(I))
    541     return remove(VAAI);
    542   if (MemSetInst *MSI = dyn_cast<MemSetInst>(I))
    543     return remove(MSI);
    544   return removeUnknown(I);
    545   // FIXME: add support of memcpy and memmove.
    546 }
    547 
    548 
    549 // deleteValue method - This method is used to remove a pointer value from the
    550 // AliasSetTracker entirely.  It should be used when an instruction is deleted
    551 // from the program to update the AST.  If you don't use this, you would have
    552 // dangling pointers to deleted instructions.
    553 //
    554 void AliasSetTracker::deleteValue(Value *PtrVal) {
    555   // If this is a call instruction, remove the callsite from the appropriate
    556   // AliasSet (if present).
    557   if (Instruction *Inst = dyn_cast<Instruction>(PtrVal)) {
    558     if (Inst->mayReadOrWriteMemory()) {
    559       // Scan all the alias sets to see if this call site is contained.
    560       for (iterator I = begin(), E = end(); I != E;) {
    561         iterator Cur = I++;
    562         if (!Cur->Forward)
    563           Cur->removeUnknownInst(*this, Inst);
    564       }
    565     }
    566   }
    567 
    568   // First, look up the PointerRec for this pointer.
    569   PointerMapType::iterator I = PointerMap.find_as(PtrVal);
    570   if (I == PointerMap.end()) return;  // Noop
    571 
    572   // If we found one, remove the pointer from the alias set it is in.
    573   AliasSet::PointerRec *PtrValEnt = I->second;
    574   AliasSet *AS = PtrValEnt->getAliasSet(*this);
    575 
    576   // Unlink and delete from the list of values.
    577   PtrValEnt->eraseFromList();
    578 
    579   // Stop using the alias set.
    580   AS->dropRef(*this);
    581 
    582   PointerMap.erase(I);
    583 }
    584 
    585 // copyValue - This method should be used whenever a preexisting value in the
    586 // program is copied or cloned, introducing a new value.  Note that it is ok for
    587 // clients that use this method to introduce the same value multiple times: if
    588 // the tracker already knows about a value, it will ignore the request.
    589 //
    590 void AliasSetTracker::copyValue(Value *From, Value *To) {
    591   // First, look up the PointerRec for this pointer.
    592   PointerMapType::iterator I = PointerMap.find_as(From);
    593   if (I == PointerMap.end())
    594     return;  // Noop
    595   assert(I->second->hasAliasSet() && "Dead entry?");
    596 
    597   AliasSet::PointerRec &Entry = getEntryFor(To);
    598   if (Entry.hasAliasSet()) return;    // Already in the tracker!
    599 
    600   // Add it to the alias set it aliases...
    601   I = PointerMap.find_as(From);
    602   AliasSet *AS = I->second->getAliasSet(*this);
    603   AS->addPointer(*this, Entry, I->second->getSize(),
    604                  I->second->getAAInfo(),
    605                  true);
    606 }
    607 
    608 
    609 
    610 //===----------------------------------------------------------------------===//
    611 //               AliasSet/AliasSetTracker Printing Support
    612 //===----------------------------------------------------------------------===//
    613 
    614 void AliasSet::print(raw_ostream &OS) const {
    615   OS << "  AliasSet[" << (const void*)this << ", " << RefCount << "] ";
    616   OS << (Alias == SetMustAlias ? "must" : "may") << " alias, ";
    617   switch (Access) {
    618   case NoAccess:     OS << "No access "; break;
    619   case RefAccess:    OS << "Ref       "; break;
    620   case ModAccess:    OS << "Mod       "; break;
    621   case ModRefAccess: OS << "Mod/Ref   "; break;
    622   default: llvm_unreachable("Bad value for Access!");
    623   }
    624   if (isVolatile()) OS << "[volatile] ";
    625   if (Forward)
    626     OS << " forwarding to " << (void*)Forward;
    627 
    628 
    629   if (!empty()) {
    630     OS << "Pointers: ";
    631     for (iterator I = begin(), E = end(); I != E; ++I) {
    632       if (I != begin()) OS << ", ";
    633       I.getPointer()->printAsOperand(OS << "(");
    634       OS << ", " << I.getSize() << ")";
    635     }
    636   }
    637   if (!UnknownInsts.empty()) {
    638     OS << "\n    " << UnknownInsts.size() << " Unknown instructions: ";
    639     for (unsigned i = 0, e = UnknownInsts.size(); i != e; ++i) {
    640       if (i) OS << ", ";
    641       UnknownInsts[i]->printAsOperand(OS);
    642     }
    643   }
    644   OS << "\n";
    645 }
    646 
    647 void AliasSetTracker::print(raw_ostream &OS) const {
    648   OS << "Alias Set Tracker: " << AliasSets.size() << " alias sets for "
    649      << PointerMap.size() << " pointer values.\n";
    650   for (const AliasSet &AS : *this)
    651     AS.print(OS);
    652   OS << "\n";
    653 }
    654 
    655 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
    656 LLVM_DUMP_METHOD void AliasSet::dump() const { print(dbgs()); }
    657 LLVM_DUMP_METHOD void AliasSetTracker::dump() const { print(dbgs()); }
    658 #endif
    659 
    660 //===----------------------------------------------------------------------===//
    661 //                     ASTCallbackVH Class Implementation
    662 //===----------------------------------------------------------------------===//
    663 
    664 void AliasSetTracker::ASTCallbackVH::deleted() {
    665   assert(AST && "ASTCallbackVH called with a null AliasSetTracker!");
    666   AST->deleteValue(getValPtr());
    667   // this now dangles!
    668 }
    669 
    670 void AliasSetTracker::ASTCallbackVH::allUsesReplacedWith(Value *V) {
    671   AST->copyValue(getValPtr(), V);
    672 }
    673 
    674 AliasSetTracker::ASTCallbackVH::ASTCallbackVH(Value *V, AliasSetTracker *ast)
    675   : CallbackVH(V), AST(ast) {}
    676 
    677 AliasSetTracker::ASTCallbackVH &
    678 AliasSetTracker::ASTCallbackVH::operator=(Value *V) {
    679   return *this = ASTCallbackVH(V, AST);
    680 }
    681 
    682 //===----------------------------------------------------------------------===//
    683 //                            AliasSetPrinter Pass
    684 //===----------------------------------------------------------------------===//
    685 
    686 namespace {
    687   class AliasSetPrinter : public FunctionPass {
    688     AliasSetTracker *Tracker;
    689   public:
    690     static char ID; // Pass identification, replacement for typeid
    691     AliasSetPrinter() : FunctionPass(ID) {
    692       initializeAliasSetPrinterPass(*PassRegistry::getPassRegistry());
    693     }
    694 
    695     void getAnalysisUsage(AnalysisUsage &AU) const override {
    696       AU.setPreservesAll();
    697       AU.addRequired<AAResultsWrapperPass>();
    698     }
    699 
    700     bool runOnFunction(Function &F) override {
    701       auto &AAWP = getAnalysis<AAResultsWrapperPass>();
    702       Tracker = new AliasSetTracker(AAWP.getAAResults());
    703 
    704       for (inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I)
    705         Tracker->add(&*I);
    706       Tracker->print(errs());
    707       delete Tracker;
    708       return false;
    709     }
    710   };
    711 }
    712 
    713 char AliasSetPrinter::ID = 0;
    714 INITIALIZE_PASS_BEGIN(AliasSetPrinter, "print-alias-sets",
    715                 "Alias Set Printer", false, true)
    716 INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)
    717 INITIALIZE_PASS_END(AliasSetPrinter, "print-alias-sets",
    718                 "Alias Set Printer", false, true)
    719