xref: /llvm-project/llvm/unittests/ProfileData/BPFunctionNodeTest.cpp (revision 73eb9b33147ba5157cbf5d8276ee718629dfbbda)
11794532bSEllis Hoag //===- BPFunctionNodeTest.cpp - BPFunctionNode tests ----------------------===//
21794532bSEllis Hoag //
31794532bSEllis Hoag // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
41794532bSEllis Hoag // See https://llvm.org/LICENSE.txt for license information.
51794532bSEllis Hoag // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
61794532bSEllis Hoag //
71794532bSEllis Hoag //===----------------------------------------------------------------------===//
81794532bSEllis Hoag 
91794532bSEllis Hoag #include "llvm/ProfileData/InstrProf.h"
101794532bSEllis Hoag #include "llvm/Support/BalancedPartitioning.h"
111794532bSEllis Hoag #include "gmock/gmock.h"
121794532bSEllis Hoag #include "gtest/gtest.h"
131794532bSEllis Hoag 
141794532bSEllis Hoag using testing::Field;
151794532bSEllis Hoag using testing::UnorderedElementsAre;
1630aa9fb4Sspupyrev using testing::UnorderedElementsAreArray;
171794532bSEllis Hoag 
181794532bSEllis Hoag namespace llvm {
191794532bSEllis Hoag 
PrintTo(const BPFunctionNode & Node,std::ostream * OS)201794532bSEllis Hoag void PrintTo(const BPFunctionNode &Node, std::ostream *OS) {
211794532bSEllis Hoag   raw_os_ostream ROS(*OS);
221794532bSEllis Hoag   Node.dump(ROS);
231794532bSEllis Hoag }
241794532bSEllis Hoag 
TEST(BPFunctionNodeTest,Basic)251794532bSEllis Hoag TEST(BPFunctionNodeTest, Basic) {
261794532bSEllis Hoag   auto NodeIs = [](BPFunctionNode::IDT Id,
2730aa9fb4Sspupyrev                    ArrayRef<BPFunctionNode::UtilityNodeT> UNs) {
2830aa9fb4Sspupyrev     return AllOf(Field("Id", &BPFunctionNode::Id, Id),
2930aa9fb4Sspupyrev                  Field("UtilityNodes", &BPFunctionNode::UtilityNodes,
3030aa9fb4Sspupyrev                        UnorderedElementsAreArray(UNs)));
311794532bSEllis Hoag   };
321794532bSEllis Hoag 
33*73eb9b33SEllis Hoag   std::vector<BPFunctionNode> Nodes;
34*73eb9b33SEllis Hoag   TemporalProfTraceTy::createBPFunctionNodes(
35*73eb9b33SEllis Hoag       {TemporalProfTraceTy({0, 1, 2, 3})}, Nodes, /*RemoveOutlierUNs=*/false);
36*73eb9b33SEllis Hoag   // Utility nodes that are too infrequent or too prevalent are filtered out.
3730aa9fb4Sspupyrev   EXPECT_THAT(Nodes,
3830aa9fb4Sspupyrev               UnorderedElementsAre(NodeIs(0, {0, 1, 2}), NodeIs(1, {1, 2}),
39*73eb9b33SEllis Hoag                                    NodeIs(2, {2}), NodeIs(3, {2})));
400c6dc805SFangrui Song 
41*73eb9b33SEllis Hoag   Nodes.clear();
42*73eb9b33SEllis Hoag   TemporalProfTraceTy::createBPFunctionNodes(
43*73eb9b33SEllis Hoag       {TemporalProfTraceTy({0, 1, 2, 3, 4}), TemporalProfTraceTy({4, 2})},
44*73eb9b33SEllis Hoag       Nodes, /*RemoveOutlierUNs=*/false);
450c6dc805SFangrui Song 
4630aa9fb4Sspupyrev   EXPECT_THAT(Nodes,
47*73eb9b33SEllis Hoag               UnorderedElementsAre(NodeIs(0, {0, 1, 2, 3}),
48*73eb9b33SEllis Hoag                                    NodeIs(1, {1, 2, 3}), NodeIs(2, {2, 3, 5}),
49*73eb9b33SEllis Hoag                                    NodeIs(3, {2, 3}), NodeIs(4, {3, 4, 5})));
50*73eb9b33SEllis Hoag 
51*73eb9b33SEllis Hoag   Nodes.clear();
52*73eb9b33SEllis Hoag   TemporalProfTraceTy::createBPFunctionNodes(
53*73eb9b33SEllis Hoag       {TemporalProfTraceTy({0, 1, 2, 3, 4}), TemporalProfTraceTy({4, 2})},
54*73eb9b33SEllis Hoag       Nodes, /*RemoveOutlierUNs=*/true);
55*73eb9b33SEllis Hoag 
56*73eb9b33SEllis Hoag   EXPECT_THAT(Nodes, UnorderedElementsAre(NodeIs(0, {1}), NodeIs(1, {1}),
57*73eb9b33SEllis Hoag                                           NodeIs(2, {5}), NodeIs(3, {}),
58*73eb9b33SEllis Hoag                                           NodeIs(4, {5})));
591794532bSEllis Hoag }
601794532bSEllis Hoag 
611794532bSEllis Hoag } // end namespace llvm
62