brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.0 KiB · 5cf62ae Raw
129 lines · cpp
1//===- StableFunctionMapTest.cpp ------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/CGData/StableFunctionMap.h"10#include "gmock/gmock-matchers.h"11#include "gmock/gmock.h"12#include "gtest/gtest.h"13 14using namespace llvm;15 16namespace {17 18using testing::Contains;19using testing::IsEmpty;20using testing::Key;21using testing::Not;22using testing::Pair;23using testing::SizeIs;24 25TEST(StableFunctionMap, Name) {26  StableFunctionMap Map;27  EXPECT_TRUE(Map.empty());28  EXPECT_TRUE(Map.getNames().empty());29  unsigned ID1 = Map.getIdOrCreateForName("Func1");30  unsigned ID2 = Map.getIdOrCreateForName("Func2");31  unsigned ID3 = Map.getIdOrCreateForName("Func1");32 33  EXPECT_THAT(Map.getNames(), SizeIs(2));34  // The different names should return different IDs.35  EXPECT_NE(ID1, ID2);36  // The same name should return the same ID.37  EXPECT_EQ(ID1, ID3);38  // The IDs should be valid.39  EXPECT_EQ(*Map.getNameForId(ID1), "Func1");40  EXPECT_EQ(*Map.getNameForId(ID2), "Func2");41}42 43TEST(StableFunctionMap, Insert) {44  StableFunctionMap Map;45 46  StableFunction Func1{1, "Func1", "Mod1", 2, {{{0, 1}, 3}}};47  StableFunction Func2{1, "Func2", "Mod1", 2, {{{0, 1}, 2}}};48  Map.insert(Func1);49  Map.insert(Func2);50  // We only have a unique hash, 151  EXPECT_THAT(Map, SizeIs(1));52  // We have two functions with the same hash which are potentially mergeable.53  EXPECT_EQ(Map.size(StableFunctionMap::SizeType::TotalFunctionCount), 2u);54  EXPECT_EQ(Map.size(StableFunctionMap::SizeType::MergeableFunctionCount), 2u);55}56 57TEST(StableFunctionMap, Merge) {58  StableFunctionMap Map1;59  StableFunction Func1{1, "Func1", "Mod1", 2, {{{0, 1}, 3}}};60  StableFunction Func2{1, "Func2", "Mod1", 2, {{{0, 1}, 2}}};61  StableFunction Func3{2, "Func3", "Mod1", 2, {{{1, 1}, 2}}};62  Map1.insert(Func1);63  Map1.insert(Func2);64  Map1.insert(Func3);65 66  StableFunctionMap Map2;67  StableFunction Func4{1, "Func4", "Mod2", 2, {{{0, 1}, 4}}};68  StableFunction Func5{2, "Func5", "Mod2", 2, {{{1, 1}, 5}}};69  StableFunction Func6{3, "Func6", "Mod2", 2, {{{1, 1}, 6}}};70  Map2.insert(Func4);71  Map2.insert(Func5);72  Map2.insert(Func6);73 74  // Merge two maps.75  Map1.merge(Map2);76 77  // We only have two unique hashes, 1, 2 and 378  EXPECT_THAT(Map1, SizeIs(3));79  // We have total 6 functions.80  EXPECT_EQ(Map1.size(StableFunctionMap::SizeType::TotalFunctionCount), 6u);81  // We have 5 mergeable functions. Func6 only has a unique hash, 3.82  EXPECT_EQ(Map1.size(StableFunctionMap::SizeType::MergeableFunctionCount), 5u);83}84 85TEST(StableFunctionMap, Finalize1) {86  StableFunctionMap Map;87  StableFunction Func1{1, "Func1", "Mod1", 2, {{{0, 1}, 3}}};88  StableFunction Func2{1, "Func2", "Mod2", 3, {{{0, 1}, 2}}};89  Map.insert(Func1);90  Map.insert(Func2);91 92  // Instruction count is mis-matched, so they're not mergeable.93  Map.finalize();94  EXPECT_THAT(Map, IsEmpty());95}96 97TEST(StableFunctionMap, Finalize2) {98  StableFunctionMap Map;99  StableFunction Func1{1, "Func1", "Mod1", 2, {{{0, 1}, 3}}};100  StableFunction Func2{1, "Func2", "Mod2", 2, {{{0, 1}, 2}, {{1, 1}, 1}}};101  Map.insert(Func1);102  Map.insert(Func2);103 104  // Operand map size is mis-matched, so they're not mergeable.105  Map.finalize();106  EXPECT_THAT(Map, IsEmpty());107}108 109TEST(StableFunctionMap, Finalize3) {110  StableFunctionMap Map;111  StableFunction Func1{1, "Func1", "Mod1", 12, {{{0, 1}, 3}, {{1, 1}, 1}}};112  StableFunction Func2{1, "Func2", "Mod2", 12, {{{0, 1}, 2}, {{1, 1}, 1}}};113  Map.insert(Func1);114  Map.insert(Func2);115 116  // The same operand entry is removed, which is redundant.117  Map.finalize();118  auto &M = Map.getFunctionMap();119  EXPECT_THAT(M, SizeIs(1));120  auto &FuncEntries = M.begin()->second.Entries;121  for (auto &FuncEntry : FuncEntries) {122    EXPECT_THAT(*FuncEntry->IndexOperandHashMap, SizeIs(1));123    ASSERT_THAT(*FuncEntry->IndexOperandHashMap,124                Not(Contains(Key(Pair(1, 1)))));125  }126}127 128} // end namespace129