Skip to content

Commit dec4cfd

Browse files
committed
[LAA] Use loop guards when checking invariant accesses.
Apply loop guards to start and end pointers like done in other places to improve results.
1 parent 53b3c9e commit dec4cfd

File tree

2 files changed

+16
-20
lines changed

2 files changed

+16
-20
lines changed

llvm/lib/Analysis/LoopAccessAnalysis.cpp

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1943,16 +1943,24 @@ MemoryDepChecker::getDependenceDistanceStrideAndSize(
19431943
// required for correctness.
19441944
if (SE.isLoopInvariant(Src, InnermostLoop) ||
19451945
SE.isLoopInvariant(Sink, InnermostLoop)) {
1946-
const auto &[SrcStart, SrcEnd] =
1946+
const auto &[SrcStart_, SrcEnd_] =
19471947
getStartAndEndForAccess(InnermostLoop, Src, ATy, PSE, PointerBounds);
1948-
const auto &[SinkStart, SinkEnd] =
1948+
const auto &[SinkStart_, SinkEnd_] =
19491949
getStartAndEndForAccess(InnermostLoop, Sink, BTy, PSE, PointerBounds);
1950-
if (!isa<SCEVCouldNotCompute>(SrcStart) &&
1951-
!isa<SCEVCouldNotCompute>(SrcEnd) &&
1952-
!isa<SCEVCouldNotCompute>(SinkStart) &&
1953-
!isa<SCEVCouldNotCompute>(SinkEnd)) {
1950+
if (!isa<SCEVCouldNotCompute>(SrcStart_) &&
1951+
!isa<SCEVCouldNotCompute>(SrcEnd_) &&
1952+
!isa<SCEVCouldNotCompute>(SinkStart_) &&
1953+
!isa<SCEVCouldNotCompute>(SinkEnd_)) {
1954+
if (!LoopGuards)
1955+
LoopGuards.emplace(
1956+
ScalarEvolution::LoopGuards::collect(InnermostLoop, SE));
1957+
auto SrcEnd = SE.applyLoopGuards(SrcEnd_, *LoopGuards);
1958+
auto SinkStart = SE.applyLoopGuards(SinkStart_, *LoopGuards);
19541959
if (SE.isKnownPredicate(CmpInst::ICMP_ULE, SrcEnd, SinkStart))
19551960
return MemoryDepChecker::Dependence::NoDep;
1961+
1962+
auto SinkEnd = SE.applyLoopGuards(SinkEnd_, *LoopGuards);
1963+
auto SrcStart = SE.applyLoopGuards(SrcStart_, *LoopGuards);
19561964
if (SE.isKnownPredicate(CmpInst::ICMP_ULE, SinkEnd, SrcStart))
19571965
return MemoryDepChecker::Dependence::NoDep;
19581966
}

llvm/test/Analysis/LoopAccessAnalysis/no-dep-via-loop-guards.ll

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,11 @@
22
; RUN: opt -passes='print<access-info>' -disable-output < %s 2>&1 | FileCheck %s
33

44
; Loop guard for %off guarantees the accesses in the loop do not overlap.
5-
; TODO: currently missed by LAA
65
define void @access_after_via_loop_guard(ptr %a, i64 %off) {
76
; CHECK-LABEL: 'access_after_via_loop_guard'
87
; CHECK-NEXT: loop:
9-
; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop
10-
; CHECK-NEXT: Unknown data dependence.
8+
; CHECK-NEXT: Memory dependences are safe
119
; CHECK-NEXT: Dependences:
12-
; CHECK-NEXT: Unknown:
13-
; CHECK-NEXT: %l = load i32, ptr %gep.after, align 4 ->
14-
; CHECK-NEXT: store i32 %add, ptr %gep, align 4
15-
; CHECK-EMPTY:
1610
; CHECK-NEXT: Run-time memory checks:
1711
; CHECK-NEXT: Grouped accesses:
1812
; CHECK-EMPTY:
@@ -203,17 +197,11 @@ exit:
203197
}
204198

205199
; Loop guard for %off guarantees the accesses in the loop do not overlap.
206-
; TODO: currently missed by LAA
207200
define void @access_after_via_loop_guard_eq_loop_cond(ptr %a, i64 %off) {
208201
; CHECK-LABEL: 'access_after_via_loop_guard_eq_loop_cond'
209202
; CHECK-NEXT: loop:
210-
; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop
211-
; CHECK-NEXT: Unknown data dependence.
203+
; CHECK-NEXT: Memory dependences are safe
212204
; CHECK-NEXT: Dependences:
213-
; CHECK-NEXT: Unknown:
214-
; CHECK-NEXT: %l = load i32, ptr %gep.after, align 4 ->
215-
; CHECK-NEXT: store i32 %add, ptr %gep, align 4
216-
; CHECK-EMPTY:
217205
; CHECK-NEXT: Run-time memory checks:
218206
; CHECK-NEXT: Grouped accesses:
219207
; CHECK-EMPTY:

0 commit comments

Comments
 (0)