xref: /llvm-project/llvm/unittests/ADT/StatisticTest.cpp (revision b1df3a2c0b6a42570042934cb79ca0e4359f863b)
1a09751e7SDaniel Sanders //===- llvm/unittest/ADT/StatisticTest.cpp - Statistic unit tests ---------===//
2a09751e7SDaniel Sanders //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6a09751e7SDaniel Sanders //
7a09751e7SDaniel Sanders //===----------------------------------------------------------------------===//
8a09751e7SDaniel Sanders 
9a09751e7SDaniel Sanders #include "llvm/ADT/Statistic.h"
10a09751e7SDaniel Sanders #include "llvm/Support/raw_ostream.h"
11a09751e7SDaniel Sanders #include "gtest/gtest.h"
12a09751e7SDaniel Sanders using namespace llvm;
13a09751e7SDaniel Sanders 
14*b1df3a2cSFangrui Song using OptionalStatistic = std::optional<std::pair<StringRef, uint64_t>>;
151087a542SDaniel Sanders 
16a09751e7SDaniel Sanders namespace {
17a09751e7SDaniel Sanders #define DEBUG_TYPE "unittest"
18a09751e7SDaniel Sanders STATISTIC(Counter, "Counts things");
19a09751e7SDaniel Sanders STATISTIC(Counter2, "Counts other things");
20adb203feSVolodymyr Sapsai ALWAYS_ENABLED_STATISTIC(AlwaysCounter, "Counts things always");
21a09751e7SDaniel Sanders 
22ce0bc923SDaniel Sanders #if LLVM_ENABLE_STATS
231087a542SDaniel Sanders static void
extractCounters(const std::vector<std::pair<StringRef,uint64_t>> & Range,OptionalStatistic & S1,OptionalStatistic & S2)2467dc8021SMingming Liu extractCounters(const std::vector<std::pair<StringRef, uint64_t>> &Range,
251087a542SDaniel Sanders                 OptionalStatistic &S1, OptionalStatistic &S2) {
261087a542SDaniel Sanders   for (const auto &S : Range) {
271087a542SDaniel Sanders     if (S.first == "Counter")
281087a542SDaniel Sanders       S1 = S;
291087a542SDaniel Sanders     if (S.first == "Counter2")
301087a542SDaniel Sanders       S2 = S;
311087a542SDaniel Sanders   }
321087a542SDaniel Sanders }
33ce0bc923SDaniel Sanders #endif
341087a542SDaniel Sanders 
TEST(StatisticTest,Count)35a09751e7SDaniel Sanders TEST(StatisticTest, Count) {
36a09751e7SDaniel Sanders   EnableStatistics();
37a09751e7SDaniel Sanders 
38a09751e7SDaniel Sanders   Counter = 0;
3967dc8021SMingming Liu   EXPECT_EQ(Counter, 0ull);
40a09751e7SDaniel Sanders   Counter++;
41a09751e7SDaniel Sanders   Counter++;
4267dc8021SMingming Liu   Counter += (std::numeric_limits<uint64_t>::max() - 3);
43a09751e7SDaniel Sanders #if LLVM_ENABLE_STATS
4467dc8021SMingming Liu   EXPECT_EQ(Counter, std::numeric_limits<uint64_t>::max() - 1);
45a09751e7SDaniel Sanders #else
4667dc8021SMingming Liu   EXPECT_EQ(Counter, UINT64_C(0));
47a09751e7SDaniel Sanders #endif
48adb203feSVolodymyr Sapsai 
49adb203feSVolodymyr Sapsai   AlwaysCounter = 0;
5067dc8021SMingming Liu   EXPECT_EQ(AlwaysCounter, 0ull);
51adb203feSVolodymyr Sapsai   AlwaysCounter++;
52adb203feSVolodymyr Sapsai   ++AlwaysCounter;
5367dc8021SMingming Liu   EXPECT_EQ(AlwaysCounter, 2ull);
54a09751e7SDaniel Sanders }
55a09751e7SDaniel Sanders 
TEST(StatisticTest,Assign)56a09751e7SDaniel Sanders TEST(StatisticTest, Assign) {
57a09751e7SDaniel Sanders   EnableStatistics();
58a09751e7SDaniel Sanders 
59a09751e7SDaniel Sanders   Counter = 2;
60a09751e7SDaniel Sanders #if LLVM_ENABLE_STATS
61a09751e7SDaniel Sanders   EXPECT_EQ(Counter, 2u);
62a09751e7SDaniel Sanders #else
63a09751e7SDaniel Sanders   EXPECT_EQ(Counter, 0u);
64a09751e7SDaniel Sanders #endif
65adb203feSVolodymyr Sapsai 
66adb203feSVolodymyr Sapsai   AlwaysCounter = 2;
67adb203feSVolodymyr Sapsai   EXPECT_EQ(AlwaysCounter, 2u);
68a09751e7SDaniel Sanders }
69a09751e7SDaniel Sanders 
TEST(StatisticTest,API)70a09751e7SDaniel Sanders TEST(StatisticTest, API) {
71a09751e7SDaniel Sanders   EnableStatistics();
72404e2128SKadir Cetinkaya   // Reset beforehand to make sure previous tests don't effect this one.
73404e2128SKadir Cetinkaya   ResetStatistics();
74a09751e7SDaniel Sanders 
75a09751e7SDaniel Sanders   Counter = 0;
76a09751e7SDaniel Sanders   EXPECT_EQ(Counter, 0u);
77a09751e7SDaniel Sanders   Counter++;
78a09751e7SDaniel Sanders   Counter++;
79a09751e7SDaniel Sanders #if LLVM_ENABLE_STATS
80a09751e7SDaniel Sanders   EXPECT_EQ(Counter, 2u);
81a09751e7SDaniel Sanders #else
82a09751e7SDaniel Sanders   EXPECT_EQ(Counter, 0u);
83a09751e7SDaniel Sanders #endif
84a09751e7SDaniel Sanders 
85a09751e7SDaniel Sanders #if LLVM_ENABLE_STATS
861087a542SDaniel Sanders   {
87a09751e7SDaniel Sanders     const auto Range1 = GetStatistics();
88a09751e7SDaniel Sanders     EXPECT_NE(Range1.begin(), Range1.end());
89a09751e7SDaniel Sanders     EXPECT_EQ(Range1.begin() + 1, Range1.end());
90a09751e7SDaniel Sanders 
911087a542SDaniel Sanders     OptionalStatistic S1;
921087a542SDaniel Sanders     OptionalStatistic S2;
931087a542SDaniel Sanders     extractCounters(Range1, S1, S2);
94a09751e7SDaniel Sanders 
953361a364SKazu Hirata     EXPECT_EQ(S1.has_value(), true);
963361a364SKazu Hirata     EXPECT_EQ(S2.has_value(), false);
971087a542SDaniel Sanders   }
98a09751e7SDaniel Sanders 
99a09751e7SDaniel Sanders   // Counter2 will be registered when it's first touched.
100a09751e7SDaniel Sanders   Counter2++;
101a09751e7SDaniel Sanders 
1021087a542SDaniel Sanders   {
1031087a542SDaniel Sanders     const auto Range = GetStatistics();
1041087a542SDaniel Sanders     EXPECT_NE(Range.begin(), Range.end());
1051087a542SDaniel Sanders     EXPECT_EQ(Range.begin() + 2, Range.end());
106a09751e7SDaniel Sanders 
1071087a542SDaniel Sanders     OptionalStatistic S1;
1081087a542SDaniel Sanders     OptionalStatistic S2;
1091087a542SDaniel Sanders     extractCounters(Range, S1, S2);
110a09751e7SDaniel Sanders 
1113361a364SKazu Hirata     EXPECT_EQ(S1.has_value(), true);
1123361a364SKazu Hirata     EXPECT_EQ(S2.has_value(), true);
113a09751e7SDaniel Sanders 
114a09751e7SDaniel Sanders     EXPECT_EQ(S1->first, "Counter");
115a09751e7SDaniel Sanders     EXPECT_EQ(S1->second, 2u);
116a09751e7SDaniel Sanders 
117a09751e7SDaniel Sanders     EXPECT_EQ(S2->first, "Counter2");
118a09751e7SDaniel Sanders     EXPECT_EQ(S2->second, 1u);
1191087a542SDaniel Sanders   }
120a09751e7SDaniel Sanders #else
121a09751e7SDaniel Sanders   Counter2++;
122b2ac153bSDavid Green   auto Range = GetStatistics();
123a09751e7SDaniel Sanders   EXPECT_EQ(Range.begin(), Range.end());
124a09751e7SDaniel Sanders #endif
1251087a542SDaniel Sanders 
1261087a542SDaniel Sanders #if LLVM_ENABLE_STATS
1271087a542SDaniel Sanders   // Check that resetting the statistics works correctly.
1281087a542SDaniel Sanders   // It should empty the list and zero the counters.
1291087a542SDaniel Sanders   ResetStatistics();
1301087a542SDaniel Sanders   {
1319144e493SKazu Hirata     auto Range = GetStatistics();
1321087a542SDaniel Sanders     EXPECT_EQ(Range.begin(), Range.end());
1331087a542SDaniel Sanders     EXPECT_EQ(Counter, 0u);
1341087a542SDaniel Sanders     EXPECT_EQ(Counter2, 0u);
1351087a542SDaniel Sanders     OptionalStatistic S1;
1361087a542SDaniel Sanders     OptionalStatistic S2;
1371087a542SDaniel Sanders     extractCounters(Range, S1, S2);
1383361a364SKazu Hirata     EXPECT_EQ(S1.has_value(), false);
1393361a364SKazu Hirata     EXPECT_EQ(S2.has_value(), false);
1401087a542SDaniel Sanders   }
1411087a542SDaniel Sanders 
1421087a542SDaniel Sanders   // Now check that they successfully re-register and count.
1431087a542SDaniel Sanders   Counter++;
1441087a542SDaniel Sanders   Counter2++;
1451087a542SDaniel Sanders 
1461087a542SDaniel Sanders   {
1479144e493SKazu Hirata     auto Range = GetStatistics();
1481087a542SDaniel Sanders     EXPECT_EQ(Range.begin() + 2, Range.end());
1491087a542SDaniel Sanders     EXPECT_EQ(Counter, 1u);
1501087a542SDaniel Sanders     EXPECT_EQ(Counter2, 1u);
1511087a542SDaniel Sanders 
1521087a542SDaniel Sanders     OptionalStatistic S1;
1531087a542SDaniel Sanders     OptionalStatistic S2;
1541087a542SDaniel Sanders     extractCounters(Range, S1, S2);
1551087a542SDaniel Sanders 
1563361a364SKazu Hirata     EXPECT_EQ(S1.has_value(), true);
1573361a364SKazu Hirata     EXPECT_EQ(S2.has_value(), true);
1581087a542SDaniel Sanders 
1591087a542SDaniel Sanders     EXPECT_EQ(S1->first, "Counter");
1601087a542SDaniel Sanders     EXPECT_EQ(S1->second, 1u);
1611087a542SDaniel Sanders 
1621087a542SDaniel Sanders     EXPECT_EQ(S2->first, "Counter2");
1631087a542SDaniel Sanders     EXPECT_EQ(S2->second, 1u);
1641087a542SDaniel Sanders   }
1651087a542SDaniel Sanders #else
1661087a542SDaniel Sanders   // No need to test the output ResetStatistics(), there's nothing to reset so
1671087a542SDaniel Sanders   // we can't tell if it failed anyway.
1681087a542SDaniel Sanders   ResetStatistics();
1691087a542SDaniel Sanders #endif
170a09751e7SDaniel Sanders }
171a09751e7SDaniel Sanders 
172a09751e7SDaniel Sanders } // end anonymous namespace
173