[llvm-branch-commits] [llvm] [DA] Add tests for the Weak Zero SIV tests miss dependency (NFC) (PR #184998)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Fri Mar 6 05:51:45 PST 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-analysis
Author: Ryotaro Kasuga (kasuga-fj)
<details>
<summary>Changes</summary>
Add test cases where the Weak Zero SIV tests miss dependencies due to the calculation of absolute values. SCEV represents the absolute value of `x` as `smax(x, -1 * x)`. When `x` is the signed minimum value, this expression effectively evaluates to `x`, which causes DA to miss the dependency. In DA, if we cannot prove that the value is not the signed minimum when computing the absolute value, the analysis should bail out.
---
Full diff: https://github.com/llvm/llvm-project/pull/184998.diff
1 Files Affected:
- (added) llvm/test/Analysis/DependenceAnalysis/weak-zero-siv-delta-signed-min.ll (+111)
``````````diff
diff --git a/llvm/test/Analysis/DependenceAnalysis/weak-zero-siv-delta-signed-min.ll b/llvm/test/Analysis/DependenceAnalysis/weak-zero-siv-delta-signed-min.ll
new file mode 100644
index 0000000000000..90c3477234043
--- /dev/null
+++ b/llvm/test/Analysis/DependenceAnalysis/weak-zero-siv-delta-signed-min.ll
@@ -0,0 +1,111 @@
+; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 6
+; RUN: opt < %s -disable-output "-passes=print<da>" 2>&1 \
+; RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-ALL
+; RUN: opt < %s -disable-output "-passes=print<da>" -da-enable-dependence-test=weak-zero-siv 2>&1 \
+; RUN: | FileCheck %s --check-prefixes=CHECK,CHECK-WEAK-ZERO-SRC-SIV
+
+;
+; for (i = 0; i < (1 << 63) + 10; i++) {
+; A[-(1 << 62)] = 0;
+; if ((1 << 63) <= i)
+; A[-i + (1 << 62)] = 1;
+; }
+;
+; FIXME: There is a dependency between the two stores in all directions.
+;
+define void @weak_zero_src_siv_large_btc(ptr %A) {
+; CHECK-ALL-LABEL: 'weak_zero_src_siv_large_btc'
+; CHECK-ALL-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 0, ptr %gep.0, align 1
+; CHECK-ALL-NEXT: da analyze - output [S]!
+; CHECK-ALL-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
+; CHECK-ALL-NEXT: da analyze - none!
+; CHECK-ALL-NEXT: Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
+; CHECK-ALL-NEXT: da analyze - none!
+;
+; CHECK-WEAK-ZERO-SRC-SIV-LABEL: 'weak_zero_src_siv_large_btc'
+; CHECK-WEAK-ZERO-SRC-SIV-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 0, ptr %gep.0, align 1
+; CHECK-WEAK-ZERO-SRC-SIV-NEXT: da analyze - output [S]!
+; CHECK-WEAK-ZERO-SRC-SIV-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
+; CHECK-WEAK-ZERO-SRC-SIV-NEXT: da analyze - none!
+; CHECK-WEAK-ZERO-SRC-SIV-NEXT: Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
+; CHECK-WEAK-ZERO-SRC-SIV-NEXT: da analyze - output [*]!
+;
+entry:
+ br label %loop.header
+
+loop.header:
+ %i = phi i64 [ 0, %entry ], [ %i.inc, %loop.latch ]
+ %offset = phi i64 [ 4611686018427387904, %entry ], [ %offset.next, %loop.latch ]
+ %gep.0 = getelementptr i8, ptr %A, i64 -4611686018427387904
+ store i8 0, ptr %gep.0
+ %cond = icmp uge i64 %i, 9223372036854775808
+ br i1 %cond, label %if.then, label %loop.latch
+
+if.then:
+ %gep.1 = getelementptr i8, ptr %A, i64 %offset
+ store i8 1, ptr %gep.1
+ br label %loop.latch
+
+loop.latch:
+ %i.inc = add i64 %i, 1
+ %offset.next = add i64 %offset, -1
+ %ec = icmp eq i64 %i.inc, 9223372036854775818
+ br i1 %ec, label %exit, label %loop.header
+
+exit:
+ ret void
+}
+
+;
+; for (i = 0; i < (1 << 63) + 10; i++) {
+; if ((1 << 63) <= i)
+; A[-i + (1 << 62)] = 0;
+; A[-(1 << 62)] = 1;
+; }
+;
+; FIXME: There is a dependency between the two stores in all directions.
+;
+define void @weak_zero_dst_siv_large_btc(ptr %A) {
+; CHECK-ALL-LABEL: 'weak_zero_dst_siv_large_btc'
+; CHECK-ALL-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 0, ptr %gep.0, align 1
+; CHECK-ALL-NEXT: da analyze - none!
+; CHECK-ALL-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
+; CHECK-ALL-NEXT: da analyze - none!
+; CHECK-ALL-NEXT: Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
+; CHECK-ALL-NEXT: da analyze - output [S]!
+;
+; CHECK-WEAK-ZERO-SRC-SIV-LABEL: 'weak_zero_dst_siv_large_btc'
+; CHECK-WEAK-ZERO-SRC-SIV-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 0, ptr %gep.0, align 1
+; CHECK-WEAK-ZERO-SRC-SIV-NEXT: da analyze - output [*]!
+; CHECK-WEAK-ZERO-SRC-SIV-NEXT: Src: store i8 0, ptr %gep.0, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
+; CHECK-WEAK-ZERO-SRC-SIV-NEXT: da analyze - none!
+; CHECK-WEAK-ZERO-SRC-SIV-NEXT: Src: store i8 1, ptr %gep.1, align 1 --> Dst: store i8 1, ptr %gep.1, align 1
+; CHECK-WEAK-ZERO-SRC-SIV-NEXT: da analyze - output [S]!
+;
+entry:
+ br label %loop.header
+
+loop.header:
+ %i = phi i64 [ 0, %entry ], [ %i.inc, %loop.latch ]
+ %offset = phi i64 [ 4611686018427387904, %entry ], [ %offset.next, %loop.latch ]
+ %cond = icmp uge i64 %i, 9223372036854775808
+ br i1 %cond, label %if.then, label %loop.latch
+
+if.then:
+ %gep.0 = getelementptr i8, ptr %A, i64 %offset
+ store i8 0, ptr %gep.0
+ br label %loop.latch
+
+loop.latch:
+ %gep.1 = getelementptr i8, ptr %A, i64 -4611686018427387904
+ store i8 1, ptr %gep.1
+ %i.inc = add i64 %i, 1
+ %offset.next = add i64 %offset, -1
+ %ec = icmp eq i64 %i.inc, 9223372036854775818
+ br i1 %ec, label %exit, label %loop.header
+
+exit:
+ ret void
+}
+;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
+; CHECK: {{.*}}
``````````
</details>
https://github.com/llvm/llvm-project/pull/184998
More information about the llvm-branch-commits
mailing list