[llvm] [DA] Add a testcase for GCD test (PR #190261)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 2 13:58:31 PDT 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-analysis
Author: Ehsan Amiri (amehsan)
<details>
<summary>Changes</summary>
Currently GCD proves independence of two instructions in this test. After checking `nsw` flag in GCD, it can no longer prove independence.
---
Full diff: https://github.com/llvm/llvm-project/pull/190261.diff
1 Files Affected:
- (modified) llvm/test/Analysis/DependenceAnalysis/GCD.ll (+59)
``````````diff
diff --git a/llvm/test/Analysis/DependenceAnalysis/GCD.ll b/llvm/test/Analysis/DependenceAnalysis/GCD.ll
index cb14d189afe4c..a605801f4b998 100644
--- a/llvm/test/Analysis/DependenceAnalysis/GCD.ll
+++ b/llvm/test/Analysis/DependenceAnalysis/GCD.ll
@@ -721,3 +721,62 @@ for.end15.loopexit: ; preds = %for.inc13
for.end15: ; preds = %for.end15.loopexit, %entry
ret void
}
+
+;; for (long int i = 0; i < 100; i++)
+;; for (long int j = 0; j < n; j++) {
+;; A[2*i - 4*j] = i;
+;; *B++ = A[6*i + 8*j + 1];
+
+define void @gcd10(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
+; CHECK-LABEL: 'gcd10'
+; 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 %arrayidx8, align 4
+; CHECK-NEXT: da analyze - none!
+; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
+; CHECK-NEXT: da analyze - confused!
+; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx8, align 4 --> Dst: %0 = load i32, ptr %arrayidx8, align 4
+; CHECK-NEXT: da analyze - input [* *]!
+; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx8, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
+; CHECK-NEXT: da analyze - confused!
+; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
+; CHECK-NEXT: da analyze - output [* *]!
+;
+entry:
+ br label %for.cond1.preheader
+
+for.cond1.preheader: ; preds = %entry, %for.inc9
+ %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc9 ]
+ %i.03 = phi i64 [ 0, %entry ], [ %inc10, %for.inc9 ]
+ br label %for.body3
+
+for.body3: ; preds = %for.cond1.preheader, %for.body3
+ %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
+ %B.addr.11 = phi ptr [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
+ %conv = trunc i64 %i.03 to i32
+ %mul = shl nsw i64 %i.03, 1
+ %mul4 = shl nsw i64 %j.02, 2
+ %sub = sub nsw i64 %mul, %mul4
+ %arrayidx = getelementptr inbounds i32, ptr %A, i64 %sub
+ store i32 %conv, ptr %arrayidx, align 4
+ %mul5 = mul nsw i64 %i.03, 6
+ %mul6 = shl i64 %j.02, 3
+ %add = add nsw i64 %mul5, %mul6
+ %add7 = or disjoint i64 %add, 1
+ %arrayidx8 = getelementptr inbounds i32, ptr %A, i64 %add7
+ %0 = load i32, ptr %arrayidx8, align 4
+ %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1
+ store i32 %0, ptr %B.addr.11, align 4
+ %inc = add nsw i64 %j.02, 1
+ %exitcond = icmp ne i64 %inc, %n
+ br i1 %exitcond, label %for.body3, label %for.inc9
+
+for.inc9: ; preds = %for.body3
+ %scevgep = getelementptr i32, ptr %B.addr.04, i64 100
+ %inc10 = add nsw i64 %i.03, 1
+ %exitcond5 = icmp ne i64 %inc10, 100
+ br i1 %exitcond5, label %for.cond1.preheader, label %for.end11
+
+for.end11: ; preds = %for.inc9
+ ret void
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/190261
More information about the llvm-commits
mailing list