[llvm] [InstCombine] Fix i1 ssub.sat compare folding (PR #173742)
Justin Lebar via llvm-commits
llvm-commits at lists.llvm.org
Sun Jan 11 13:58:07 PST 2026
jlebar wrote:
I found a reproducer!
```
diff --git a/llvm/test/Transforms/InstCombine/saturating-add-sub.ll b/llvm/test/Transforms/InstCombine/saturating-add-sub.ll
index 1294f867f07c..7c5886c4bff1 100644
--- a/llvm/test/Transforms/InstCombine/saturating-add-sub.ll
+++ b/llvm/test/Transforms/InstCombine/saturating-add-sub.ll
@@ -451,6 +451,20 @@ declare i8 @llvm.usub.sat.i8(i8, i8)
declare i8 @llvm.ssub.sat.i8(i8, i8)
declare <2 x i8> @llvm.usub.sat.v2i8(<2 x i8>, <2 x i8>)
declare <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8>, <2 x i8>)
+declare i1 @llvm.ssub.sat.i1(i1, i1)
+
+define i1 @test_ssub_sat_i1_cmp_ule_zero(i1 %a) {
+; CHECK-LABEL: @test_ssub_sat_i1_cmp_ule_zero(
+; CHECK-NEXT: [[CMP:%.*]] = xor i1 [[A:%.*]], true
+; CHECK-NEXT: [[SAT:%.*]] = call i1 @llvm.ssub.sat.i1(i1 [[A]], i1 [[CMP]])
+; CHECK-NEXT: [[RES:%.*]] = xor i1 [[SAT]], true
+; CHECK-NEXT: ret i1 [[RES]]
+;
+ %cmp = icmp ule i1 %a, false
+ %sat = call i1 @llvm.ssub.sat.i1(i1 %a, i1 %cmp)
+ %res = icmp ule i1 %sat, false
+ ret i1 %res
+}
; Cannot canonicalize usub to uadd.
define i8 @test_scalar_usub_canonical(i8 %a) {
```
This currently gets optimized to `ret i1 0` which is incorrect.
Resurrecting this PR...
https://github.com/llvm/llvm-project/pull/173742
More information about the llvm-commits
mailing list