aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/Analysis/ValueTrackingTest.cpp
diff options
context:
space:
mode:
authorMatt Arsenault <Matthew.Arsenault@amd.com>2025-05-07 08:02:24 +0200
committerGitHub <noreply@github.com>2025-05-07 08:02:24 +0200
commit609a8331a0c9773ab1540a7463a4f6431470e777 (patch)
tree61dbe715ba29d2e47aa677bb8fa164b564c84d00 /llvm/unittests/Analysis/ValueTrackingTest.cpp
parent03f3f156905b3137c1c6c542b7b506d5ec618c24 (diff)
downloadllvm-609a8331a0c9773ab1540a7463a4f6431470e777.zip
llvm-609a8331a0c9773ab1540a7463a4f6431470e777.tar.gz
llvm-609a8331a0c9773ab1540a7463a4f6431470e777.tar.bz2
ValueTracking: Handle minimumnum and maximumnum in computeKnownFPClass (#138737)
For now use the same treatment as minnum/maxnum, but these should diverge. alive2 seems happy with this, except for some preexisting bugs with weird denormal modes.
Diffstat (limited to 'llvm/unittests/Analysis/ValueTrackingTest.cpp')
-rw-r--r--llvm/unittests/Analysis/ValueTrackingTest.cpp56
1 files changed, 56 insertions, 0 deletions
diff --git a/llvm/unittests/Analysis/ValueTrackingTest.cpp b/llvm/unittests/Analysis/ValueTrackingTest.cpp
index 285f342..e1baa38 100644
--- a/llvm/unittests/Analysis/ValueTrackingTest.cpp
+++ b/llvm/unittests/Analysis/ValueTrackingTest.cpp
@@ -1618,6 +1618,62 @@ TEST_F(ComputeKnownFPClassTest, FMulNoZero) {
expectKnownFPClass(fcAllFlags, std::nullopt, A7);
}
+TEST_F(ComputeKnownFPClassTest, MinimumNumSignBit) {
+ parseAssembly(
+ R"(
+ define float @test(
+ float %unknown,
+ float nofpclass(nan) %nnan,
+ float nofpclass(nan pinf pnorm psub pzero) %nnan.nopos,
+ float nofpclass(nan ninf nnorm nsub nzero) %nnan.noneg,
+ float nofpclass(ninf nnorm nsub nzero) %noneg,
+ float nofpclass(pinf pnorm psub pzero) %nopos) {
+ %A = call float @llvm.minimumnum.f32(float %nnan.nopos, float %unknown)
+ %A2 = call float @llvm.minimumnum.f32(float %unknown, float %nnan.nopos)
+ %A3 = call float @llvm.minimumnum.f32(float %nnan.noneg, float %unknown)
+ %A4 = call float @llvm.minimumnum.f32(float %unknown, float %nnan.noneg)
+ %A5 = call float @llvm.minimumnum.f32(float %nnan.nopos, float %nnan.noneg)
+ %A6 = call float @llvm.minimumnum.f32(float %nopos, float %nnan.noneg)
+ %A7 = call float @llvm.minimumnum.f32(float %nnan.nopos, float %noneg)
+ ret float %A
+ })");
+ expectKnownFPClass(fcNegative, true, A);
+ expectKnownFPClass(fcNegative, true, A2);
+ expectKnownFPClass(~fcNan, std::nullopt, A3);
+ expectKnownFPClass(~fcNan, std::nullopt, A4);
+ expectKnownFPClass(fcNegative, true, A5);
+ expectKnownFPClass(~fcNan, std::nullopt, A6);
+ expectKnownFPClass(fcNegative, true, A7);
+}
+
+TEST_F(ComputeKnownFPClassTest, MaximumNumSignBit) {
+ parseAssembly(
+ R"(
+ define float @test(
+ float %unknown,
+ float nofpclass(nan) %nnan,
+ float nofpclass(nan pinf pnorm psub pzero) %nnan.nopos,
+ float nofpclass(nan ninf nnorm nsub nzero) %nnan.noneg,
+ float nofpclass(ninf nnorm nsub nzero) %noneg,
+ float nofpclass(pinf pnorm psub pzero) %nopos) {
+ %A = call float @llvm.maximumnum.f32(float %nnan.noneg, float %unknown)
+ %A2 = call float @llvm.maximumnum.f32(float %unknown, float %nnan.noneg)
+ %A3 = call float @llvm.maximumnum.f32(float %nnan.nopos, float %unknown)
+ %A4 = call float @llvm.maximumnum.f32(float %unknown, float %nnan.nopos)
+ %A5 = call float @llvm.maximumnum.f32(float %nnan.noneg, float %nnan.nopos)
+ %A6 = call float @llvm.maximumnum.f32(float %noneg, float %nnan.nopos)
+ %A7 = call float @llvm.maximumnum.f32(float %nnan.noneg, float %nopos)
+ ret float %A
+ })");
+ expectKnownFPClass(fcPositive, false, A);
+ expectKnownFPClass(fcPositive, false, A2);
+ expectKnownFPClass(~fcNan, std::nullopt, A3);
+ expectKnownFPClass(~fcNan, std::nullopt, A4);
+ expectKnownFPClass(fcPositive, false, A5);
+ expectKnownFPClass(~fcNan, std::nullopt, A6);
+ expectKnownFPClass(fcPositive, false, A7);
+}
+
TEST_F(ComputeKnownFPClassTest, Phi) {
parseAssembly(
"define float @test(i1 %cond, float nofpclass(nan inf) %arg0, float nofpclass(nan) %arg1) {\n"