[llvm] [DAG] added ISD::FMINIMUM/FMAXIMUM cases in isIdentityElement (PR #210169)

via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 29 00:54:35 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/3] 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/3] 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/3] 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;
     }
     }
   }



More information about the llvm-commits mailing list