Index: llvm/include/llvm/Analysis/AliasAnalysis.h =================================================================== --- llvm/include/llvm/Analysis/AliasAnalysis.h +++ llvm/include/llvm/Analysis/AliasAnalysis.h @@ -192,21 +192,26 @@ /// Reduced version of MemoryLocation that only stores a pointer and size. /// Used for caching AATags independent BasicAA results. struct AACacheLoc { - const Value *Ptr; + using PtrTy = PointerIntPair; + PtrTy Ptr; LocationSize Size; + + AACacheLoc(PtrTy Ptr, LocationSize Size) : Ptr(Ptr), Size(Size) {} + AACacheLoc(const Value *Ptr, LocationSize Size, bool MayBeCrossIteration) + : Ptr(Ptr, MayBeCrossIteration), Size(Size) {} }; template <> struct DenseMapInfo { static inline AACacheLoc getEmptyKey() { - return {DenseMapInfo::getEmptyKey(), + return {DenseMapInfo::getEmptyKey(), DenseMapInfo::getEmptyKey()}; } static inline AACacheLoc getTombstoneKey() { - return {DenseMapInfo::getTombstoneKey(), + return {DenseMapInfo::getTombstoneKey(), DenseMapInfo::getTombstoneKey()}; } static unsigned getHashValue(const AACacheLoc &Val) { - return DenseMapInfo::getHashValue(Val.Ptr) ^ + return DenseMapInfo::getHashValue(Val.Ptr) ^ DenseMapInfo::getHashValue(Val.Size); } static bool isEqual(const AACacheLoc &LHS, const AACacheLoc &RHS) { Index: llvm/lib/Analysis/BasicAliasAnalysis.cpp =================================================================== --- llvm/lib/Analysis/BasicAliasAnalysis.cpp +++ llvm/lib/Analysis/BasicAliasAnalysis.cpp @@ -1436,14 +1436,8 @@ // different loop iterations. SaveAndRestore SavedMayBeCrossIteration(MayBeCrossIteration, true); - // If we enabled the MayBeCrossIteration flag, alias analysis results that - // have been cached earlier may no longer be valid. Perform recursive queries - // with a new AAQueryInfo. - AAQueryInfo NewAAQI = AAQI.withEmptyCache(); - AAQueryInfo *UseAAQI = !SavedMayBeCrossIteration.get() ? &NewAAQI : &AAQI; - AliasResult Alias = AAQI.AAR.alias(MemoryLocation(V1Srcs[0], PNSize), - MemoryLocation(V2, V2Size), *UseAAQI); + MemoryLocation(V2, V2Size), AAQI); // Early exit if the check of the first PHI source against V2 is MayAlias. // Other results are not possible. @@ -1460,7 +1454,7 @@ Value *V = V1Srcs[i]; AliasResult ThisAlias = AAQI.AAR.alias( - MemoryLocation(V, PNSize), MemoryLocation(V2, V2Size), *UseAAQI); + MemoryLocation(V, PNSize), MemoryLocation(V2, V2Size), AAQI); Alias = MergeAliasResults(ThisAlias, Alias); if (Alias == AliasResult::MayAlias) break; @@ -1578,7 +1572,8 @@ // Check the cache before climbing up use-def chains. This also terminates // otherwise infinitely recursive queries. - AAQueryInfo::LocPair Locs({V1, V1Size}, {V2, V2Size}); + AAQueryInfo::LocPair Locs({V1, V1Size, MayBeCrossIteration}, + {V2, V2Size, MayBeCrossIteration}); const bool Swapped = V1 > V2; if (Swapped) std::swap(Locs.first, Locs.second);