From: Nikita Popov Date: Tue, 18 Oct 2022 10:05:12 +0000 (+0200) Subject: [BasicAA] Include MayBeCrossIteration in cache key X-Git-Tag: upstream/17.0.6~29006 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=efbb4d0245b50dd8ad80a99ea7f676576fd538f7;p=platform%2Fupstream%2Fllvm.git [BasicAA] Include MayBeCrossIteration in cache key Rather than switching to a new AAQI instance with empty cache when MayBeCrossIteration is toggled, include the value in the cache key. The implementation redundantly include the information in both sides of the pair, but that seems simpler than trying to store it only on one side. Differential Revision: https://reviews.llvm.org/D136175 --- diff --git a/llvm/include/llvm/Analysis/AliasAnalysis.h b/llvm/include/llvm/Analysis/AliasAnalysis.h index 2814fd4..fb0a087 100644 --- a/llvm/include/llvm/Analysis/AliasAnalysis.h +++ b/llvm/include/llvm/Analysis/AliasAnalysis.h @@ -189,24 +189,30 @@ public: 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 @@ public: 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. diff --git a/llvm/lib/Analysis/BasicAliasAnalysis.cpp b/llvm/lib/Analysis/BasicAliasAnalysis.cpp index fe0426a..fa03a82 100644 --- a/llvm/lib/Analysis/BasicAliasAnalysis.cpp +++ b/llvm/lib/Analysis/BasicAliasAnalysis.cpp @@ -1403,14 +1403,8 @@ AliasResult BasicAAResult::aliasPHI(const PHINode *PN, LocationSize PNSize, // 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 @@ AliasResult BasicAAResult::aliasPHI(const PHINode *PN, LocationSize PNSize, 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 @@ AliasResult BasicAAResult::aliasCheck(const Value *V1, LocationSize V1Size, 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);