[llvm] [DA] Require 'nsw' for AddRecs in the WeakCrossing SIV test (PR #185030)
Ehsan Amiri via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 6 07:59:06 PST 2026
https://github.com/amehsan created https://github.com/llvm/llvm-project/pull/185030
None
>From 763d829541615285fe73aba8ee78689e606e331d 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] [DA] Require 'nsw' for AddRecs in the WeakCrossing SIV test
---
.../include/llvm/Analysis/DependenceAnalysis.h | 6 ++----
llvm/lib/Analysis/DependenceAnalysis.cpp | 18 +++++++++++-------
.../DependenceAnalysis/WeakCrossingSIV.ll | 4 ++--
.../weak-crossing-siv-addrec-wrap.ll | 2 +-
4 files changed, 16 insertions(+), 14 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 a9f436c0d32a7..575c69891aa25 100644
--- a/llvm/lib/Analysis/DependenceAnalysis.cpp
+++ b/llvm/lib/Analysis/DependenceAnalysis.cpp
@@ -1363,19 +1363,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--;
@@ -1421,6 +1425,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");
@@ -2290,8 +2295,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 d4f7e11f5f091..28091eeef77b5 100644
--- a/llvm/test/Analysis/DependenceAnalysis/WeakCrossingSIV.ll
+++ b/llvm/test/Analysis/DependenceAnalysis/WeakCrossingSIV.ll
@@ -18,7 +18,7 @@ define void @weakcrossing0(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
; CHECK-NEXT: Runtime Assumptions:
; CHECK-NEXT: Compare predicate: (4 * %n) ne) 0
; 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
@@ -72,7 +72,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 - none!
; 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 ec81c6ca83d6c..0abdfba086999 100644
--- a/llvm/test/Analysis/DependenceAnalysis/weak-crossing-siv-addrec-wrap.ll
+++ b/llvm/test/Analysis/DependenceAnalysis/weak-crossing-siv-addrec-wrap.ll
@@ -36,7 +36,7 @@ define void @weak_crossing_siv_no_nsw(ptr %A) {
; 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 - none!
+; 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 [*]!
;
More information about the llvm-commits
mailing list