diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2023-04-08 15:24:33 -0400 |
---|---|---|
committer | Matt Arsenault <arsenm2@gmail.com> | 2023-04-13 14:44:34 -0400 |
commit | 054cac104f917de9ed6d2226f564ea8167cdaf95 (patch) | |
tree | df5e4b87286250a75c80b8cd86be0c8220f48261 /llvm/unittests/Analysis/ValueTrackingTest.cpp | |
parent | 4d044bfb33980a3453c9cd456c261750f1971b8a (diff) | |
download | llvm-054cac104f917de9ed6d2226f564ea8167cdaf95.zip llvm-054cac104f917de9ed6d2226f564ea8167cdaf95.tar.gz llvm-054cac104f917de9ed6d2226f564ea8167cdaf95.tar.bz2 |
ValueTracking: Address todo for nan fmul handling in computeKnownFPClass
If both operands can't be zero or nan, the result can't be nan.
Diffstat (limited to 'llvm/unittests/Analysis/ValueTrackingTest.cpp')
-rw-r--r-- | llvm/unittests/Analysis/ValueTrackingTest.cpp | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/llvm/unittests/Analysis/ValueTrackingTest.cpp b/llvm/unittests/Analysis/ValueTrackingTest.cpp index ba983d4..211959f 100644 --- a/llvm/unittests/Analysis/ValueTrackingTest.cpp +++ b/llvm/unittests/Analysis/ValueTrackingTest.cpp @@ -72,6 +72,8 @@ protected: A3 = findInstructionByNameOrNull(F, "A3"); A4 = findInstructionByNameOrNull(F, "A4"); A5 = findInstructionByNameOrNull(F, "A5"); + A6 = findInstructionByNameOrNull(F, "A6"); + A7 = findInstructionByNameOrNull(F, "A7"); CxtI = findInstructionByNameOrNull(F, "CxtI"); CxtI2 = findInstructionByNameOrNull(F, "CxtI2"); @@ -83,7 +85,8 @@ protected: Function *F = nullptr; Instruction *A = nullptr; // Instructions (optional) - Instruction *A2 = nullptr, *A3 = nullptr, *A4 = nullptr, *A5 = nullptr; + Instruction *A2 = nullptr, *A3 = nullptr, *A4 = nullptr, *A5 = nullptr, + *A6 = nullptr, *A7 = nullptr; // Context instructions (optional) Instruction *CxtI = nullptr, *CxtI2 = nullptr, *CxtI3 = nullptr; @@ -1592,6 +1595,27 @@ TEST_F(ComputeKnownFPClassTest, FMul) { expectKnownFPClass(fcAllFlags, std::nullopt, A5); } +TEST_F(ComputeKnownFPClassTest, FMulNoZero) { + parseAssembly( + "define float @test(float nofpclass(zero) %no.zero, float nofpclass(zero nan) %no.zero.nan, float nofpclass(nzero nan) %no.negzero.nan, float nofpclass(pzero nan) %no.poszero.nan, float nofpclass(inf nan) %no.inf.nan, float nofpclass(inf) %no.inf, float nofpclass(nan) %no.nan) {\n" + " %A = fmul float %no.zero.nan, %no.zero.nan" + " %A2 = fmul float %no.zero, %no.zero" + " %A3 = fmul float %no.poszero.nan, %no.zero.nan" + " %A4 = fmul float %no.nan, %no.zero" + " %A5 = fmul float %no.zero, %no.inf" + " %A6 = fmul float %no.zero.nan, %no.nan" + " %A7 = fmul float %no.nan, %no.zero.nan" + " ret float %A\n" + "}\n"); + expectKnownFPClass(fcFinite | fcInf, std::nullopt, A); + expectKnownFPClass(fcAllFlags, std::nullopt, A2); + expectKnownFPClass(fcAllFlags, std::nullopt, A3); + expectKnownFPClass(fcAllFlags, std::nullopt, A4); + expectKnownFPClass(fcAllFlags, std::nullopt, A5); + expectKnownFPClass(fcAllFlags, std::nullopt, A6); + expectKnownFPClass(fcAllFlags, std::nullopt, A7); +} + TEST_F(ValueTrackingTest, isNonZeroRecurrence) { parseAssembly(R"( define i1 @test(i8 %n, i8 %r) { |