[llvm] [loop-idiom] Forget outer loop scev when loop-idiom introduces memset… (PR #150916)
Sushant Gokhale via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 28 09:51:44 PDT 2025
================
@@ -0,0 +1,48 @@
+; REQUIRES: asserts
+; RUN: opt <%s -p "loop(loop-idiom)" -verify-scev -o /dev/null
+
+
+; IR corresponds to the following C test:
+; extern char a[];
+; void foo() {
+; for (long c = 0; c < 6; c += -2078836808675943215)
+; for (long d; d < 6; d++)
+; a[c + d] = 0;
+; }
+
+; Make sure we do not crash when verifying scev.
+
+ at a = external global [0 x i8]
+
+define void @foo() {
+entry:
+ br label %outerL
+
+outerL: ; preds = %entry, %outerLatch
+ %e = phi i64 [ undef, %entry ], [ %lcssa, %outerLatch ]
+ %c = phi i64 [ 0, %entry ], [ %c.next, %outerLatch ]
+ %e.cmp = icmp slt i64 %e, 6
+ br i1 %e.cmp, label %innerL, label %outerLatch
+
+innerL: ; preds = %outerL, %innerL
+ %d = phi i64 [ %d.next, %innerL ], [ %e, %outerL ]
+ %add = add nsw i64 %d, %c
+ %arrayidx = getelementptr inbounds [0 x i8], ptr @a, i64 0, i64 %add
+ store i8 0, ptr %arrayidx
+ %d.next = add nsw i64 %d, 1
+ %d.cmp = icmp slt i64 %d, 5
+ br i1 %d.cmp, label %innerL, label %outerLatch, !llvm.loop !0
+
+outerLatch: ; preds = %innerL, %outerL
+ %lcssa = phi i64 [ %e, %outerL ], [ %d.next, %innerL ]
+ %c.next = add nsw i64 %c, -2078836808675943215
+ %c.cmp = icmp slt i64 %c, 2078836808675943221
+ br i1 %c.cmp, label %outerL, label %exit, !llvm.loop !1
----------------
sushgokh wrote:
Not for the patch to work, but for reproducing the crash
https://github.com/llvm/llvm-project/pull/150916
More information about the llvm-commits
mailing list