[llvm] [DAG] Add initial version of SelectionDAG::computeKnownFPClass (PR #188790)

Xinlong Chen via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 30 00:16:11 PDT 2026


================
@@ -1574,4 +1575,99 @@ TEST_F(AArch64SelectionDAGTest, KnownNeverZero_Select) {
   EXPECT_FALSE(DAG->isKnownNeverZero(VSelect444Big, DemandAll));
   EXPECT_TRUE(DAG->isKnownNeverZero(VSelect4444, DemandAll));
 }
+
+// tests for SelectionDAG::computeKnownFPClass
+TEST_F(AArch64SelectionDAGTest, ComputeKnownFPClass_ConstantScalar) {
+  SDLoc Loc;
+
+  SDValue PosZero = DAG->getConstantFP(APFloat::getZero(APFloat::IEEEsingle()),
+                                       Loc, MVT::f32);
+  KnownFPClass Known = DAG->computeKnownFPClass(PosZero, fcAllFlags);
+  EXPECT_EQ(Known.KnownFPClasses, fcPosZero);
+  EXPECT_TRUE(Known.SignBit.has_value());
+  EXPECT_FALSE(*Known.SignBit);
+
+  SDValue NegZero = DAG->getConstantFP(
+      APFloat::getZero(APFloat::IEEEsingle(), true), Loc, MVT::f32);
+  Known = DAG->computeKnownFPClass(NegZero, fcAllFlags);
+  EXPECT_EQ(Known.KnownFPClasses, fcNegZero);
+  EXPECT_TRUE(Known.SignBit.has_value());
+  EXPECT_TRUE(*Known.SignBit);
+
+  SDValue PosInf =
+      DAG->getConstantFP(APFloat::getInf(APFloat::IEEEsingle()), Loc, MVT::f32);
+  Known = DAG->computeKnownFPClass(PosInf, fcAllFlags);
+  EXPECT_EQ(Known.KnownFPClasses, fcPosInf);
+  EXPECT_TRUE(Known.SignBit.has_value());
+  EXPECT_FALSE(*Known.SignBit);
+
+  SDValue QNaN = DAG->getConstantFP(APFloat::getQNaN(APFloat::IEEEsingle()),
+                                    Loc, MVT::f32);
+  Known = DAG->computeKnownFPClass(QNaN, fcAllFlags);
+  EXPECT_EQ(Known.KnownFPClasses, fcQNan);
+
+  SDValue One = DAG->getConstantFP(1.0, Loc, MVT::f32);
+  Known = DAG->computeKnownFPClass(One, fcAllFlags);
+  EXPECT_EQ(Known.KnownFPClasses, fcPosNormal);
+  EXPECT_TRUE(Known.SignBit.has_value());
+  EXPECT_FALSE(*Known.SignBit);
+}
+
+TEST_F(AArch64SelectionDAGTest, ComputeKnownFPClass_BuildVector) {
+  SDLoc Loc;
+
+  SDValue PosOne = DAG->getConstantFP(1.0, Loc, MVT::f32);
+  SDValue PosTwo = DAG->getConstantFP(2.0, Loc, MVT::f32);
+  SDValue NegOne = DAG->getConstantFP(-1.0, Loc, MVT::f32);
+
+  EVT VecVT = MVT::v2f32;
+
+  SDValue VecPosPos = DAG->getBuildVector(VecVT, Loc, {PosOne, PosTwo});
+  KnownFPClass Known = DAG->computeKnownFPClass(VecPosPos, fcAllFlags);
+  EXPECT_EQ(Known.KnownFPClasses, fcPosNormal);
+  EXPECT_TRUE(Known.SignBit.has_value());
+  EXPECT_FALSE(*Known.SignBit);
+
+  SDValue VecPosNeg = DAG->getBuildVector(VecVT, Loc, {PosOne, NegOne});
+  Known = DAG->computeKnownFPClass(VecPosNeg, fcAllFlags);
+  EXPECT_EQ(Known.KnownFPClasses, fcPosNormal | fcNegNormal);
+  EXPECT_FALSE(Known.SignBit.has_value());
----------------
Xinlong-Chen wrote:

done

https://github.com/llvm/llvm-project/pull/188790


More information about the llvm-commits mailing list