[llvm] Fix misprint in computeKnownFPClass in GISelValueTracking.cpp (PR #171566)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 10 21:36:27 PST 2025
https://github.com/Seraphimt updated https://github.com/llvm/llvm-project/pull/171566
>From 1f500e2dfe174fc2ea29dee80cf622e4b8ca1c8f Mon Sep 17 00:00:00 2001
From: Seraphimt <svet58585 at mail.ru>
Date: Tue, 9 Dec 2025 21:01:01 +0300
Subject: [PATCH 1/4] Add tests.
---
.../CodeGen/GlobalISel/KnownFPClassTest.cpp | 49 +++++++++++++++++++
1 file changed, 49 insertions(+)
diff --git a/llvm/unittests/CodeGen/GlobalISel/KnownFPClassTest.cpp b/llvm/unittests/CodeGen/GlobalISel/KnownFPClassTest.cpp
index 040f0cfc92076..8ef302ecd6dae 100644
--- a/llvm/unittests/CodeGen/GlobalISel/KnownFPClassTest.cpp
+++ b/llvm/unittests/CodeGen/GlobalISel/KnownFPClassTest.cpp
@@ -726,6 +726,31 @@ TEST_F(AArch64GISelMITest, TestFPClassFAdd) {
EXPECT_EQ(std::nullopt, Known.SignBit);
}
+TEST_F(AArch64GISelMITest, TestFPClassFAdd_Zero) {
+ StringRef MIRString = R"(
+ %ptr:_(p0) = G_IMPLICIT_DEF
+ %lhs:_(s32) = G_LOAD %ptr(p0) :: (load (s32))
+ %rhs:_(s32) = G_FCONSTANT float 0.0
+ %fadd:_(s32) = G_FADD %lhs, %rhs
+ %copy_fadd:_(s32) = COPY %fadd
+)";
+
+ setUp(MIRString);
+ if (!TM)
+ GTEST_SKIP();
+
+ Register CopyReg = Copies[Copies.size() - 1];
+ MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
+ Register SrcReg = FinalCopy->getOperand(1).getReg();
+
+ GISelValueTracking Info(*MF);
+
+ KnownFPClass Known = Info.computeKnownFPClass(SrcReg);
+
+ EXPECT_EQ(fcAllFlags & ~fcNegZero, Known.KnownFPClasses);
+ EXPECT_EQ(std::nullopt, Known.SignBit);
+}
+
TEST_F(AArch64GISelMITest, TestFPClassFMul) {
StringRef MIRString = R"(
%ptr:_(p0) = G_IMPLICIT_DEF
@@ -1000,6 +1025,30 @@ TEST_F(AArch64GISelMITest, TestFPClassFDiv) {
EXPECT_EQ(std::nullopt, Known.SignBit);
}
+TEST_F(AArch64GISelMITest, TestFPClassFDiv_Inf) {
+ StringRef MIRString = R"(
+ %lhs:_(s32) = G_FCONSTANT float 1.0
+ %rhs:_(s32) = G_FCONSTANT float 0.0
+ %fdiv:_(s32) = G_FDIV %lhs, %rhs
+ %copy_fdiv:_(s32) = COPY %fdiv
+)";
+
+ setUp(MIRString);
+ if (!TM)
+ GTEST_SKIP();
+
+ Register CopyReg = Copies[Copies.size() - 1];
+ MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
+ Register SrcReg = FinalCopy->getOperand(1).getReg();
+
+ GISelValueTracking Info(*MF);
+
+ KnownFPClass Known = Info.computeKnownFPClass(SrcReg);
+
+ EXPECT_EQ(fcPositive, Known.KnownFPClasses);
+ EXPECT_EQ(false, Known.SignBit);
+}
+
TEST_F(AArch64GISelMITest, TestFPClassFRem) {
StringRef MIRString = R"(
%ptr:_(p0) = G_IMPLICIT_DEF
>From 336201e74b135f127a9134df62c634a803a3e07f Mon Sep 17 00:00:00 2001
From: Seraphimt <svet58585 at mail.ru>
Date: Tue, 9 Dec 2025 21:09:14 +0300
Subject: [PATCH 2/4] Fix missprints.
---
llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp b/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
index ecba323f8d6bf..8b7db4ad75abe 100644
--- a/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp
@@ -1373,7 +1373,8 @@ void GISelValueTracking::computeKnownFPClass(Register R,
(KnownLHS.isKnownNeverInfinity() || KnownRHS.isKnownNeverInfinity()))
Known.knownNot(fcNan);
- if (Opcode == Instruction::FAdd) {
+ if (Opcode == TargetOpcode::G_FADD ||
+ Opcode == TargetOpcode::G_STRICT_FADD) {
if (KnownLHS.cannotBeOrderedLessThanZero() &&
KnownRHS.cannotBeOrderedLessThanZero())
Known.knownNot(KnownFPClass::OrderedLessThanZeroMask);
@@ -1488,7 +1489,7 @@ void GISelValueTracking::computeKnownFPClass(Register R,
KnownLHS, Depth + 1);
}
- if (Opcode == Instruction::FDiv) {
+ if (Opcode == TargetOpcode::G_FDIV) {
// Only 0/0, Inf/Inf produce NaN.
if (KnownLHS.isKnownNeverNaN() && KnownRHS.isKnownNeverNaN() &&
(KnownLHS.isKnownNeverInfinity() ||
>From feb4c4bd8b4f33687135f0bdfd037ff9d10e4a2a Mon Sep 17 00:00:00 2001
From: Seraphimt <svet58585 at mail.ru>
Date: Wed, 10 Dec 2025 22:38:33 +0300
Subject: [PATCH 3/4] Add neg test.
---
.../CodeGen/GlobalISel/KnownFPClassTest.cpp | 25 +++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/llvm/unittests/CodeGen/GlobalISel/KnownFPClassTest.cpp b/llvm/unittests/CodeGen/GlobalISel/KnownFPClassTest.cpp
index 8ef302ecd6dae..d59418cf1251a 100644
--- a/llvm/unittests/CodeGen/GlobalISel/KnownFPClassTest.cpp
+++ b/llvm/unittests/CodeGen/GlobalISel/KnownFPClassTest.cpp
@@ -751,6 +751,31 @@ TEST_F(AArch64GISelMITest, TestFPClassFAdd_Zero) {
EXPECT_EQ(std::nullopt, Known.SignBit);
}
+TEST_F(AArch64GISelMITest, TestFPClassFAdd_NegZero) {
+ StringRef MIRString = R"(
+ %ptr:_(p0) = G_IMPLICIT_DEF
+ %lhs:_(s32) = G_LOAD %ptr(p0) :: (load (s32))
+ %rhs:_(s32) = G_FCONSTANT float -0.0
+ %fadd:_(s32) = G_FADD %lhs, %rhs
+ %copy_fadd:_(s32) = COPY %fadd
+)";
+
+ setUp(MIRString);
+ if (!TM)
+ GTEST_SKIP();
+
+ Register CopyReg = Copies[Copies.size() - 1];
+ MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
+ Register SrcReg = FinalCopy->getOperand(1).getReg();
+
+ GISelValueTracking Info(*MF);
+
+ KnownFPClass Known = Info.computeKnownFPClass(SrcReg);
+
+ EXPECT_EQ(fcAllFlags, Known.KnownFPClasses);
+ EXPECT_EQ(std::nullopt, Known.SignBit);
+}
+
TEST_F(AArch64GISelMITest, TestFPClassFMul) {
StringRef MIRString = R"(
%ptr:_(p0) = G_IMPLICIT_DEF
>From 4a304d08fd3fcab99210576a58ac64fc6b704620 Mon Sep 17 00:00:00 2001
From: Seraphimt <svet58585 at mail.ru>
Date: Thu, 11 Dec 2025 08:35:12 +0300
Subject: [PATCH 4/4] Add strict_add test.
---
.../CodeGen/GlobalISel/KnownFPClassTest.cpp | 25 +++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/llvm/unittests/CodeGen/GlobalISel/KnownFPClassTest.cpp b/llvm/unittests/CodeGen/GlobalISel/KnownFPClassTest.cpp
index d59418cf1251a..e47e53968b090 100644
--- a/llvm/unittests/CodeGen/GlobalISel/KnownFPClassTest.cpp
+++ b/llvm/unittests/CodeGen/GlobalISel/KnownFPClassTest.cpp
@@ -776,6 +776,31 @@ TEST_F(AArch64GISelMITest, TestFPClassFAdd_NegZero) {
EXPECT_EQ(std::nullopt, Known.SignBit);
}
+TEST_F(AArch64GISelMITest, TestFPClassFstrictAdd_Zero) {
+ StringRef MIRString = R"(
+ %ptr:_(p0) = G_IMPLICIT_DEF
+ %lhs:_(s32) = G_LOAD %ptr(p0) :: (load (s32))
+ %rhs:_(s32) = G_FCONSTANT float 0.0
+ %fadd:_(s32) = G_STRICT_FADD %lhs, %rhs
+ %copy_fadd:_(s32) = COPY %fadd
+)";
+
+ setUp(MIRString);
+ if (!TM)
+ GTEST_SKIP();
+
+ Register CopyReg = Copies[Copies.size() - 1];
+ MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
+ Register SrcReg = FinalCopy->getOperand(1).getReg();
+
+ GISelValueTracking Info(*MF);
+
+ KnownFPClass Known = Info.computeKnownFPClass(SrcReg);
+
+ EXPECT_EQ(fcAllFlags & ~fcNegZero, Known.KnownFPClasses);
+ EXPECT_EQ(std::nullopt, Known.SignBit);
+}
+
TEST_F(AArch64GISelMITest, TestFPClassFMul) {
StringRef MIRString = R"(
%ptr:_(p0) = G_IMPLICIT_DEF
More information about the llvm-commits
mailing list