[llvm] [DAG] added ISD::FMINIMUM/FMAXIMUM cases in isIdentityElement (PR #210169)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 28 11:53:29 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/2] 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/2] 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
More information about the llvm-commits
mailing list