Skip to content

Commit 0603d4a

Browse files
authored
Fix misprint in computeKnownFPClass in GISelValueTracking.cpp (#171566)
Fix wrong value(from Instruction enum) in conditional and add test check. Related with #169959
1 parent d901485 commit 0603d4a

File tree

2 files changed

+102
-2
lines changed

2 files changed

+102
-2
lines changed

llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1373,7 +1373,8 @@ void GISelValueTracking::computeKnownFPClass(Register R,
13731373
(KnownLHS.isKnownNeverInfinity() || KnownRHS.isKnownNeverInfinity()))
13741374
Known.knownNot(fcNan);
13751375

1376-
if (Opcode == Instruction::FAdd) {
1376+
if (Opcode == TargetOpcode::G_FADD ||
1377+
Opcode == TargetOpcode::G_STRICT_FADD) {
13771378
if (KnownLHS.cannotBeOrderedLessThanZero() &&
13781379
KnownRHS.cannotBeOrderedLessThanZero())
13791380
Known.knownNot(KnownFPClass::OrderedLessThanZeroMask);
@@ -1488,7 +1489,7 @@ void GISelValueTracking::computeKnownFPClass(Register R,
14881489
KnownLHS, Depth + 1);
14891490
}
14901491

1491-
if (Opcode == Instruction::FDiv) {
1492+
if (Opcode == TargetOpcode::G_FDIV) {
14921493
// Only 0/0, Inf/Inf produce NaN.
14931494
if (KnownLHS.isKnownNeverNaN() && KnownRHS.isKnownNeverNaN() &&
14941495
(KnownLHS.isKnownNeverInfinity() ||

llvm/unittests/CodeGen/GlobalISel/KnownFPClassTest.cpp

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
729804
TEST_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+
10031102
TEST_F(AArch64GISelMITest, TestFPClassFRem) {
10041103
StringRef MIRString = R"(
10051104
%ptr:_(p0) = G_IMPLICIT_DEF

0 commit comments

Comments
 (0)