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.cpp77
1 files changed, 77 insertions, 0 deletions
diff --git a/llvm/unittests/Analysis/ValueTrackingTest.cpp b/llvm/unittests/Analysis/ValueTrackingTest.cpp
index 0211627..4e6b1ef 100644
--- a/llvm/unittests/Analysis/ValueTrackingTest.cpp
+++ b/llvm/unittests/Analysis/ValueTrackingTest.cpp
@@ -1351,6 +1351,83 @@ TEST_F(ComputeKnownFPClassTest, SelectNNaNNInf) {
expectKnownFPClass(~(fcNan | fcInf), std::nullopt);
}
+TEST_F(ComputeKnownFPClassTest, SelectNoFPClassArgUnionAll) {
+ parseAssembly(
+ "define float @test(i1 %cond, float nofpclass(snan ninf nsub pzero pnorm) %arg0, float nofpclass(qnan nnorm nzero psub pinf) %arg1) {\n"
+ " %A = select i1 %cond, float %arg0, float %arg1"
+ " ret float %A\n"
+ "}\n");
+ expectKnownFPClass(fcAllFlags, std::nullopt);
+}
+
+TEST_F(ComputeKnownFPClassTest, SelectNoFPClassArgNoNan) {
+ parseAssembly(
+ "define float @test(i1 %cond, float nofpclass(nan) %arg0, float nofpclass(nan) %arg1) {\n"
+ " %A = select i1 %cond, float %arg0, float %arg1"
+ " ret float %A\n"
+ "}\n");
+ expectKnownFPClass(~fcNan, std::nullopt);
+}
+
+TEST_F(ComputeKnownFPClassTest, SelectNoFPClassArgNoPInf) {
+ parseAssembly(
+ "define float @test(i1 %cond, float nofpclass(inf) %arg0, float nofpclass(pinf) %arg1) {\n"
+ " %A = select i1 %cond, float %arg0, float %arg1"
+ " ret float %A\n"
+ "}\n");
+ expectKnownFPClass(~fcPosInf, std::nullopt);
+}
+
+TEST_F(ComputeKnownFPClassTest, SelectNoFPClassArgNoNInf) {
+ parseAssembly(
+ "define float @test(i1 %cond, float nofpclass(ninf) %arg0, float nofpclass(inf) %arg1) {\n"
+ " %A = select i1 %cond, float %arg0, float %arg1"
+ " ret float %A\n"
+ "}\n");
+ expectKnownFPClass(~fcNegInf, std::nullopt);
+}
+
+TEST_F(ComputeKnownFPClassTest, SelectNoFPClassCallSiteNoNan) {
+ parseAssembly(
+ "declare float @func()\n"
+ "define float @test() {\n"
+ " %A = call nofpclass(nan) float @func()\n"
+ " ret float %A\n"
+ "}\n");
+ expectKnownFPClass(~fcNan, std::nullopt);
+}
+
+TEST_F(ComputeKnownFPClassTest, SelectNoFPClassCallSiteNoZeros) {
+ parseAssembly(
+ "declare float @func()\n"
+ "define float @test() {\n"
+ " %A = call nofpclass(zero) float @func()\n"
+ " ret float %A\n"
+ "}\n");
+ expectKnownFPClass(~fcZero, std::nullopt);
+}
+
+TEST_F(ComputeKnownFPClassTest, SelectNoFPClassDeclarationNoNan) {
+ parseAssembly(
+ "declare nofpclass(nan) float @no_nans()\n"
+ "define float @test() {\n"
+ " %A = call float @no_nans()\n"
+ " ret float %A\n"
+ "}\n");
+ expectKnownFPClass(~fcNan, std::nullopt);
+}
+
+// Check nofpclass + ninf works on a callsite
+TEST_F(ComputeKnownFPClassTest, SelectNoFPClassCallSiteNoZerosNInfFlags) {
+ parseAssembly(
+ "declare float @func()\n"
+ "define float @test() {\n"
+ " %A = call ninf nofpclass(zero) float @func()\n"
+ " ret float %A\n"
+ "}\n");
+ expectKnownFPClass(~(fcZero | fcInf), std::nullopt);
+}
+
TEST_F(ComputeKnownFPClassTest, FNegNInf) {
parseAssembly(
"define float @test(float %arg) {\n"