[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