aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/Analysis/ValueTrackingTest.cpp
diff options
context:
space:
mode:
authorMatt Arsenault <Matthew.Arsenault@amd.com>2023-04-08 15:24:33 -0400
committerMatt Arsenault <arsenm2@gmail.com>2023-04-13 14:44:34 -0400
commit054cac104f917de9ed6d2226f564ea8167cdaf95 (patch)
treedf5e4b87286250a75c80b8cd86be0c8220f48261 /llvm/unittests/Analysis/ValueTrackingTest.cpp
parent4d044bfb33980a3453c9cd456c261750f1971b8a (diff)
downloadllvm-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.cpp26
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) {