Index: llvm/include/llvm/Analysis/AliasAnalysis.h =================================================================== --- llvm/include/llvm/Analysis/AliasAnalysis.h +++ llvm/include/llvm/Analysis/AliasAnalysis.h @@ -189,24 +189,30 @@ void removeInstruction(Instruction *I); }; -/// Reduced version of MemoryLocation that only stores a pointer and size. -/// Used for caching AATags independent BasicAA results. +/// Cache key for BasicAA results. It only includes the pointer and size from +/// MemoryLocation, as BasicAA is AATags independent. Additionally, it includes +/// the value of MayBeCrossIteration, which may affect 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) { @@ -257,15 +263,6 @@ SmallVector AssumptionBasedResults; AAQueryInfo(AAResults &AAR, CaptureInfo *CI) : AAR(AAR), CI(CI) {} - - /// Create a new AAQueryInfo based on this one, but with the cache cleared. - /// This is used for recursive queries across phis, where cache results may - /// not be valid. - AAQueryInfo withEmptyCache() { - AAQueryInfo NewAAQI(AAR, CI); - NewAAQI.Depth = Depth; - return NewAAQI; - } }; /// AAQueryInfo that uses SimpleCaptureInfo. Index: llvm/lib/Analysis/BasicAliasAnalysis.cpp =================================================================== --- llvm/lib/Analysis/BasicAliasAnalysis.cpp +++ llvm/lib/Analysis/BasicAliasAnalysis.cpp @@ -1403,14 +1403,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. @@ -1427,7 +1421,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; @@ -1544,8 +1538,11 @@ return AliasResult::MayAlias; // Check the cache before climbing up use-def chains. This also terminates - // otherwise infinitely recursive queries. - AAQueryInfo::LocPair Locs({V1, V1Size}, {V2, V2Size}); + // otherwise infinitely recursive queries. Include MayBeCrossIteration in the + // cache key, because some cases where MayBeCrossIteration==false returns + // MustAlias or NoAlias may become MayAlias under MayBeCrossIteration==true. + AAQueryInfo::LocPair Locs({V1, V1Size, MayBeCrossIteration}, + {V2, V2Size, MayBeCrossIteration}); const bool Swapped = V1 > V2; if (Swapped) std::swap(Locs.first, Locs.second);