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