aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/Analysis/ValueTrackingTest.cpp
diff options
context:
space:
mode:
authorMatt Arsenault <Matthew.Arsenault@amd.com>2023-11-14 10:05:38 +0900
committerGitHub <noreply@github.com>2023-11-14 10:05:38 +0900
commit0e1a52f556a90cc7b7ce7666fc476c99cf7bfb02 (patch)
treea578f9a412861f9316a14ef8af66bb8f63ce7eea /llvm/unittests/Analysis/ValueTrackingTest.cpp
parent45a92acfd945bef2dca391bccd08a09348c35c67 (diff)
downloadllvm-0e1a52f556a90cc7b7ce7666fc476c99cf7bfb02.zip
llvm-0e1a52f556a90cc7b7ce7666fc476c99cf7bfb02.tar.gz
llvm-0e1a52f556a90cc7b7ce7666fc476c99cf7bfb02.tar.bz2
ValueTracking: Handle compare gt to -inf in class identification (#72086)
This apparently shows up somewhere in chromium. We also are missing a canonicalization to an equality compare with inf.
Diffstat (limited to 'llvm/unittests/Analysis/ValueTrackingTest.cpp')
-rw-r--r--llvm/unittests/Analysis/ValueTrackingTest.cpp73
1 files changed, 69 insertions, 4 deletions
diff --git a/llvm/unittests/Analysis/ValueTrackingTest.cpp b/llvm/unittests/Analysis/ValueTrackingTest.cpp
index 5bd1bb3..1190550 100644
--- a/llvm/unittests/Analysis/ValueTrackingTest.cpp
+++ b/llvm/unittests/Analysis/ValueTrackingTest.cpp
@@ -1830,6 +1830,8 @@ TEST_F(ComputeKnownFPClassTest, FCmpToClassTest_NInf) {
" %A2 = fcmp uge double %arg, 0xFFF0000000000000"
" %A3 = fcmp ogt double %arg, 0xFFF0000000000000"
" %A4 = fcmp ule double %arg, 0xFFF0000000000000"
+ " %A5 = fcmp oge double %arg, 0xFFF0000000000000"
+ " %A6 = fcmp ult double %arg, 0xFFF0000000000000"
" ret i1 %A\n"
"}\n");
@@ -1847,14 +1849,77 @@ TEST_F(ComputeKnownFPClassTest, FCmpToClassTest_NInf) {
auto [OgtVal, OgtClass] =
fcmpToClassTest(CmpInst::FCMP_OGT, *A3->getFunction(), A3->getOperand(0),
A3->getOperand(1));
- EXPECT_EQ(nullptr, OgtVal);
- EXPECT_EQ(fcAllFlags, OgtClass);
+ EXPECT_EQ(A3->getOperand(0), OgtVal);
+ EXPECT_EQ(~(fcNegInf | fcNan), OgtClass);
auto [UleVal, UleClass] =
fcmpToClassTest(CmpInst::FCMP_ULE, *A4->getFunction(), A4->getOperand(0),
A4->getOperand(1));
- EXPECT_EQ(nullptr, UleVal);
- EXPECT_EQ(fcAllFlags, UleClass);
+ EXPECT_EQ(A4->getOperand(0), UleVal);
+ EXPECT_EQ(fcNegInf | fcNan, UleClass);
+
+ auto [OgeVal, OgeClass] =
+ fcmpToClassTest(CmpInst::FCMP_OGE, *A5->getFunction(), A5->getOperand(0),
+ A5->getOperand(1));
+ EXPECT_EQ(A5->getOperand(0), OgeVal);
+ EXPECT_EQ(~fcNan, OgeClass);
+
+ auto [UltVal, UltClass] =
+ fcmpToClassTest(CmpInst::FCMP_ULT, *A6->getFunction(), A6->getOperand(0),
+ A6->getOperand(1));
+ EXPECT_EQ(A6->getOperand(0), UltVal);
+ EXPECT_EQ(fcNan, UltClass);
+}
+
+TEST_F(ComputeKnownFPClassTest, FCmpToClassTest_FabsNInf) {
+ parseAssembly("declare double @llvm.fabs.f64(double)\n"
+ "define i1 @test(double %arg) {\n"
+ " %fabs.arg = call double @llvm.fabs.f64(double %arg)\n"
+ " %A = fcmp olt double %fabs.arg, 0xFFF0000000000000"
+ " %A2 = fcmp uge double %fabs.arg, 0xFFF0000000000000"
+ " %A3 = fcmp ogt double %fabs.arg, 0xFFF0000000000000"
+ " %A4 = fcmp ule double %fabs.arg, 0xFFF0000000000000"
+ " %A5 = fcmp oge double %fabs.arg, 0xFFF0000000000000"
+ " %A6 = fcmp ult double %fabs.arg, 0xFFF0000000000000"
+ " ret i1 %A\n"
+ "}\n");
+
+ Value *ArgVal = F->getArg(0);
+
+ auto [OltVal, OltClass] = fcmpToClassTest(
+ CmpInst::FCMP_OLT, *A->getFunction(), A->getOperand(0), A->getOperand(1));
+ EXPECT_EQ(ArgVal, OltVal);
+ EXPECT_EQ(fcNone, OltClass);
+
+ auto [UgeVal, UgeClass] =
+ fcmpToClassTest(CmpInst::FCMP_UGE, *A2->getFunction(), A2->getOperand(0),
+ A2->getOperand(1));
+ EXPECT_EQ(ArgVal, UgeVal);
+ EXPECT_EQ(fcAllFlags, UgeClass);
+
+ auto [OgtVal, OgtClass] =
+ fcmpToClassTest(CmpInst::FCMP_OGT, *A3->getFunction(), A3->getOperand(0),
+ A3->getOperand(1));
+ EXPECT_EQ(ArgVal, OgtVal);
+ EXPECT_EQ(~fcNan, OgtClass);
+
+ auto [UleVal, UleClass] =
+ fcmpToClassTest(CmpInst::FCMP_ULE, *A4->getFunction(), A4->getOperand(0),
+ A4->getOperand(1));
+ EXPECT_EQ(ArgVal, UleVal);
+ EXPECT_EQ(fcNan, UleClass);
+
+ auto [OgeVal, OgeClass] =
+ fcmpToClassTest(CmpInst::FCMP_OGE, *A5->getFunction(), A5->getOperand(0),
+ A5->getOperand(1));
+ EXPECT_EQ(ArgVal, OgeVal);
+ EXPECT_EQ(~fcNan, OgeClass);
+
+ auto [UltVal, UltClass] =
+ fcmpToClassTest(CmpInst::FCMP_ULT, *A6->getFunction(), A6->getOperand(0),
+ A6->getOperand(1));
+ EXPECT_EQ(ArgVal, UltVal);
+ EXPECT_EQ(fcNan, UltClass);
}
TEST_F(ComputeKnownFPClassTest, FCmpToClassTest_PInf) {