aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/BasicAliasAnalysis.cpp
diff options
context:
space:
mode:
authorNikita Popov <npopov@redhat.com>2022-10-18 12:05:12 +0200
committerNikita Popov <npopov@redhat.com>2022-10-31 09:59:42 +0100
commitefbb4d0245b50dd8ad80a99ea7f676576fd538f7 (patch)
treebfa1c41426de783e08208b417ee36424305dd68f /llvm/lib/Analysis/BasicAliasAnalysis.cpp
parentf2bd7acacdd46443fecafd1722c21181a1bac4a4 (diff)
downloadllvm-efbb4d0245b50dd8ad80a99ea7f676576fd538f7.zip
llvm-efbb4d0245b50dd8ad80a99ea7f676576fd538f7.tar.gz
llvm-efbb4d0245b50dd8ad80a99ea7f676576fd538f7.tar.bz2
[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
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);