diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2023-04-08 09:21:31 -0400 |
---|---|---|
committer | Matt Arsenault <arsenm2@gmail.com> | 2023-04-12 06:48:58 -0400 |
commit | 6aca400986d5c394624759eaed1e93f13d0cbcbb (patch) | |
tree | 1d19fbec6a29dfd840c8ad1eaf96ecddc0afd221 /llvm/unittests/Analysis/ValueTrackingTest.cpp | |
parent | eb8e43a2a154b97cdf66764a2410be9ffc2387ab (diff) | |
download | llvm-6aca400986d5c394624759eaed1e93f13d0cbcbb.zip llvm-6aca400986d5c394624759eaed1e93f13d0cbcbb.tar.gz llvm-6aca400986d5c394624759eaed1e93f13d0cbcbb.tar.bz2 |
ValueTracking: Handle no-nan check for computeKnownFPClass for fadd/fsub
Copy the logic from isKnownNeverNaN for fadd/fsub.
Diffstat (limited to 'llvm/unittests/Analysis/ValueTrackingTest.cpp')
-rw-r--r-- | llvm/unittests/Analysis/ValueTrackingTest.cpp | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/llvm/unittests/Analysis/ValueTrackingTest.cpp b/llvm/unittests/Analysis/ValueTrackingTest.cpp index 4e6b1ef..9e501bb 100644 --- a/llvm/unittests/Analysis/ValueTrackingTest.cpp +++ b/llvm/unittests/Analysis/ValueTrackingTest.cpp @@ -71,6 +71,7 @@ protected: A2 = findInstructionByNameOrNull(F, "A2"); A3 = findInstructionByNameOrNull(F, "A3"); A4 = findInstructionByNameOrNull(F, "A4"); + A5 = findInstructionByNameOrNull(F, "A5"); CxtI = findInstructionByNameOrNull(F, "CxtI"); CxtI2 = findInstructionByNameOrNull(F, "CxtI2"); @@ -82,7 +83,7 @@ protected: Function *F = nullptr; Instruction *A = nullptr; // Instructions (optional) - Instruction *A2 = nullptr, *A3 = nullptr, *A4 = nullptr; + Instruction *A2 = nullptr, *A3 = nullptr, *A4 = nullptr, *A5 = nullptr; // Context instructions (optional) Instruction *CxtI = nullptr, *CxtI2 = nullptr, *CxtI3 = nullptr; @@ -1540,6 +1541,40 @@ TEST_F(ComputeKnownFPClassTest, SIToFP) { expectKnownFPClass(~fcNan, std::nullopt, A3); } +TEST_F(ComputeKnownFPClassTest, FAdd) { + parseAssembly( + "define float @test(float nofpclass(nan inf) %nnan.ninf, float nofpclass(nan) %nnan, float nofpclass(qnan) %no.qnan, float %unknown) {\n" + " %A = fadd float %nnan, %nnan.ninf" + " %A2 = fadd float %nnan.ninf, %nnan" + " %A3 = fadd float %nnan.ninf, %unknown" + " %A4 = fadd float %nnan.ninf, %no.qnan" + " %A5 = fadd float %nnan, %nnan" + " ret float %A\n" + "}\n"); + expectKnownFPClass(fcFinite | fcInf, std::nullopt, A); + expectKnownFPClass(fcFinite | fcInf, std::nullopt, A2); + expectKnownFPClass(fcAllFlags, std::nullopt, A3); + expectKnownFPClass(fcAllFlags, std::nullopt, A4); + expectKnownFPClass(fcAllFlags, std::nullopt, A5); +} + +TEST_F(ComputeKnownFPClassTest, FSub) { + parseAssembly( + "define float @test(float nofpclass(nan inf) %nnan.ninf, float nofpclass(nan) %nnan, float nofpclass(qnan) %no.qnan, float %unknown) {\n" + " %A = fsub float %nnan, %nnan.ninf" + " %A2 = fsub float %nnan.ninf, %nnan" + " %A3 = fsub float %nnan.ninf, %unknown" + " %A4 = fsub float %nnan.ninf, %no.qnan" + " %A5 = fsub float %nnan, %nnan" + " ret float %A\n" + "}\n"); + expectKnownFPClass(fcFinite | fcInf, std::nullopt, A); + expectKnownFPClass(fcFinite | fcInf, std::nullopt, A2); + expectKnownFPClass(fcAllFlags, std::nullopt, A3); + expectKnownFPClass(fcAllFlags, std::nullopt, A4); + expectKnownFPClass(fcAllFlags, std::nullopt, A5); +} + TEST_F(ValueTrackingTest, isNonZeroRecurrence) { parseAssembly(R"( define i1 @test(i8 %n, i8 %r) { |