[llvm] [SCEV] - Set PositiveStride when adding stride > 0 predicate. (PR #228015)

Pawan Nirpal via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 1 03:12:11 PDT 2026


https://github.com/pawan-nirpal-031 updated https://github.com/llvm/llvm-project/pull/228015

>From 1eafb8084e18128638541a9715dfea023baf22c9 Mon Sep 17 00:00:00 2001
From: Pawan Nirpal <pnirpal at qti.qualcomm.com>
Date: Thu, 1 Oct 2026 02:58:09 -0700
Subject: [PATCH 1/2] [SCEV] - Set PositiveStride when adding stride > 0
 predicate

---
 llvm/lib/Analysis/ScalarEvolution.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp
index cbadeaf7b347d..809f94457b6b7 100644
--- a/llvm/lib/Analysis/ScalarEvolution.cpp
+++ b/llvm/lib/Analysis/ScalarEvolution.cpp
@@ -13541,6 +13541,7 @@ ScalarEvolution::howManyLessThans(const SCEV *LHS, const SCEV *RHS,
       const SCEVPredicate *P =
           getComparePredicate(ICmpInst::ICMP_SGT, Stride, Zero);
       Predicates.push_back(P);
+      PositiveStride = true;
       // When the predicate holds (Stride > 0), umax(Stride, 1) == Stride,
       // so the result is unchanged. To prevent div by zero.
       Stride = getUMaxExpr(Stride, getOne(Stride->getType()));

>From 820323cad1fdfb842736e967092d97e3a67a1f61 Mon Sep 17 00:00:00 2001
From: Pawan Nirpal <pnirpal at qti.qualcomm.com>
Date: Thu, 1 Oct 2026 03:11:46 -0700
Subject: [PATCH 2/2] add test

---
 .../trip-count-variable-stride-predicate.ll   | 34 +++++++++++++++++++
 1 file changed, 34 insertions(+)

diff --git a/llvm/test/Analysis/ScalarEvolution/trip-count-variable-stride-predicate.ll b/llvm/test/Analysis/ScalarEvolution/trip-count-variable-stride-predicate.ll
index 42a91320182de..96298cdf3a90d 100644
--- a/llvm/test/Analysis/ScalarEvolution/trip-count-variable-stride-predicate.ll
+++ b/llvm/test/Analysis/ScalarEvolution/trip-count-variable-stride-predicate.ll
@@ -29,3 +29,37 @@ loop:
 exit:
   ret void
 }
+
+define void @converging_ivs_bounded_stride(i64 %left_start, i64 %right_start, i32 %stride_i32, ptr %p) {
+; CHECK-LABEL: 'converging_ivs_bounded_stride'
+; CHECK-NEXT:  Determining loop execution counts for: @converging_ivs_bounded_stride
+; CHECK-NEXT:  Loop %loop: Unpredictable backedge-taken count.
+; CHECK-NEXT:  Loop %loop: Unpredictable constant max backedge-taken count.
+; CHECK-NEXT:  Loop %loop: Unpredictable symbolic max backedge-taken count.
+; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((((-1 * ((zext i32 %stride_i32 to i64) + %left_start)<nsw>) + (-1 * (1 umin ((-1 * ((zext i32 %stride_i32 to i64) + %left_start)<nsw>) + ((-1 + %right_start)<nsw> smax ((zext i32 %stride_i32 to i64) + %left_start)<nsw>))))<nuw><nsw> + ((-1 + %right_start)<nsw> smax ((zext i32 %stride_i32 to i64) + %left_start)<nsw>)) /u (1 + (1 umax (zext i32 %stride_i32 to i64)))<nuw><nsw>) + (1 umin ((-1 * ((zext i32 %stride_i32 to i64) + %left_start)<nsw>) + ((-1 + %right_start)<nsw> smax ((zext i32 %stride_i32 to i64) + %left_start)<nsw>))))
+; CHECK-NEXT:   Predicates:
+; CHECK-NEXT:      Compare predicate: (zext i32 %stride_i32 to i64) sgt) 0
+; CHECK-NEXT:  Loop %loop: Predicated constant max backedge-taken count is i64 -1
+; CHECK-NEXT:   Predicates:
+; CHECK-NEXT:      Compare predicate: (zext i32 %stride_i32 to i64) sgt) 0
+; CHECK-NEXT:  Loop %loop: Predicated symbolic max backedge-taken count is ((((-1 * ((zext i32 %stride_i32 to i64) + %left_start)<nsw>) + (-1 * (1 umin ((-1 * ((zext i32 %stride_i32 to i64) + %left_start)<nsw>) + ((-1 + %right_start)<nsw> smax ((zext i32 %stride_i32 to i64) + %left_start)<nsw>))))<nuw><nsw> + ((-1 + %right_start)<nsw> smax ((zext i32 %stride_i32 to i64) + %left_start)<nsw>)) /u (1 + (1 umax (zext i32 %stride_i32 to i64)))<nuw><nsw>) + (1 umin ((-1 * ((zext i32 %stride_i32 to i64) + %left_start)<nsw>) + ((-1 + %right_start)<nsw> smax ((zext i32 %stride_i32 to i64) + %left_start)<nsw>))))
+; CHECK-NEXT:   Predicates:
+; CHECK-NEXT:      Compare predicate: (zext i32 %stride_i32 to i64) sgt) 0
+;
+entry:
+  %stride = zext i32 %stride_i32 to i64
+  br label %loop
+
+loop:
+  %left = phi i64 [ %left_start, %entry ], [ %left.next, %loop ]
+  %right = phi i64 [ %right_start, %entry ], [ %right.next, %loop ]
+  %gep = getelementptr i64, ptr %p, i64 %left
+  store i64 %left, ptr %gep
+  %left.next = add nsw i64 %left, %stride
+  %right.next = add nsw i64 %right, -1
+  %cmp = icmp slt i64 %left.next, %right.next
+  br i1 %cmp, label %loop, label %exit
+
+exit:
+  ret void
+}



More information about the llvm-commits mailing list