| #include <cstdint> | |
| #include <vector> | |
| #include "profile/MemProfData.inc" | |
| #include "gtest/gtest.h" | |
| namespace llvm { | |
| namespace memprof { | |
| namespace { | |
| TEST(MemProf, F16EncodeDecode) { | |
| const std::vector<uint64_t> TestCases = { | |
| 0, 100, 4095, 4096, 5000, 8191, 65535, 1000000, 134213640, 200000000, | |
| }; | |
| for (const uint64_t TestCase : TestCases) { | |
| const uint16_t Encoded = encodeHistogramCount(TestCase); | |
| const uint64_t Decoded = decodeHistogramCount(Encoded); | |
| const uint64_t MaxRepresentable = static_cast<uint64_t>(MaxMantissa) | |
| << MaxExponent; | |
| if (TestCase >= MaxRepresentable) { | |
| EXPECT_EQ(Decoded, MaxRepresentable); | |
| } else if (TestCase <= MaxMantissa) { | |
| EXPECT_EQ(Decoded, TestCase); | |
| } else { | |
| // The decoded value should be close to the original value. | |
| // The error should be less than 1/1024 for larger numbers. | |
| EXPECT_NEAR(Decoded, TestCase, static_cast<double>(TestCase) / 1024.0); | |
| } | |
| } | |
| } | |
| } // namespace | |
| } // namespace memprof | |
| } // namespace llvm |