aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/Analysis/ValueTrackingTest.cpp
diff options
context:
space:
mode:
authorMatt Arsenault <Matthew.Arsenault@amd.com>2023-02-24 10:08:46 -0400
committerMatt Arsenault <arsenm2@gmail.com>2023-03-16 23:14:40 -0400
commitb39deda3e1b3617650964de8a134ca828c1a2451 (patch)
tree7f60c5d2bfd4f6ad39e7886ecc2ea9e612adb6c7 /llvm/unittests/Analysis/ValueTrackingTest.cpp
parent931d4098a2ebd7f1046e820164b5b6c85650d4d9 (diff)
downloadllvm-b39deda3e1b3617650964de8a134ca828c1a2451.zip
llvm-b39deda3e1b3617650964de8a134ca828c1a2451.tar.gz
llvm-b39deda3e1b3617650964de8a134ca828c1a2451.tar.bz2
ValueTracking: Handle nofpclass in computeKnownFPClass
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"