aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/LoopAccessAnalysis.cpp
diff options
context:
space:
mode:
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;
}