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