[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