aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/Analysis/ValueTrackingTest.cpp
diff options
context:
space:
mode:
authorMatt Arsenault <Matthew.Arsenault@amd.com>2023-04-25 19:03:18 -0400
committerMatt Arsenault <arsenm2@gmail.com>2023-06-20 21:30:09 -0400
commit06f942016b6b1e376334937a3b132232e311104f (patch)
treea46e72e9533418b41376aed84587330c20a4540d /llvm/unittests/Analysis/ValueTrackingTest.cpp
parent7d6b8249faba3c761de5de66f3dafb96a3fd9047 (diff)
downloadllvm-06f942016b6b1e376334937a3b132232e311104f.zip
llvm-06f942016b6b1e376334937a3b132232e311104f.tar.gz
llvm-06f942016b6b1e376334937a3b132232e311104f.tar.bz2
ValueTracking: Ignore -0 for nsz sqrt with UseInstrInfo in computeKnownFPClass
This avoids a regression when SignBitMustBeZero is moved to computeKnownFPClass.
Diffstat (limited to 'llvm/unittests/Analysis/ValueTrackingTest.cpp')
-rw-r--r--llvm/unittests/Analysis/ValueTrackingTest.cpp74
1 files changed, 74 insertions, 0 deletions
diff --git a/llvm/unittests/Analysis/ValueTrackingTest.cpp b/llvm/unittests/Analysis/ValueTrackingTest.cpp
index f8910ea..5cc76e2 100644
--- a/llvm/unittests/Analysis/ValueTrackingTest.cpp
+++ b/llvm/unittests/Analysis/ValueTrackingTest.cpp
@@ -1890,6 +1890,80 @@ TEST_F(ComputeKnownFPClassTest, FCmpToClassTest_PInf) {
EXPECT_EQ(fcNone, UgtClass);
}
+TEST_F(ComputeKnownFPClassTest, SqrtNszSignBit) {
+ parseAssembly(
+ "declare float @llvm.sqrt.f32(float)\n"
+ "define float @test(float %arg, float nofpclass(nan) %arg.nnan) {\n"
+ " %A = call float @llvm.sqrt.f32(float %arg)\n"
+ " %A2 = call nsz float @llvm.sqrt.f32(float %arg)\n"
+ " %A3 = call float @llvm.sqrt.f32(float %arg.nnan)\n"
+ " %A4 = call nsz float @llvm.sqrt.f32(float %arg.nnan)\n"
+ " ret float %A\n"
+ "}\n");
+
+ const FPClassTest SqrtMask = fcPositive | fcNegZero | fcNan;
+ const FPClassTest NszSqrtMask = fcPositive | fcNan;
+
+ {
+ KnownFPClass UseInstrInfo =
+ computeKnownFPClass(A, M->getDataLayout(), fcAllFlags, 0, nullptr,
+ nullptr, nullptr, nullptr, /*UseInstrInfo=*/true);
+ EXPECT_EQ(SqrtMask, UseInstrInfo.KnownFPClasses);
+ EXPECT_EQ(std::nullopt, UseInstrInfo.SignBit);
+
+ KnownFPClass NoUseInstrInfo =
+ computeKnownFPClass(A, M->getDataLayout(), fcAllFlags, 0, nullptr,
+ nullptr, nullptr, nullptr, /*UseInstrInfo=*/false);
+ EXPECT_EQ(SqrtMask, NoUseInstrInfo.KnownFPClasses);
+ EXPECT_EQ(std::nullopt, NoUseInstrInfo.SignBit);
+ }
+
+ {
+ KnownFPClass UseInstrInfoNSZ =
+ computeKnownFPClass(A2, M->getDataLayout(), fcAllFlags, 0, nullptr,
+ nullptr, nullptr, nullptr, /*UseInstrInfo=*/true);
+ EXPECT_EQ(NszSqrtMask, UseInstrInfoNSZ.KnownFPClasses);
+ EXPECT_EQ(std::nullopt, UseInstrInfoNSZ.SignBit);
+
+ KnownFPClass NoUseInstrInfoNSZ =
+ computeKnownFPClass(A2, M->getDataLayout(), fcAllFlags, 0, nullptr,
+ nullptr, nullptr, nullptr, /*UseInstrInfo=*/false);
+ EXPECT_EQ(SqrtMask, NoUseInstrInfoNSZ.KnownFPClasses);
+ EXPECT_EQ(std::nullopt, NoUseInstrInfoNSZ.SignBit);
+ }
+
+ {
+ KnownFPClass UseInstrInfoNoNan =
+ computeKnownFPClass(A3, M->getDataLayout(), fcAllFlags, 0, nullptr,
+ nullptr, nullptr, nullptr, /*UseInstrInfo=*/true);
+ EXPECT_EQ(fcPositive | fcNegZero | fcQNan,
+ UseInstrInfoNoNan.KnownFPClasses);
+ EXPECT_EQ(std::nullopt, UseInstrInfoNoNan.SignBit);
+
+ KnownFPClass NoUseInstrInfoNoNan =
+ computeKnownFPClass(A3, M->getDataLayout(), fcAllFlags, 0, nullptr,
+ nullptr, nullptr, nullptr, /*UseInstrInfo=*/false);
+ EXPECT_EQ(fcPositive | fcNegZero | fcQNan,
+ NoUseInstrInfoNoNan.KnownFPClasses);
+ EXPECT_EQ(std::nullopt, NoUseInstrInfoNoNan.SignBit);
+ }
+
+ {
+ KnownFPClass UseInstrInfoNSZNoNan =
+ computeKnownFPClass(A4, M->getDataLayout(), fcAllFlags, 0, nullptr,
+ nullptr, nullptr, nullptr, /*UseInstrInfo=*/true);
+ EXPECT_EQ(fcPositive | fcQNan, UseInstrInfoNSZNoNan.KnownFPClasses);
+ EXPECT_EQ(false, UseInstrInfoNSZNoNan.SignBit);
+
+ KnownFPClass NoUseInstrInfoNSZNoNan =
+ computeKnownFPClass(A4, M->getDataLayout(), fcAllFlags, 0, nullptr,
+ nullptr, nullptr, nullptr, /*UseInstrInfo=*/false);
+ EXPECT_EQ(fcPositive | fcNegZero | fcQNan,
+ NoUseInstrInfoNSZNoNan.KnownFPClasses);
+ EXPECT_EQ(std::nullopt, NoUseInstrInfoNSZNoNan.SignBit);
+ }
+}
+
TEST_F(ValueTrackingTest, isNonZeroRecurrence) {
parseAssembly(R"(
define i1 @test(i8 %n, i8 %r) {