[llvm] [DA] Perform `nsw` check for SIV AddRecs earlier (NFCI) (PR #189740)
Ehsan Amiri via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 1 11:01:34 PDT 2026
https://github.com/amehsan updated https://github.com/llvm/llvm-project/pull/189740
>From 2614cf5835cf3dcb33b95b274bab4fbe3178ca84 Mon Sep 17 00:00:00 2001
From: Ehsan Amiri <ehsan.amiri at huawei.com>
Date: Tue, 31 Mar 2026 16:19:57 -0400
Subject: [PATCH 1/2] [DA] Perform `nsw` check for SIV AddRecs earlier (NFCI)
---
llvm/lib/Analysis/DependenceAnalysis.cpp | 23 +++++++----------------
1 file changed, 7 insertions(+), 16 deletions(-)
diff --git a/llvm/lib/Analysis/DependenceAnalysis.cpp b/llvm/lib/Analysis/DependenceAnalysis.cpp
index abda00aba5812..17a3b92a65521 100644
--- a/llvm/lib/Analysis/DependenceAnalysis.cpp
+++ b/llvm/lib/Analysis/DependenceAnalysis.cpp
@@ -1228,9 +1228,6 @@ bool DependenceInfo::strongSIVtest(const SCEVAddRecExpr *Src,
if (!isDependenceTestEnabled(DependenceTestType::StrongSIV))
return false;
- if (!Src->hasNoSignedWrap() || !Dst->hasNoSignedWrap())
- return false;
-
const SCEV *Coeff = Src->getStepRecurrence(*SE);
assert(Coeff == Dst->getStepRecurrence(*SE) &&
"Expecting same coefficient in Strong SIV test");
@@ -1370,9 +1367,6 @@ bool DependenceInfo::weakCrossingSIVtest(const SCEVAddRecExpr *Src,
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();
@@ -1629,9 +1623,6 @@ bool DependenceInfo::exactSIVtest(const SCEVAddRecExpr *Src,
assert(0 < Level && Level <= CommonLevels && "Level out of range");
Level--;
- if (!Src->hasNoSignedWrap() || !Dst->hasNoSignedWrap())
- return false;
-
const SCEV *Delta = minusSCEVNoSignedOverflow(DstConst, SrcConst, *SE);
if (!Delta)
return false;
@@ -1774,9 +1765,6 @@ bool DependenceInfo::weakZeroSIVtestImpl(const SCEVAddRecExpr *AR,
const SCEV *ARCoeff = AR->getStepRecurrence(*SE);
const SCEV *ARConst = AR->getStart();
- if (!AR->hasNoSignedWrap())
- return false;
-
if (Const == ARConst && SE->isKnownNonZero(ARCoeff)) {
if (Level < CommonLevels) {
Result.DV[Level].Direction &= Dependence::DVEntry::LE;
@@ -2061,7 +2049,9 @@ bool DependenceInfo::testSIV(const SCEV *Src, const SCEV *Dst, unsigned &Level,
LLVM_DEBUG(dbgs() << " dst = " << *Dst << "\n");
const SCEVAddRecExpr *SrcAddRec = dyn_cast<SCEVAddRecExpr>(Src);
const SCEVAddRecExpr *DstAddRec = dyn_cast<SCEVAddRecExpr>(Dst);
- if (SrcAddRec && DstAddRec) {
+ bool SrcAnalyzable = SrcAddRec != nullptr && SrcAddRec->hasNoSignedWrap();
+ bool DstAnalyzable = DstAddRec != nullptr && DstAddRec->hasNoSignedWrap();
+ if (SrcAnalyzable && DstAnalyzable) {
const SCEV *SrcCoeff = SrcAddRec->getStepRecurrence(*SE);
const SCEV *DstCoeff = DstAddRec->getStepRecurrence(*SE);
const Loop *CurSrcLoop = SrcAddRec->getLoop();
@@ -2078,17 +2068,18 @@ bool DependenceInfo::testSIV(const SCEV *Src, const SCEV *Dst, unsigned &Level,
disproven = weakCrossingSIVtest(SrcAddRec, DstAddRec, Level, Result);
return disproven || exactSIVtest(SrcAddRec, DstAddRec, Level, Result);
}
- if (SrcAddRec) {
+ if (SrcAnalyzable && DstAddRec == nullptr) {
const Loop *CurSrcLoop = SrcAddRec->getLoop();
Level = mapSrcLoop(CurSrcLoop);
return weakZeroDstSIVtest(SrcAddRec, Dst, Level, Result);
}
- if (DstAddRec) {
+ if (DstAnalyzable && SrcAddRec == nullptr) {
const Loop *CurDstLoop = DstAddRec->getLoop();
Level = mapDstLoop(CurDstLoop);
return weakZeroSrcSIVtest(Src, DstAddRec, Level, Result);
}
- llvm_unreachable("SIV test expected at least one AddRec");
+ assert(SrcAddRec != nullptr || DstAddRec != nullptr
+ && "SIV test expected at least one AddRec");
return false;
}
>From 8459c16874a46e6ef94cf0189ea2dd03b6e5cadb Mon Sep 17 00:00:00 2001
From: Ehsan Amiri <ehsan.amiri at huawei.com>
Date: Wed, 1 Apr 2026 14:00:39 -0400
Subject: [PATCH 2/2] fix code formatting issue
---
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 b92618c475158..f2b55de7704a6 100644
--- a/llvm/lib/Analysis/DependenceAnalysis.cpp
+++ b/llvm/lib/Analysis/DependenceAnalysis.cpp
@@ -2081,8 +2081,8 @@ bool DependenceInfo::testSIV(const SCEV *Src, const SCEV *Dst, unsigned &Level,
Level = mapDstLoop(CurDstLoop);
return weakZeroSrcSIVtest(Src, DstAddRec, Level, Result);
}
- assert(SrcAddRec != nullptr || DstAddRec != nullptr
- && "SIV test expected at least one AddRec");
+ assert(SrcAddRec != nullptr ||
+ DstAddRec != nullptr && "SIV test expected at least one AddRec");
return false;
}
More information about the llvm-commits
mailing list