diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2025-05-07 08:02:24 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-05-07 08:02:24 +0200 |
commit | 609a8331a0c9773ab1540a7463a4f6431470e777 (patch) | |
tree | 61dbe715ba29d2e47aa677bb8fa164b564c84d00 /llvm/unittests/Analysis/ValueTrackingTest.cpp | |
parent | 03f3f156905b3137c1c6c542b7b506d5ec618c24 (diff) | |
download | llvm-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.cpp | 56 |
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" |