diff options
Diffstat (limited to 'llvm/lib/Analysis/LoopAccessAnalysis.cpp')
-rw-r--r-- | llvm/lib/Analysis/LoopAccessAnalysis.cpp | 20 |
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; } |