[llvm] [DA] Require 'nsw' for AddRecs in the WeakCrossing SIV test (PR #185041)
Ehsan Amiri via llvm-commits
llvm-commits at lists.llvm.org
Tue Mar 10 10:25:31 PDT 2026
https://github.com/amehsan updated https://github.com/llvm/llvm-project/pull/185041
>From 19d672c2afd25867bfc1cfaf02d6d66de9c175d3 Mon Sep 17 00:00:00 2001
From: Ehsan Amiri <ehsan.amiri at huawei.com>
Date: Fri, 6 Mar 2026 10:57:12 -0500
Subject: [PATCH 1/4] [DA] Require 'nsw' for AddRecs in the WeakCrossing SIV
test
---
.../llvm/Analysis/DependenceAnalysis.h | 6 ++---
llvm/lib/Analysis/DependenceAnalysis.cpp | 18 +++++++++------
.../DependenceAnalysis/WeakCrossingSIV.ll | 4 ++--
.../weak-crossing-siv-addrec-wrap.ll | 22 +++++++++++++------
4 files changed, 30 insertions(+), 20 deletions(-)
diff --git a/llvm/include/llvm/Analysis/DependenceAnalysis.h b/llvm/include/llvm/Analysis/DependenceAnalysis.h
index 6320caf09dd35..e6fe7f61a43f5 100644
--- a/llvm/include/llvm/Analysis/DependenceAnalysis.h
+++ b/llvm/include/llvm/Analysis/DependenceAnalysis.h
@@ -532,10 +532,8 @@ class DependenceInfo {
/// If there might be a dependence, returns false.
/// Sets appropriate direction entry.
/// Set consistent to false.
- bool weakCrossingSIVtest(const SCEV *SrcCoeff, const SCEV *SrcConst,
- const SCEV *DstConst, const Loop *CurrentSrcLoop,
- const Loop *CurrentDstLoop, unsigned Level,
- FullDependence &Result) const;
+ bool weakCrossingSIVtest(const SCEVAddRecExpr *Src, const SCEVAddRecExpr *Dst,
+ unsigned Level, FullDependence &Result) const;
/// ExactSIVtest - Tests the SIV subscript pair
/// (Src and Dst) for dependence.
diff --git a/llvm/lib/Analysis/DependenceAnalysis.cpp b/llvm/lib/Analysis/DependenceAnalysis.cpp
index c40d165eb29f5..6134bdace4146 100644
--- a/llvm/lib/Analysis/DependenceAnalysis.cpp
+++ b/llvm/lib/Analysis/DependenceAnalysis.cpp
@@ -1366,19 +1366,23 @@ bool DependenceInfo::strongSIVtest(const SCEVAddRecExpr *Src,
// Can determine iteration for splitting.
//
// Return true if dependence disproved.
-bool DependenceInfo::weakCrossingSIVtest(const SCEV *Coeff,
- const SCEV *SrcConst,
- const SCEV *DstConst,
- const Loop *CurSrcLoop,
- const Loop *CurDstLoop, unsigned Level,
+bool DependenceInfo::weakCrossingSIVtest(const SCEVAddRecExpr *Src,
+ const SCEVAddRecExpr *Dst, unsigned Level,
FullDependence &Result) const {
if (!isDependenceTestEnabled(DependenceTestType::WeakCrossingSIV))
return false;
+ if (!Src->hasNoSignedWrap() || !Dst->hasNoSignedWrap())
+ return false;
+
+ const SCEV *Coeff = Src->getStepRecurrence(*SE);
+ const SCEV *SrcConst = Src->getStart();
+ const SCEV *DstConst = Dst->getStart();
LLVM_DEBUG(dbgs() << "\tWeak-Crossing SIV test\n");
LLVM_DEBUG(dbgs() << "\t Coeff = " << *Coeff << "\n");
LLVM_DEBUG(dbgs() << "\t SrcConst = " << *SrcConst << "\n");
LLVM_DEBUG(dbgs() << "\t DstConst = " << *DstConst << "\n");
+
++WeakCrossingSIVapplications;
assert(0 < Level && Level <= CommonLevels && "Level out of range");
Level--;
@@ -1424,6 +1428,7 @@ bool DependenceInfo::weakCrossingSIVtest(const SCEV *Coeff,
// We're certain that Delta > 0 and ConstCoeff > 0.
// Check Delta/(2*ConstCoeff) against upper loop bound
+ const Loop *CurSrcLoop = Src->getLoop();
if (const SCEV *UpperBound =
collectUpperBound(CurSrcLoop, Delta->getType())) {
LLVM_DEBUG(dbgs() << "\t UpperBound = " << *UpperBound << "\n");
@@ -2293,8 +2298,7 @@ bool DependenceInfo::testSIV(const SCEV *Src, const SCEV *Dst, unsigned &Level,
disproven = strongSIVtest(SrcAddRec, DstAddRec, Level, Result,
UnderRuntimeAssumptions);
else if (SrcCoeff == SE->getNegativeSCEV(DstCoeff))
- disproven = weakCrossingSIVtest(SrcCoeff, SrcConst, DstConst, CurSrcLoop,
- CurDstLoop, Level, Result);
+ disproven = weakCrossingSIVtest(SrcAddRec, DstAddRec, Level, Result);
else
disproven = exactSIVtest(SrcCoeff, DstCoeff, SrcConst, DstConst,
CurSrcLoop, CurDstLoop, Level, Result);
diff --git a/llvm/test/Analysis/DependenceAnalysis/WeakCrossingSIV.ll b/llvm/test/Analysis/DependenceAnalysis/WeakCrossingSIV.ll
index 6242763a525cb..0207ca2025650 100644
--- a/llvm/test/Analysis/DependenceAnalysis/WeakCrossingSIV.ll
+++ b/llvm/test/Analysis/DependenceAnalysis/WeakCrossingSIV.ll
@@ -16,7 +16,7 @@ define void @weakcrossing0(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
; CHECK-NEXT: da analyze - output [*]!
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4
-; CHECK-NEXT: da analyze - flow [0|<]!
+; CHECK-NEXT: da analyze - flow [*|<]!
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
; CHECK-NEXT: da analyze - confused!
; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4
@@ -68,7 +68,7 @@ define void @weakcrossing1(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
; CHECK-NEXT: da analyze - output [*]!
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4
-; CHECK-NEXT: da analyze - flow [<>]!
+; CHECK-NEXT: da analyze - flow [*|<]!
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
; CHECK-NEXT: da analyze - confused!
; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4
diff --git a/llvm/test/Analysis/DependenceAnalysis/weak-crossing-siv-addrec-wrap.ll b/llvm/test/Analysis/DependenceAnalysis/weak-crossing-siv-addrec-wrap.ll
index 850f844a53df7..3adf97bd73a68 100644
--- a/llvm/test/Analysis/DependenceAnalysis/weak-crossing-siv-addrec-wrap.ll
+++ b/llvm/test/Analysis/DependenceAnalysis/weak-crossing-siv-addrec-wrap.ll
@@ -24,13 +24,21 @@
; stores.
;
define void @weak_crossing_siv_no_nsw(ptr %A) {
-; CHECK-LABEL: 'weak_crossing_siv_no_nsw'
-; CHECK-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 0, ptr %gep.0, align 1
-; CHECK-NEXT: da analyze - output [*]!
-; CHECK-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
-; CHECK-NEXT: da analyze - none!
-; CHECK-NEXT: Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
-; CHECK-NEXT: da analyze - output [*]!
+; CHECK-ALL-LABEL: 'weak_crossing_siv_no_nsw'
+; CHECK-ALL-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 0, ptr %gep.0, align 1
+; CHECK-ALL-NEXT: da analyze - none!
+; CHECK-ALL-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
+; CHECK-ALL-NEXT: da analyze - none!
+; CHECK-ALL-NEXT: Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
+; CHECK-ALL-NEXT: da analyze - none!
+;
+; CHECK-WEAK-CROSSING-SIV-LABEL: 'weak_crossing_siv_no_nsw'
+; CHECK-WEAK-CROSSING-SIV-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 0, ptr %gep.0, align 1
+; CHECK-WEAK-CROSSING-SIV-NEXT: da analyze - output [*]!
+; CHECK-WEAK-CROSSING-SIV-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
+; CHECK-WEAK-CROSSING-SIV-NEXT: da analyze - output [*|<]!
+; CHECK-WEAK-CROSSING-SIV-NEXT: Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
+; CHECK-WEAK-CROSSING-SIV-NEXT: da analyze - output [*]!
;
entry:
br label %loop.header
>From d0e066acc3f8a4d012bd018a5da0a6837e841d3d Mon Sep 17 00:00:00 2001
From: Ehsan Amiri <ehsan.amiri at huawei.com>
Date: Fri, 6 Mar 2026 11:06:52 -0500
Subject: [PATCH 2/4] address code style issues
---
llvm/lib/Analysis/DependenceAnalysis.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/Analysis/DependenceAnalysis.cpp b/llvm/lib/Analysis/DependenceAnalysis.cpp
index 6134bdace4146..f37ed0fca3358 100644
--- a/llvm/lib/Analysis/DependenceAnalysis.cpp
+++ b/llvm/lib/Analysis/DependenceAnalysis.cpp
@@ -1367,7 +1367,8 @@ bool DependenceInfo::strongSIVtest(const SCEVAddRecExpr *Src,
//
// Return true if dependence disproved.
bool DependenceInfo::weakCrossingSIVtest(const SCEVAddRecExpr *Src,
- const SCEVAddRecExpr *Dst, unsigned Level,
+ const SCEVAddRecExpr *Dst,
+ unsigned Level,
FullDependence &Result) const {
if (!isDependenceTestEnabled(DependenceTestType::WeakCrossingSIV))
return false;
@@ -1382,7 +1383,6 @@ bool DependenceInfo::weakCrossingSIVtest(const SCEVAddRecExpr *Src,
LLVM_DEBUG(dbgs() << "\t Coeff = " << *Coeff << "\n");
LLVM_DEBUG(dbgs() << "\t SrcConst = " << *SrcConst << "\n");
LLVM_DEBUG(dbgs() << "\t DstConst = " << *DstConst << "\n");
-
++WeakCrossingSIVapplications;
assert(0 < Level && Level <= CommonLevels && "Level out of range");
Level--;
>From 78b9769f28eed250a2eb9e56395a37cc0bd7e2ed Mon Sep 17 00:00:00 2001
From: Ehsan Amiri <ehsan.amiri at huawei.com>
Date: Mon, 9 Mar 2026 16:04:05 -0400
Subject: [PATCH 3/4] fix testcase
---
.../DependenceAnalysis/weak-crossing-siv-addrec-wrap.ll | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/llvm/test/Analysis/DependenceAnalysis/weak-crossing-siv-addrec-wrap.ll b/llvm/test/Analysis/DependenceAnalysis/weak-crossing-siv-addrec-wrap.ll
index 3adf97bd73a68..a33e69c3ebcbe 100644
--- a/llvm/test/Analysis/DependenceAnalysis/weak-crossing-siv-addrec-wrap.ll
+++ b/llvm/test/Analysis/DependenceAnalysis/weak-crossing-siv-addrec-wrap.ll
@@ -26,11 +26,11 @@
define void @weak_crossing_siv_no_nsw(ptr %A) {
; CHECK-ALL-LABEL: 'weak_crossing_siv_no_nsw'
; CHECK-ALL-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 0, ptr %gep.0, align 1
-; CHECK-ALL-NEXT: da analyze - none!
+; CHECK-ALL-NEXT: da analyze - output [*]!
; CHECK-ALL-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
; CHECK-ALL-NEXT: da analyze - none!
; CHECK-ALL-NEXT: Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
-; CHECK-ALL-NEXT: da analyze - none!
+; CHECK-ALL-NEXT: da analyze - output [*]!
;
; CHECK-WEAK-CROSSING-SIV-LABEL: 'weak_crossing_siv_no_nsw'
; CHECK-WEAK-CROSSING-SIV-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 0, ptr %gep.0, align 1
@@ -75,5 +75,4 @@ exit:
ret void
}
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
-; CHECK-ALL: {{.*}}
-; CHECK-WEAK-CROSSING-SIV: {{.*}}
+; CHECK: {{.*}}
>From 53157cb24354cb31e3a52a62054ee14df3da001b Mon Sep 17 00:00:00 2001
From: Ehsan Amiri <ehsan.amiri at huawei.com>
Date: Tue, 10 Mar 2026 13:24:49 -0400
Subject: [PATCH 4/4] add assertion
---
llvm/lib/Analysis/DependenceAnalysis.cpp | 2 ++
1 file changed, 2 insertions(+)
diff --git a/llvm/lib/Analysis/DependenceAnalysis.cpp b/llvm/lib/Analysis/DependenceAnalysis.cpp
index f37ed0fca3358..2e1f83af59f83 100644
--- a/llvm/lib/Analysis/DependenceAnalysis.cpp
+++ b/llvm/lib/Analysis/DependenceAnalysis.cpp
@@ -1377,6 +1377,8 @@ bool DependenceInfo::weakCrossingSIVtest(const SCEVAddRecExpr *Src,
return false;
const SCEV *Coeff = Src->getStepRecurrence(*SE);
+ const SCEV *DstCoeff = Dst->getStepRecurrence(*SE);
+ assert(Coeff == SE->getNegativeSCEV(DstCoeff) && "Not a weak crossing case.");
const SCEV *SrcConst = Src->getStart();
const SCEV *DstConst = Dst->getStart();
LLVM_DEBUG(dbgs() << "\tWeak-Crossing SIV test\n");
More information about the llvm-commits
mailing list