[llvm] [InstCombine] Use `canIgnoreSignBitOfZero` in `spf->minmax` fold (PR #141914)

Yingwei Zheng via llvm-commits llvm-commits at lists.llvm.org
Thu May 29 04:09:39 PDT 2025


https://github.com/dtcxzyw updated https://github.com/llvm/llvm-project/pull/141914

>From 9244e856cefda3b7c75eca021991d748b9613ffa Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Thu, 29 May 2025 16:49:54 +0800
Subject: [PATCH 1/2] [InstCombine] use `canIgnoreSignBitOfZero` in
 `spf->minmax` fold

---
 llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp | 5 ++++-
 llvm/test/Transforms/InstCombine/minmax-fp.ll         | 3 +--
 minmax                                                | 0
 3 files changed, 5 insertions(+), 3 deletions(-)
 create mode 100644 minmax

diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
index 3882d4cb59e01..a791fc5db6698 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
@@ -3929,7 +3929,10 @@ Instruction *InstCombinerImpl::visitSelectInst(SelectInst &SI) {
 
     // Canonicalize select of FP values where NaN and -0.0 are not valid as
     // minnum/maxnum intrinsics.
-    if (SIFPOp->hasNoNaNs() && SIFPOp->hasNoSignedZeros()) {
+    if (SIFPOp->hasNoNaNs() &&
+        (SIFPOp->hasNoSignedZeros() ||
+         (SIFPOp->hasOneUse() &&
+          canIgnoreSignBitOfZero(*SIFPOp->use_begin())))) {
       Value *X, *Y;
       if (match(&SI, m_OrdOrUnordFMax(m_Value(X), m_Value(Y)))) {
         Value *BinIntr =
diff --git a/llvm/test/Transforms/InstCombine/minmax-fp.ll b/llvm/test/Transforms/InstCombine/minmax-fp.ll
index a8470a20365e9..4ae6905404bbd 100644
--- a/llvm/test/Transforms/InstCombine/minmax-fp.ll
+++ b/llvm/test/Transforms/InstCombine/minmax-fp.ll
@@ -174,8 +174,7 @@ define i8 @t11(float %a, float %b) {
 ; Either operand could be NaN, but nnan modifier applied.
 define i8 @t12(float %a, float %b) {
 ; CHECK-LABEL: @t12(
-; CHECK-NEXT:    [[DOTINV:%.*]] = fcmp nnan oge float [[B:%.*]], [[A:%.*]]
-; CHECK-NEXT:    [[DOTV:%.*]] = select nnan i1 [[DOTINV]], float [[A]], float [[B]]
+; CHECK-NEXT:    [[DOTV:%.*]] = call nnan float @llvm.minnum.f32(float [[B:%.*]], float [[A:%.*]])
 ; CHECK-NEXT:    [[TMP1:%.*]] = fptosi float [[DOTV]] to i8
 ; CHECK-NEXT:    ret i8 [[TMP1]]
 ;
diff --git a/minmax b/minmax
new file mode 100644
index 0000000000000..e69de29bb2d1d

>From 5647e7271b598f96debe20b81983ea69dc1cfc72 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Thu, 29 May 2025 19:09:14 +0800
Subject: [PATCH 2/2] Remove unused file.

---
 minmax | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 minmax

diff --git a/minmax b/minmax
deleted file mode 100644
index e69de29bb2d1d..0000000000000



More information about the llvm-commits mailing list