aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/BasicAliasAnalysis.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Analysis/BasicAliasAnalysis.cpp')
-rw-r--r--llvm/lib/Analysis/BasicAliasAnalysis.cpp17
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);