[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