[llvm] dec4cfd - [LAA] Use loop guards when checking invariant accesses.
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 4 04:23:26 PDT 2024
Author: Florian Hahn
Date: 2024-10-04T12:23:13+01:00
New Revision: dec4cfdb09596f34f17a653ad405ab2551b09039
URL: https://github.com/llvm/llvm-project/commit/dec4cfdb09596f34f17a653ad405ab2551b09039
DIFF: https://github.com/llvm/llvm-project/commit/dec4cfdb09596f34f17a653ad405ab2551b09039.diff
LOG: [LAA] Use loop guards when checking invariant accesses.
Apply loop guards to start and end pointers like done in other places to
improve results.
Added:
Modified:
llvm/lib/Analysis/LoopAccessAnalysis.cpp
llvm/test/Analysis/LoopAccessAnalysis/no-dep-via-loop-guards.ll
Removed:
################################################################################
diff --git a/llvm/lib/Analysis/LoopAccessAnalysis.cpp b/llvm/lib/Analysis/LoopAccessAnalysis.cpp
index 3f189724763d47..fe00ea0097a43a 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;
}
diff --git a/llvm/test/Analysis/LoopAccessAnalysis/no-dep-via-loop-guards.ll b/llvm/test/Analysis/LoopAccessAnalysis/no-dep-via-loop-guards.ll
index 5ff8eb59cfbf19..2cb98b1a81993b 100644
--- a/llvm/test/Analysis/LoopAccessAnalysis/no-dep-via-loop-guards.ll
+++ b/llvm/test/Analysis/LoopAccessAnalysis/no-dep-via-loop-guards.ll
@@ -2,17 +2,11 @@
; RUN: opt -passes='print<access-info>' -disable-output < %s 2>&1 | FileCheck %s
; Loop guard for %off guarantees the accesses in the loop do not overlap.
-; TODO: currently missed by LAA
define void @access_after_via_loop_guard(ptr %a, i64 %off) {
; CHECK-LABEL: 'access_after_via_loop_guard'
; CHECK-NEXT: loop:
-; 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
-; CHECK-NEXT: Unknown data dependence.
+; CHECK-NEXT: Memory dependences are safe
; CHECK-NEXT: Dependences:
-; CHECK-NEXT: Unknown:
-; CHECK-NEXT: %l = load i32, ptr %gep.after, align 4 ->
-; CHECK-NEXT: store i32 %add, ptr %gep, align 4
-; CHECK-EMPTY:
; CHECK-NEXT: Run-time memory checks:
; CHECK-NEXT: Grouped accesses:
; CHECK-EMPTY:
@@ -203,17 +197,11 @@ exit:
}
; Loop guard for %off guarantees the accesses in the loop do not overlap.
-; TODO: currently missed by LAA
define void @access_after_via_loop_guard_eq_loop_cond(ptr %a, i64 %off) {
; CHECK-LABEL: 'access_after_via_loop_guard_eq_loop_cond'
; CHECK-NEXT: loop:
-; 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
-; CHECK-NEXT: Unknown data dependence.
+; CHECK-NEXT: Memory dependences are safe
; CHECK-NEXT: Dependences:
-; CHECK-NEXT: Unknown:
-; CHECK-NEXT: %l = load i32, ptr %gep.after, align 4 ->
-; CHECK-NEXT: store i32 %add, ptr %gep, align 4
-; CHECK-EMPTY:
; CHECK-NEXT: Run-time memory checks:
; CHECK-NEXT: Grouped accesses:
; CHECK-EMPTY:
More information about the llvm-commits
mailing list