[llvm] [DAG] added ISD::FMINIMUM/FMAXIMUM cases in isIdentityElement (PR #210169)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 7 07:19:37 PDT 2026
https://github.com/khanxmetu updated https://github.com/llvm/llvm-project/pull/210169
>From 3112ea58bf7c8421f7957ab335c07a8c86847bb7 Mon Sep 17 00:00:00 2001
From: khanxmetu <khanxbahria at gmail.com>
Date: Thu, 16 Jul 2026 23:19:47 +0300
Subject: [PATCH 1/5] added ISD::FMINIMUM/FMAXIMUM cases in isIdentityElement
---
llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index a8ae7927726ce..5979983303420 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -13759,6 +13759,18 @@ bool SelectionDAG::isIdentityElement(unsigned Opcode, SDNodeFlags Flags,
return ConstFP->isExactlyValue(NeutralAF);
}
+ case ISD::FMINIMUM:
+ case ISD::FMAXIMUM: {
+ // Neutral element for fminimum is Inf or FLT_MAX, depending on FMF.
+ EVT VT = V.getValueType();
+ const fltSemantics &Semantics = VT.getFltSemantics();
+ APFloat NeutralAF = !Flags.hasNoInfs() ? APFloat::getInf(Semantics)
+ : APFloat::getLargest(Semantics);
+ if (Opcode == ISD::FMAXIMUM)
+ NeutralAF.changeSign();
+
+ return ConstFP->isExactlyValue(NeutralAF);
+ }
}
}
return false;
>From f3d9fb7304562a27a59ae805ad408d0f93bcdc4d Mon Sep 17 00:00:00 2001
From: khanxmetu <khanxbahria at gmail.com>
Date: Tue, 28 Jul 2026 21:48:56 +0300
Subject: [PATCH 2/5] unit test
---
.../SelectionDAGNodeConstructionTest.cpp | 25 +++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/llvm/unittests/CodeGen/SelectionDAGNodeConstructionTest.cpp b/llvm/unittests/CodeGen/SelectionDAGNodeConstructionTest.cpp
index 0899b04bfddb8..580da585837d5 100644
--- a/llvm/unittests/CodeGen/SelectionDAGNodeConstructionTest.cpp
+++ b/llvm/unittests/CodeGen/SelectionDAGNodeConstructionTest.cpp
@@ -7,6 +7,7 @@
//===----------------------------------------------------------------------===//
#include "SelectionDAGTestBase.h"
+#include "llvm/CodeGen/ISDOpcodes.h"
using namespace llvm;
@@ -357,3 +358,27 @@ TEST_F(SelectionDAGNodeConstructionTest, CTLS) {
SDValue Ctlsi1 = DAG->getNode(ISD::CTLS, DL, MVT::i32, i1Op);
EXPECT_TRUE(isNullConstant(Ctlsi1));
}
+
+TEST_F(SelectionDAGNodeConstructionTest, FMAXIMUM_IDENTITY) {
+ SDLoc DL;
+ SDValue FMax =
+ DAG->getIdentityElement(ISD::FMAXIMUM, DL, MVT::f32, SDNodeFlags());
+ EXPECT_TRUE(DAG->isIdentityElement(ISD::FMAXIMUM, SDNodeFlags(), FMax, 0, 0));
+
+ SDValue FMaxNoInf = DAG->getIdentityElement(ISD::FMAXIMUM, DL, MVT::f32,
+ SDNodeFlags(SDNodeFlags::NoInfs));
+ EXPECT_TRUE(DAG->isIdentityElement(
+ ISD::FMAXIMUM, SDNodeFlags(SDNodeFlags::NoInfs), FMaxNoInf, 0, 0));
+}
+
+TEST_F(SelectionDAGNodeConstructionTest, FMINIMUM_IDENTITY) {
+ SDLoc DL;
+ SDValue FMin =
+ DAG->getIdentityElement(ISD::FMINIMUM, DL, MVT::f32, SDNodeFlags());
+ EXPECT_TRUE(DAG->isIdentityElement(ISD::FMINIMUM, SDNodeFlags(), FMin, 0, 0));
+
+ SDValue FMinNoInf = DAG->getIdentityElement(ISD::FMINIMUM, DL, MVT::f32,
+ SDNodeFlags(SDNodeFlags::NoInfs));
+ EXPECT_TRUE(DAG->isIdentityElement(
+ ISD::FMINIMUM, SDNodeFlags(SDNodeFlags::NoInfs), FMinNoInf, 0, 0));
+}
\ No newline at end of file
>From d2fa1d5f2e7330ae8b199761193e82d244146eac Mon Sep 17 00:00:00 2001
From: khanxmetu <khanxbahria at gmail.com>
Date: Tue, 28 Jul 2026 22:26:06 +0300
Subject: [PATCH 3/5] simplified via direct checking
---
llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 13 +++++--------
1 file changed, 5 insertions(+), 8 deletions(-)
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 5979983303420..f6c1860473019 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -13762,14 +13762,11 @@ bool SelectionDAG::isIdentityElement(unsigned Opcode, SDNodeFlags Flags,
case ISD::FMINIMUM:
case ISD::FMAXIMUM: {
// Neutral element for fminimum is Inf or FLT_MAX, depending on FMF.
- EVT VT = V.getValueType();
- const fltSemantics &Semantics = VT.getFltSemantics();
- APFloat NeutralAF = !Flags.hasNoInfs() ? APFloat::getInf(Semantics)
- : APFloat::getLargest(Semantics);
- if (Opcode == ISD::FMAXIMUM)
- NeutralAF.changeSign();
-
- return ConstFP->isExactlyValue(NeutralAF);
+ const APFloat VAPF = ConstFP->getValueAPF();
+ const bool NeutralNegative = (Opcode == ISD::FMAXIMUM);
+ if (Flags.hasNoInfs())
+ return VAPF.isLargest() && VAPF.isNegative() == NeutralNegative;
+ return VAPF.isInfinity() && VAPF.isNegative() == NeutralNegative;
}
}
}
>From 7637f8e766c04a6bcdb077da351f3ee2c1f35be8 Mon Sep 17 00:00:00 2001
From: khanxmetu <khanxbahria at gmail.com>
Date: Fri, 7 Aug 2026 18:04:45 +0500
Subject: [PATCH 4/5] style fix
Co-authored-by: Simon Pilgrim <git at redking.me.uk>
---
llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index f6c1860473019..1f9355dae1e2c 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -13762,7 +13762,7 @@ bool SelectionDAG::isIdentityElement(unsigned Opcode, SDNodeFlags Flags,
case ISD::FMINIMUM:
case ISD::FMAXIMUM: {
// Neutral element for fminimum is Inf or FLT_MAX, depending on FMF.
- const APFloat VAPF = ConstFP->getValueAPF();
+ const APFloat &VAPF = ConstFP->getValueAPF();
const bool NeutralNegative = (Opcode == ISD::FMAXIMUM);
if (Flags.hasNoInfs())
return VAPF.isLargest() && VAPF.isNegative() == NeutralNegative;
>From f5f0ff8609b09e5963f9448f2d1a6737b97412ae Mon Sep 17 00:00:00 2001
From: khanxmetu <khanxbahria at gmail.com>
Date: Fri, 7 Aug 2026 18:04:59 +0500
Subject: [PATCH 5/5] style fix
Co-authored-by: Simon Pilgrim <git at redking.me.uk>
---
llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 1f9355dae1e2c..95f5e7b9b8f7c 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -13763,7 +13763,7 @@ bool SelectionDAG::isIdentityElement(unsigned Opcode, SDNodeFlags Flags,
case ISD::FMAXIMUM: {
// Neutral element for fminimum is Inf or FLT_MAX, depending on FMF.
const APFloat &VAPF = ConstFP->getValueAPF();
- const bool NeutralNegative = (Opcode == ISD::FMAXIMUM);
+ bool NeutralNegative = (Opcode == ISD::FMAXIMUM);
if (Flags.hasNoInfs())
return VAPF.isLargest() && VAPF.isNegative() == NeutralNegative;
return VAPF.isInfinity() && VAPF.isNegative() == NeutralNegative;
More information about the llvm-commits
mailing list