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

via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 7 09:25:27 PDT 2026


Author: khanxmetu
Date: 2026-08-07T16:25:22Z
New Revision: 320d264daf6b2ab4aba993bac417ea7372ddca15

URL: https://github.com/llvm/llvm-project/commit/320d264daf6b2ab4aba993bac417ea7372ddca15
DIFF: https://github.com/llvm/llvm-project/commit/320d264daf6b2ab4aba993bac417ea7372ddca15.diff

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

Fixed #209248

Implemented analogous to existing FMINNUM/FMAXNUM cases

Added: 
    

Modified: 
    llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
    llvm/unittests/CodeGen/SelectionDAGNodeConstructionTest.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index b10a03fecaac1..3c0bcf73f0d98 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -13945,6 +13945,15 @@ 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.
+      const APFloat &VAPF = ConstFP->getValueAPF();
+      bool NeutralNegative = (Opcode == ISD::FMAXIMUM);
+      if (Flags.hasNoInfs())
+        return VAPF.isLargest() && VAPF.isNegative() == NeutralNegative;
+      return VAPF.isInfinity() && VAPF.isNegative() == NeutralNegative;
+    }
     }
   }
   return false;

diff  --git a/llvm/unittests/CodeGen/SelectionDAGNodeConstructionTest.cpp b/llvm/unittests/CodeGen/SelectionDAGNodeConstructionTest.cpp
index 7d7ece87162e8..c2c1b52926c5a 100644
--- a/llvm/unittests/CodeGen/SelectionDAGNodeConstructionTest.cpp
+++ b/llvm/unittests/CodeGen/SelectionDAGNodeConstructionTest.cpp
@@ -9,6 +9,7 @@
 #include "SelectionDAGTestBase.h"
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/SmallVector.h"
+#include "llvm/CodeGen/ISDOpcodes.h"
 
 using namespace llvm;
 
@@ -388,6 +389,29 @@ TEST_F(SelectionDAGNodeConstructionTest, CTLS) {
   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));
+}
 TEST_F(SelectionDAGNodeConstructionTest,
        FoldConstantPartialReduceMLASignednessAndInputWidth) {
   SDLoc DL;


        


More information about the llvm-commits mailing list