aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/LoopAccessAnalysis.cpp
diff options
context:
space:
mode:
authorFlorian Hahn <flo@fhahn.com>2024-10-04 12:22:54 +0100
committerFlorian Hahn <flo@fhahn.com>2024-10-04 12:23:13 +0100
commitdec4cfdb09596f34f17a653ad405ab2551b09039 (patch)
treeff8affe5f19a982b580ca97eb5f2247cde4a335e /llvm/lib/Analysis/LoopAccessAnalysis.cpp
parent53b3c9e408b740addce630e806ccd143b3ca0fde (diff)
downloadllvm-dec4cfdb09596f34f17a653ad405ab2551b09039.zip
llvm-dec4cfdb09596f34f17a653ad405ab2551b09039.tar.gz
llvm-dec4cfdb09596f34f17a653ad405ab2551b09039.tar.bz2
[LAA] Use loop guards when checking invariant accesses.
Apply loop guards to start and end pointers like done in other places to improve results.
Diffstat (limited to 'llvm/lib/Analysis/LoopAccessAnalysis.cpp')
-rw-r--r--llvm/lib/Analysis/LoopAccessAnalysis.cpp20
1 files changed, 14 insertions, 6 deletions
diff --git a/llvm/lib/Analysis/LoopAccessAnalysis.cpp b/llvm/lib/Analysis/LoopAccessAnalysis.cpp
index 3f18972..fe00ea0 100644
--- a/llvm/lib/Analysis/LoopAccessAnalysis.cpp
+++ b/llvm/lib/Analysis/LoopAccessAnalysis.cpp
@@ -1943,16 +1943,24 @@ MemoryDepChecker::getDependenceDistanceStrideAndSize(
// required for correctness.
if (SE.isLoopInvariant(Src, InnermostLoop) ||
SE.isLoopInvariant(Sink, InnermostLoop)) {
- const auto &[SrcStart, SrcEnd] =
+ const auto &[SrcStart_, SrcEnd_] =
getStartAndEndForAccess(InnermostLoop, Src, ATy, PSE, PointerBounds);
- const auto &[SinkStart, SinkEnd] =
+ const auto &[SinkStart_, SinkEnd_] =
getStartAndEndForAccess(InnermostLoop, Sink, BTy, PSE, PointerBounds);
- if (!isa<SCEVCouldNotCompute>(SrcStart) &&
- !isa<SCEVCouldNotCompute>(SrcEnd) &&
- !isa<SCEVCouldNotCompute>(SinkStart) &&
- !isa<SCEVCouldNotCompute>(SinkEnd)) {
+ if (!isa<SCEVCouldNotCompute>(SrcStart_) &&
+ !isa<SCEVCouldNotCompute>(SrcEnd_) &&
+ !isa<SCEVCouldNotCompute>(SinkStart_) &&
+ !isa<SCEVCouldNotCompute>(SinkEnd_)) {
+ if (!LoopGuards)
+ LoopGuards.emplace(
+ ScalarEvolution::LoopGuards::collect(InnermostLoop, SE));
+ auto SrcEnd = SE.applyLoopGuards(SrcEnd_, *LoopGuards);
+ auto SinkStart = SE.applyLoopGuards(SinkStart_, *LoopGuards);
if (SE.isKnownPredicate(CmpInst::ICMP_ULE, SrcEnd, SinkStart))
return MemoryDepChecker::Dependence::NoDep;
+
+ auto SinkEnd = SE.applyLoopGuards(SinkEnd_, *LoopGuards);
+ auto SrcStart = SE.applyLoopGuards(SrcStart_, *LoopGuards);
if (SE.isKnownPredicate(CmpInst::ICMP_ULE, SinkEnd, SrcStart))
return MemoryDepChecker::Dependence::NoDep;
}