xref: /llvm-project/llvm/unittests/CGData/StableFunctionMapTest.cpp (revision d23c5c2d6566fce4380cfa31d438422db19fbce9)
17ec26b23SKyungwoo Lee //===- StableFunctionMapTest.cpp ------------------------------------------===//
27ec26b23SKyungwoo Lee //
37ec26b23SKyungwoo Lee // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
47ec26b23SKyungwoo Lee // See https://llvm.org/LICENSE.txt for license information.
57ec26b23SKyungwoo Lee // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67ec26b23SKyungwoo Lee //
77ec26b23SKyungwoo Lee //===----------------------------------------------------------------------===//
87ec26b23SKyungwoo Lee 
97ec26b23SKyungwoo Lee #include "llvm/CGData/StableFunctionMap.h"
107ec26b23SKyungwoo Lee #include "gmock/gmock-matchers.h"
117ec26b23SKyungwoo Lee #include "gmock/gmock.h"
127ec26b23SKyungwoo Lee #include "gtest/gtest.h"
137ec26b23SKyungwoo Lee 
147ec26b23SKyungwoo Lee using namespace llvm;
157ec26b23SKyungwoo Lee 
167ec26b23SKyungwoo Lee namespace {
177ec26b23SKyungwoo Lee 
187ec26b23SKyungwoo Lee using testing::Contains;
197ec26b23SKyungwoo Lee using testing::IsEmpty;
207ec26b23SKyungwoo Lee using testing::Key;
217ec26b23SKyungwoo Lee using testing::Not;
227ec26b23SKyungwoo Lee using testing::Pair;
237ec26b23SKyungwoo Lee using testing::SizeIs;
247ec26b23SKyungwoo Lee 
257ec26b23SKyungwoo Lee TEST(StableFunctionMap, Name) {
267ec26b23SKyungwoo Lee   StableFunctionMap Map;
277ec26b23SKyungwoo Lee   EXPECT_TRUE(Map.empty());
287ec26b23SKyungwoo Lee   EXPECT_TRUE(Map.getNames().empty());
297ec26b23SKyungwoo Lee   unsigned ID1 = Map.getIdOrCreateForName("Func1");
307ec26b23SKyungwoo Lee   unsigned ID2 = Map.getIdOrCreateForName("Func2");
317ec26b23SKyungwoo Lee   unsigned ID3 = Map.getIdOrCreateForName("Func1");
327ec26b23SKyungwoo Lee 
337ec26b23SKyungwoo Lee   EXPECT_THAT(Map.getNames(), SizeIs(2));
347ec26b23SKyungwoo Lee   // The different names should return different IDs.
357ec26b23SKyungwoo Lee   EXPECT_NE(ID1, ID2);
367ec26b23SKyungwoo Lee   // The same name should return the same ID.
377ec26b23SKyungwoo Lee   EXPECT_EQ(ID1, ID3);
387ec26b23SKyungwoo Lee   // The IDs should be valid.
397ec26b23SKyungwoo Lee   EXPECT_EQ(*Map.getNameForId(ID1), "Func1");
407ec26b23SKyungwoo Lee   EXPECT_EQ(*Map.getNameForId(ID2), "Func2");
417ec26b23SKyungwoo Lee }
427ec26b23SKyungwoo Lee 
437ec26b23SKyungwoo Lee TEST(StableFunctionMap, Insert) {
447ec26b23SKyungwoo Lee   StableFunctionMap Map;
457ec26b23SKyungwoo Lee 
467ec26b23SKyungwoo Lee   StableFunction Func1{1, "Func1", "Mod1", 2, {{{0, 1}, 3}}};
477ec26b23SKyungwoo Lee   StableFunction Func2{1, "Func2", "Mod1", 2, {{{0, 1}, 2}}};
487ec26b23SKyungwoo Lee   Map.insert(Func1);
497ec26b23SKyungwoo Lee   Map.insert(Func2);
507ec26b23SKyungwoo Lee   // We only have a unique hash, 1
517ec26b23SKyungwoo Lee   EXPECT_THAT(Map, SizeIs(1));
527ec26b23SKyungwoo Lee   // We have two functions with the same hash which are potentially mergeable.
537ec26b23SKyungwoo Lee   EXPECT_EQ(Map.size(StableFunctionMap::SizeType::TotalFunctionCount), 2u);
547ec26b23SKyungwoo Lee   EXPECT_EQ(Map.size(StableFunctionMap::SizeType::MergeableFunctionCount), 2u);
557ec26b23SKyungwoo Lee }
567ec26b23SKyungwoo Lee 
577ec26b23SKyungwoo Lee TEST(StableFunctionMap, Merge) {
587ec26b23SKyungwoo Lee   StableFunctionMap Map1;
597ec26b23SKyungwoo Lee   StableFunction Func1{1, "Func1", "Mod1", 2, {{{0, 1}, 3}}};
607ec26b23SKyungwoo Lee   StableFunction Func2{1, "Func2", "Mod1", 2, {{{0, 1}, 2}}};
617ec26b23SKyungwoo Lee   StableFunction Func3{2, "Func3", "Mod1", 2, {{{1, 1}, 2}}};
627ec26b23SKyungwoo Lee   Map1.insert(Func1);
637ec26b23SKyungwoo Lee   Map1.insert(Func2);
647ec26b23SKyungwoo Lee   Map1.insert(Func3);
657ec26b23SKyungwoo Lee 
667ec26b23SKyungwoo Lee   StableFunctionMap Map2;
677ec26b23SKyungwoo Lee   StableFunction Func4{1, "Func4", "Mod2", 2, {{{0, 1}, 4}}};
687ec26b23SKyungwoo Lee   StableFunction Func5{2, "Func5", "Mod2", 2, {{{1, 1}, 5}}};
697ec26b23SKyungwoo Lee   StableFunction Func6{3, "Func6", "Mod2", 2, {{{1, 1}, 6}}};
707ec26b23SKyungwoo Lee   Map2.insert(Func4);
717ec26b23SKyungwoo Lee   Map2.insert(Func5);
727ec26b23SKyungwoo Lee   Map2.insert(Func6);
737ec26b23SKyungwoo Lee 
747ec26b23SKyungwoo Lee   // Merge two maps.
757ec26b23SKyungwoo Lee   Map1.merge(Map2);
767ec26b23SKyungwoo Lee 
777ec26b23SKyungwoo Lee   // We only have two unique hashes, 1, 2 and 3
787ec26b23SKyungwoo Lee   EXPECT_THAT(Map1, SizeIs(3));
797ec26b23SKyungwoo Lee   // We have total 6 functions.
807ec26b23SKyungwoo Lee   EXPECT_EQ(Map1.size(StableFunctionMap::SizeType::TotalFunctionCount), 6u);
817ec26b23SKyungwoo Lee   // We have 5 mergeable functions. Func6 only has a unique hash, 3.
827ec26b23SKyungwoo Lee   EXPECT_EQ(Map1.size(StableFunctionMap::SizeType::MergeableFunctionCount), 5u);
837ec26b23SKyungwoo Lee }
847ec26b23SKyungwoo Lee 
857ec26b23SKyungwoo Lee TEST(StableFunctionMap, Finalize1) {
867ec26b23SKyungwoo Lee   StableFunctionMap Map;
877ec26b23SKyungwoo Lee   StableFunction Func1{1, "Func1", "Mod1", 2, {{{0, 1}, 3}}};
887ec26b23SKyungwoo Lee   StableFunction Func2{1, "Func2", "Mod2", 3, {{{0, 1}, 2}}};
897ec26b23SKyungwoo Lee   Map.insert(Func1);
907ec26b23SKyungwoo Lee   Map.insert(Func2);
917ec26b23SKyungwoo Lee 
927ec26b23SKyungwoo Lee   // Instruction count is mis-matched, so they're not mergeable.
937ec26b23SKyungwoo Lee   Map.finalize();
947ec26b23SKyungwoo Lee   EXPECT_THAT(Map, IsEmpty());
957ec26b23SKyungwoo Lee }
967ec26b23SKyungwoo Lee 
977ec26b23SKyungwoo Lee TEST(StableFunctionMap, Finalize2) {
987ec26b23SKyungwoo Lee   StableFunctionMap Map;
997ec26b23SKyungwoo Lee   StableFunction Func1{1, "Func1", "Mod1", 2, {{{0, 1}, 3}}};
1007ec26b23SKyungwoo Lee   StableFunction Func2{1, "Func2", "Mod2", 2, {{{0, 1}, 2}, {{1, 1}, 1}}};
1017ec26b23SKyungwoo Lee   Map.insert(Func1);
1027ec26b23SKyungwoo Lee   Map.insert(Func2);
1037ec26b23SKyungwoo Lee 
1047ec26b23SKyungwoo Lee   // Operand map size is mis-matched, so they're not mergeable.
1057ec26b23SKyungwoo Lee   Map.finalize();
1067ec26b23SKyungwoo Lee   EXPECT_THAT(Map, IsEmpty());
1077ec26b23SKyungwoo Lee }
1087ec26b23SKyungwoo Lee 
1097ec26b23SKyungwoo Lee TEST(StableFunctionMap, Finalize3) {
1107ec26b23SKyungwoo Lee   StableFunctionMap Map;
111*d23c5c2dSKyungwoo Lee   StableFunction Func1{1, "Func1", "Mod1", 12, {{{0, 1}, 3}, {{1, 1}, 1}}};
112*d23c5c2dSKyungwoo Lee   StableFunction Func2{1, "Func2", "Mod2", 12, {{{0, 1}, 2}, {{1, 1}, 1}}};
1137ec26b23SKyungwoo Lee   Map.insert(Func1);
1147ec26b23SKyungwoo Lee   Map.insert(Func2);
1157ec26b23SKyungwoo Lee 
1167ec26b23SKyungwoo Lee   // The same operand entry is removed, which is redundant.
1177ec26b23SKyungwoo Lee   Map.finalize();
1187ec26b23SKyungwoo Lee   auto &M = Map.getFunctionMap();
1197ec26b23SKyungwoo Lee   EXPECT_THAT(M, SizeIs(1));
1207ec26b23SKyungwoo Lee   auto &FuncEntries = M.begin()->second;
1217ec26b23SKyungwoo Lee   for (auto &FuncEntry : FuncEntries) {
1227ec26b23SKyungwoo Lee     EXPECT_THAT(*FuncEntry->IndexOperandHashMap, SizeIs(1));
1237ec26b23SKyungwoo Lee     ASSERT_THAT(*FuncEntry->IndexOperandHashMap,
1247ec26b23SKyungwoo Lee                 Not(Contains(Key(Pair(1, 1)))));
1257ec26b23SKyungwoo Lee   }
1267ec26b23SKyungwoo Lee }
1277ec26b23SKyungwoo Lee 
1287ec26b23SKyungwoo Lee } // end namespace
129