aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/Analysis/ValueTrackingTest.cpp
diff options
context:
space:
mode:
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"