diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2023-11-14 10:05:38 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-11-14 10:05:38 +0900 |
commit | 0e1a52f556a90cc7b7ce7666fc476c99cf7bfb02 (patch) | |
tree | a578f9a412861f9316a14ef8af66bb8f63ce7eea /llvm/unittests/Analysis/ValueTrackingTest.cpp | |
parent | 45a92acfd945bef2dca391bccd08a09348c35c67 (diff) | |
download | llvm-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.cpp | 73 |
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) { |