blob: 2f27c0762ff5ba5338316f0e5e688f11230d39ca [file] [log] [blame]
Peter Collingbournee6909c82015-02-20 20:30:47 +00001//===- LowerBitSets.cpp - Unit tests for bitset lowering ------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "llvm/Transforms/IPO/LowerBitSets.h"
11#include "gtest/gtest.h"
12
13using namespace llvm;
14
15TEST(LowerBitSets, BitSetBuilder) {
16 struct {
17 std::vector<uint64_t> Offsets;
18 std::vector<uint8_t> Bits;
19 uint64_t ByteOffset;
20 uint64_t BitSize;
21 unsigned AlignLog2;
22 bool IsSingleOffset;
23 } BSBTests[] = {
24 {{}, {0}, 0, 1, 0, false},
25 {{0}, {1}, 0, 1, 0, true},
26 {{4}, {1}, 4, 1, 0, true},
27 {{37}, {1}, 37, 1, 0, true},
28 {{0, 1}, {3}, 0, 2, 0, false},
29 {{0, 4}, {3}, 0, 2, 2, false},
30 {{0, uint64_t(1) << 33}, {3}, 0, 2, 33, false},
31 {{3, 7}, {3}, 3, 2, 2, false},
32 {{0, 1, 7}, {131}, 0, 8, 0, false},
33 {{0, 2, 14}, {131}, 0, 8, 1, false},
34 {{0, 1, 8}, {3, 1}, 0, 9, 0, false},
35 {{0, 2, 16}, {3, 1}, 0, 9, 1, false},
36 };
37
38 for (auto &&T : BSBTests) {
39 BitSetBuilder BSB;
40 for (auto Offset : T.Offsets)
41 BSB.addOffset(Offset);
42
43 BitSetInfo BSI = BSB.build();
44
45 EXPECT_EQ(T.Bits, BSI.Bits);
46 EXPECT_EQ(T.ByteOffset, BSI.ByteOffset);
47 EXPECT_EQ(T.BitSize, BSI.BitSize);
48 EXPECT_EQ(T.AlignLog2, BSI.AlignLog2);
49 EXPECT_EQ(T.IsSingleOffset, BSI.isSingleOffset());
50
51 for (auto Offset : T.Offsets)
52 EXPECT_TRUE(BSI.containsGlobalOffset(Offset));
53
54 auto I = T.Offsets.begin();
55 for (uint64_t NonOffset = 0; NonOffset != 256; ++NonOffset) {
56 if (I != T.Offsets.end() && *I == NonOffset) {
57 ++I;
58 continue;
59 }
60
61 EXPECT_FALSE(BSI.containsGlobalOffset(NonOffset));
62 }
63 }
64}
Peter Collingbourne1baeaa32015-02-24 23:17:02 +000065
66TEST(LowerBitSets, GlobalLayoutBuilder) {
67 struct {
68 uint64_t NumObjects;
69 std::vector<std::set<uint64_t>> Fragments;
70 std::vector<uint64_t> WantLayout;
71 } GLBTests[] = {
72 {0, {}, {}},
73 {4, {{0, 1}, {2, 3}}, {0, 1, 2, 3}},
74 {3, {{0, 1}, {1, 2}}, {0, 1, 2}},
75 {4, {{0, 1}, {1, 2}, {2, 3}}, {0, 1, 2, 3}},
76 {4, {{0, 1}, {2, 3}, {1, 2}}, {0, 1, 2, 3}},
77 {6, {{2, 5}, {0, 1, 2, 3, 4, 5}}, {0, 1, 2, 5, 3, 4}},
78 };
79
80 for (auto &&T : GLBTests) {
81 GlobalLayoutBuilder GLB(T.NumObjects);
82 for (auto &&F : T.Fragments)
83 GLB.addFragment(F);
84
85 std::vector<uint64_t> ComputedLayout;
86 for (auto &&F : GLB.Fragments)
87 ComputedLayout.insert(ComputedLayout.end(), F.begin(), F.end());
88
89 EXPECT_EQ(T.WantLayout, ComputedLayout);
90 }
91}