@@ -726,6 +726,81 @@ TEST_F(AArch64GISelMITest, TestFPClassFAdd) {
726726 EXPECT_EQ (std::nullopt , Known.SignBit );
727727}
728728
729+ TEST_F (AArch64GISelMITest, TestFPClassFAdd_Zero) {
730+ StringRef MIRString = R"(
731+ %ptr:_(p0) = G_IMPLICIT_DEF
732+ %lhs:_(s32) = G_LOAD %ptr(p0) :: (load (s32))
733+ %rhs:_(s32) = G_FCONSTANT float 0.0
734+ %fadd:_(s32) = G_FADD %lhs, %rhs
735+ %copy_fadd:_(s32) = COPY %fadd
736+ )" ;
737+
738+ setUp (MIRString);
739+ if (!TM)
740+ GTEST_SKIP ();
741+
742+ Register CopyReg = Copies[Copies.size () - 1 ];
743+ MachineInstr *FinalCopy = MRI->getVRegDef (CopyReg);
744+ Register SrcReg = FinalCopy->getOperand (1 ).getReg ();
745+
746+ GISelValueTracking Info (*MF);
747+
748+ KnownFPClass Known = Info.computeKnownFPClass (SrcReg);
749+
750+ EXPECT_EQ (fcAllFlags & ~fcNegZero, Known.KnownFPClasses );
751+ EXPECT_EQ (std::nullopt , Known.SignBit );
752+ }
753+
754+ TEST_F (AArch64GISelMITest, TestFPClassFAdd_NegZero) {
755+ StringRef MIRString = R"(
756+ %ptr:_(p0) = G_IMPLICIT_DEF
757+ %lhs:_(s32) = G_LOAD %ptr(p0) :: (load (s32))
758+ %rhs:_(s32) = G_FCONSTANT float -0.0
759+ %fadd:_(s32) = G_FADD %lhs, %rhs
760+ %copy_fadd:_(s32) = COPY %fadd
761+ )" ;
762+
763+ setUp (MIRString);
764+ if (!TM)
765+ GTEST_SKIP ();
766+
767+ Register CopyReg = Copies[Copies.size () - 1 ];
768+ MachineInstr *FinalCopy = MRI->getVRegDef (CopyReg);
769+ Register SrcReg = FinalCopy->getOperand (1 ).getReg ();
770+
771+ GISelValueTracking Info (*MF);
772+
773+ KnownFPClass Known = Info.computeKnownFPClass (SrcReg);
774+
775+ EXPECT_EQ (fcAllFlags, Known.KnownFPClasses );
776+ EXPECT_EQ (std::nullopt , Known.SignBit );
777+ }
778+
779+ TEST_F (AArch64GISelMITest, TestFPClassFstrictAdd_Zero) {
780+ StringRef MIRString = R"(
781+ %ptr:_(p0) = G_IMPLICIT_DEF
782+ %lhs:_(s32) = G_LOAD %ptr(p0) :: (load (s32))
783+ %rhs:_(s32) = G_FCONSTANT float 0.0
784+ %fadd:_(s32) = G_STRICT_FADD %lhs, %rhs
785+ %copy_fadd:_(s32) = COPY %fadd
786+ )" ;
787+
788+ setUp (MIRString);
789+ if (!TM)
790+ GTEST_SKIP ();
791+
792+ Register CopyReg = Copies[Copies.size () - 1 ];
793+ MachineInstr *FinalCopy = MRI->getVRegDef (CopyReg);
794+ Register SrcReg = FinalCopy->getOperand (1 ).getReg ();
795+
796+ GISelValueTracking Info (*MF);
797+
798+ KnownFPClass Known = Info.computeKnownFPClass (SrcReg);
799+
800+ EXPECT_EQ (fcAllFlags & ~fcNegZero, Known.KnownFPClasses );
801+ EXPECT_EQ (std::nullopt , Known.SignBit );
802+ }
803+
729804TEST_F (AArch64GISelMITest, TestFPClassFMul) {
730805 StringRef MIRString = R"(
731806 %ptr:_(p0) = G_IMPLICIT_DEF
@@ -1000,6 +1075,30 @@ TEST_F(AArch64GISelMITest, TestFPClassFDiv) {
10001075 EXPECT_EQ (std::nullopt , Known.SignBit );
10011076}
10021077
1078+ TEST_F (AArch64GISelMITest, TestFPClassFDiv_Inf) {
1079+ StringRef MIRString = R"(
1080+ %lhs:_(s32) = G_FCONSTANT float 1.0
1081+ %rhs:_(s32) = G_FCONSTANT float 0.0
1082+ %fdiv:_(s32) = G_FDIV %lhs, %rhs
1083+ %copy_fdiv:_(s32) = COPY %fdiv
1084+ )" ;
1085+
1086+ setUp (MIRString);
1087+ if (!TM)
1088+ GTEST_SKIP ();
1089+
1090+ Register CopyReg = Copies[Copies.size () - 1 ];
1091+ MachineInstr *FinalCopy = MRI->getVRegDef (CopyReg);
1092+ Register SrcReg = FinalCopy->getOperand (1 ).getReg ();
1093+
1094+ GISelValueTracking Info (*MF);
1095+
1096+ KnownFPClass Known = Info.computeKnownFPClass (SrcReg);
1097+
1098+ EXPECT_EQ (fcPositive, Known.KnownFPClasses );
1099+ EXPECT_EQ (false , Known.SignBit );
1100+ }
1101+
10031102TEST_F (AArch64GISelMITest, TestFPClassFRem) {
10041103 StringRef MIRString = R"(
10051104 %ptr:_(p0) = G_IMPLICIT_DEF
0 commit comments