diff options
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" |