diff options
Diffstat (limited to 'llvm/lib/Analysis/BasicAliasAnalysis.cpp')
-rw-r--r-- | llvm/lib/Analysis/BasicAliasAnalysis.cpp | 17 |
1 files changed, 7 insertions, 10 deletions
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<bool> 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); |