[llvm] [InstCombine] Use `canIgnoreSignBitOfZero` in `spf->minmax` fold (PR #141914)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Thu May 29 01:52:33 PDT 2025
https://github.com/dtcxzyw created https://github.com/llvm/llvm-project/pull/141914
Alive2: https://alive2.llvm.org/ce/z/dCZBB_
Fix remaining regressions caused by https://github.com/llvm/llvm-project/pull/141010.
>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] [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
More information about the llvm-commits
mailing list