[llvm] [InstCombine] Do not keep samesign when speculatively executing icmps (PR #127007)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 12 20:13:41 PST 2025
https://github.com/dtcxzyw created https://github.com/llvm/llvm-project/pull/127007
Closes https://github.com/llvm/llvm-project/issues/126974.
>From 1b100ae4fc11b435a46e5680e4157fe3ca907ed6 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Thu, 13 Feb 2025 11:58:31 +0800
Subject: [PATCH 1/2] [InstCombine] Add pre-commit tests. NFC.
---
llvm/test/Transforms/InstCombine/umax-icmp.ll | 23 +++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/llvm/test/Transforms/InstCombine/umax-icmp.ll b/llvm/test/Transforms/InstCombine/umax-icmp.ll
index b4eea30bfc6af..87f4322e8e100 100644
--- a/llvm/test/Transforms/InstCombine/umax-icmp.ll
+++ b/llvm/test/Transforms/InstCombine/umax-icmp.ll
@@ -804,4 +804,27 @@ end:
ret void
}
+define i1 @pr126974(i8 %x) {
+; CHECK-LABEL: @pr126974(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[COND:%.*]] = icmp sgt i8 [[X:%.*]], -2
+; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
+; CHECK: if.then:
+; CHECK-NEXT: ret i1 false
+; CHECK: if.else:
+; CHECK-NEXT: ret i1 false
+;
+entry:
+ %cond = icmp sgt i8 %x, -2
+ br i1 %cond, label %if.then, label %if.else
+
+if.then:
+ %umax = call i8 @llvm.umax.i8(i8 %x, i8 -46)
+ %cmp = icmp samesign ult i8 %umax, -32
+ ret i1 %cmp
+
+if.else:
+ ret i1 false
+}
+
declare i32 @llvm.umax.i32(i32, i32)
>From 0c2b9c637b2033dd147b004a0c780d3dc5227d70 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Thu, 13 Feb 2025 12:00:48 +0800
Subject: [PATCH 2/2] [InstCombine] Do not keep samesign when speculatively
executing icmps
---
llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | 5 +++++
llvm/test/Transforms/InstCombine/umax-icmp.ll | 3 ++-
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
index 0feb6160b68fb..00a8117f32e70 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
@@ -5636,6 +5636,11 @@ Instruction *InstCombinerImpl::foldICmpWithMinMax(Instruction &I,
return false;
return std::nullopt;
};
+ // Remove samesign here since it is illegal to keep it when we speculatively
+ // execute comparisons. For example, `icmp samesign ult umax(X, -46), -32`
+ // cannot be decomposed into `(icmp samesign ult X, -46) or (icmp samesign ult
+ // -46, -32)`. `X` is allowed to be non-negative here.
+ Pred = static_cast<CmpInst::Predicate>(Pred);
auto CmpXZ = IsCondKnownTrue(simplifyICmpInst(Pred, X, Z, Q));
auto CmpYZ = IsCondKnownTrue(simplifyICmpInst(Pred, Y, Z, Q));
if (!CmpXZ.has_value() && !CmpYZ.has_value())
diff --git a/llvm/test/Transforms/InstCombine/umax-icmp.ll b/llvm/test/Transforms/InstCombine/umax-icmp.ll
index 87f4322e8e100..0c42d26750e4b 100644
--- a/llvm/test/Transforms/InstCombine/umax-icmp.ll
+++ b/llvm/test/Transforms/InstCombine/umax-icmp.ll
@@ -810,7 +810,8 @@ define i1 @pr126974(i8 %x) {
; CHECK-NEXT: [[COND:%.*]] = icmp sgt i8 [[X:%.*]], -2
; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
; CHECK: if.then:
-; CHECK-NEXT: ret i1 false
+; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[X]], -1
+; CHECK-NEXT: ret i1 [[CMP]]
; CHECK: if.else:
; CHECK-NEXT: ret i1 false
;
More information about the llvm-commits
mailing list