blob: 62aadf6f0e70088882c80001a638e6addbdc8a19 [file] [log] [blame]
Dan Gohmancb89afc2010-01-05 15:04:49 +00001//===- llvm/unittest/ADT/BitVectorTest.cpp - BitVector tests --------------===//
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
Dan Gohman3f5e9152010-04-30 20:50:28 +000010// Some of these tests fail on PowerPC for unknown reasons.
11#ifndef __ppc__
12
Dan Gohmancb89afc2010-01-05 15:04:49 +000013#include "llvm/ADT/BitVector.h"
14#include "gtest/gtest.h"
15
16using namespace llvm;
17
18namespace {
19
20TEST(BitVectorTest, TrivialOperation) {
21 BitVector Vec;
22 EXPECT_EQ(0U, Vec.count());
23 EXPECT_EQ(0U, Vec.size());
24 EXPECT_FALSE(Vec.any());
Dan Gohmanfab4c9e2010-09-27 15:48:37 +000025 EXPECT_TRUE(Vec.all());
Dan Gohmancb89afc2010-01-05 15:04:49 +000026 EXPECT_TRUE(Vec.none());
27 EXPECT_TRUE(Vec.empty());
28
29 Vec.resize(5, true);
30 EXPECT_EQ(5U, Vec.count());
31 EXPECT_EQ(5U, Vec.size());
32 EXPECT_TRUE(Vec.any());
Dan Gohmanfab4c9e2010-09-27 15:48:37 +000033 EXPECT_TRUE(Vec.all());
Dan Gohmancb89afc2010-01-05 15:04:49 +000034 EXPECT_FALSE(Vec.none());
35 EXPECT_FALSE(Vec.empty());
36
37 Vec.resize(11);
38 EXPECT_EQ(5U, Vec.count());
39 EXPECT_EQ(11U, Vec.size());
40 EXPECT_TRUE(Vec.any());
Dan Gohmanfab4c9e2010-09-27 15:48:37 +000041 EXPECT_FALSE(Vec.all());
Dan Gohmancb89afc2010-01-05 15:04:49 +000042 EXPECT_FALSE(Vec.none());
43 EXPECT_FALSE(Vec.empty());
44
Jakob Stoklund Olesen00570222012-05-14 15:46:27 +000045 BitVector Inv = Vec;
46 Inv.flip();
Dan Gohmancb89afc2010-01-05 15:04:49 +000047 EXPECT_EQ(6U, Inv.count());
48 EXPECT_EQ(11U, Inv.size());
49 EXPECT_TRUE(Inv.any());
Dan Gohmanfab4c9e2010-09-27 15:48:37 +000050 EXPECT_FALSE(Inv.all());
Dan Gohmancb89afc2010-01-05 15:04:49 +000051 EXPECT_FALSE(Inv.none());
52 EXPECT_FALSE(Inv.empty());
53
54 EXPECT_FALSE(Inv == Vec);
55 EXPECT_TRUE(Inv != Vec);
Jakob Stoklund Olesen00570222012-05-14 15:46:27 +000056 Vec.flip();
Dan Gohmancb89afc2010-01-05 15:04:49 +000057 EXPECT_TRUE(Inv == Vec);
58 EXPECT_FALSE(Inv != Vec);
59
60 // Add some "interesting" data to Vec.
61 Vec.resize(23, true);
62 Vec.resize(25, false);
63 Vec.resize(26, true);
64 Vec.resize(29, false);
65 Vec.resize(33, true);
Dan Gohman3f5e9152010-04-30 20:50:28 +000066 Vec.resize(57, false);
Dan Gohmancb89afc2010-01-05 15:04:49 +000067 unsigned Count = 0;
68 for (unsigned i = Vec.find_first(); i != -1u; i = Vec.find_next(i)) {
69 ++Count;
70 EXPECT_TRUE(Vec[i]);
71 EXPECT_TRUE(Vec.test(i));
72 }
73 EXPECT_EQ(Count, Vec.count());
74 EXPECT_EQ(Count, 23u);
75 EXPECT_FALSE(Vec[0]);
76 EXPECT_TRUE(Vec[32]);
Dan Gohman3f5e9152010-04-30 20:50:28 +000077 EXPECT_FALSE(Vec[56]);
78 Vec.resize(61, false);
Dan Gohmancb89afc2010-01-05 15:04:49 +000079
80 BitVector Copy = Vec;
81 BitVector Alt(3, false);
82 Alt.resize(6, true);
83 std::swap(Alt, Vec);
84 EXPECT_TRUE(Copy == Alt);
85 EXPECT_TRUE(Vec.size() == 6);
86 EXPECT_TRUE(Vec.count() == 3);
87 EXPECT_TRUE(Vec.find_first() == 3);
88 std::swap(Copy, Vec);
89
90 // Add some more "interesting" data.
91 Vec.resize(68, true);
92 Vec.resize(78, false);
93 Vec.resize(89, true);
94 Vec.resize(90, false);
95 Vec.resize(91, true);
96 Vec.resize(130, false);
97 Count = 0;
98 for (unsigned i = Vec.find_first(); i != -1u; i = Vec.find_next(i)) {
99 ++Count;
100 EXPECT_TRUE(Vec[i]);
101 EXPECT_TRUE(Vec.test(i));
102 }
103 EXPECT_EQ(Count, Vec.count());
104 EXPECT_EQ(Count, 42u);
105 EXPECT_FALSE(Vec[0]);
106 EXPECT_TRUE(Vec[32]);
107 EXPECT_FALSE(Vec[60]);
108 EXPECT_FALSE(Vec[129]);
109
110 Vec.flip(60);
111 EXPECT_TRUE(Vec[60]);
112 EXPECT_EQ(Count + 1, Vec.count());
113 Vec.flip(60);
114 EXPECT_FALSE(Vec[60]);
115 EXPECT_EQ(Count, Vec.count());
116
117 Vec.reset(32);
118 EXPECT_FALSE(Vec[32]);
119 EXPECT_EQ(Count - 1, Vec.count());
120 Vec.set(32);
121 EXPECT_TRUE(Vec[32]);
122 EXPECT_EQ(Count, Vec.count());
123
124 Vec.flip();
125 EXPECT_EQ(Vec.size() - Count, Vec.count());
126
127 Vec.reset();
128 EXPECT_EQ(0U, Vec.count());
129 EXPECT_EQ(130U, Vec.size());
130 EXPECT_FALSE(Vec.any());
Dan Gohmanfab4c9e2010-09-27 15:48:37 +0000131 EXPECT_FALSE(Vec.all());
Dan Gohmancb89afc2010-01-05 15:04:49 +0000132 EXPECT_TRUE(Vec.none());
133 EXPECT_FALSE(Vec.empty());
134
Jakob Stoklund Olesen00570222012-05-14 15:46:27 +0000135 Inv = BitVector().flip();
Dan Gohmancb89afc2010-01-05 15:04:49 +0000136 EXPECT_EQ(0U, Inv.count());
137 EXPECT_EQ(0U, Inv.size());
138 EXPECT_FALSE(Inv.any());
Dan Gohmanfab4c9e2010-09-27 15:48:37 +0000139 EXPECT_TRUE(Inv.all());
Dan Gohmancb89afc2010-01-05 15:04:49 +0000140 EXPECT_TRUE(Inv.none());
141 EXPECT_TRUE(Inv.empty());
142
143 Vec.clear();
144 EXPECT_EQ(0U, Vec.count());
145 EXPECT_EQ(0U, Vec.size());
146 EXPECT_FALSE(Vec.any());
Dan Gohmanfab4c9e2010-09-27 15:48:37 +0000147 EXPECT_TRUE(Vec.all());
Dan Gohmancb89afc2010-01-05 15:04:49 +0000148 EXPECT_TRUE(Vec.none());
149 EXPECT_TRUE(Vec.empty());
150}
151
Dan Gohmane7962c92010-02-10 05:54:04 +0000152TEST(BitVectorTest, CompoundAssignment) {
153 BitVector A;
154 A.resize(10);
155 A.set(4);
156 A.set(7);
157
158 BitVector B;
159 B.resize(50);
160 B.set(5);
161 B.set(18);
162
163 A |= B;
164 EXPECT_TRUE(A.test(4));
165 EXPECT_TRUE(A.test(5));
166 EXPECT_TRUE(A.test(7));
167 EXPECT_TRUE(A.test(18));
Benjamin Kramerc9e31cc2010-02-10 13:34:02 +0000168 EXPECT_EQ(4U, A.count());
169 EXPECT_EQ(50U, A.size());
Dan Gohmane7962c92010-02-10 05:54:04 +0000170
171 B.resize(10);
172 B.set();
173 B.reset(2);
174 B.reset(7);
175 A &= B;
176 EXPECT_FALSE(A.test(2));
177 EXPECT_FALSE(A.test(7));
Benjamin Kramerc9e31cc2010-02-10 13:34:02 +0000178 EXPECT_EQ(2U, A.count());
179 EXPECT_EQ(50U, A.size());
Dan Gohmane7962c92010-02-10 05:54:04 +0000180
181 B.resize(100);
182 B.set();
183
184 A ^= B;
185 EXPECT_TRUE(A.test(2));
186 EXPECT_TRUE(A.test(7));
Benjamin Kramerc9e31cc2010-02-10 13:34:02 +0000187 EXPECT_EQ(98U, A.count());
188 EXPECT_EQ(100U, A.size());
Dan Gohmancb89afc2010-01-05 15:04:49 +0000189}
Dan Gohmane7962c92010-02-10 05:54:04 +0000190
Dan Gohman3f5e9152010-04-30 20:50:28 +0000191TEST(BitVectorTest, ProxyIndex) {
192 BitVector Vec(3);
193 EXPECT_TRUE(Vec.none());
194 Vec[0] = Vec[1] = Vec[2] = true;
195 EXPECT_EQ(Vec.size(), Vec.count());
196 Vec[2] = Vec[1] = Vec[0] = false;
197 EXPECT_TRUE(Vec.none());
198}
199
Jakob Stoklund Olesenff5bad02012-01-17 01:24:32 +0000200TEST(BitVectorTest, PortableBitMask) {
201 BitVector A;
202 const uint32_t Mask1[] = { 0x80000000, 6, 5 };
203
204 A.resize(10);
205 A.setBitsInMask(Mask1, 3);
206 EXPECT_EQ(10u, A.size());
207 EXPECT_FALSE(A.test(0));
208
209 A.resize(32);
210 A.setBitsInMask(Mask1, 3);
211 EXPECT_FALSE(A.test(0));
212 EXPECT_TRUE(A.test(31));
213 EXPECT_EQ(1u, A.count());
214
215 A.resize(33);
216 A.setBitsInMask(Mask1, 1);
217 EXPECT_EQ(1u, A.count());
218 A.setBitsInMask(Mask1, 2);
219 EXPECT_EQ(1u, A.count());
220
221 A.resize(34);
222 A.setBitsInMask(Mask1, 2);
223 EXPECT_EQ(2u, A.count());
224
225 A.resize(65);
226 A.setBitsInMask(Mask1, 3);
227 EXPECT_EQ(4u, A.count());
228
229 A.setBitsNotInMask(Mask1, 1);
230 EXPECT_EQ(32u+3u, A.count());
231
232 A.setBitsNotInMask(Mask1, 3);
233 EXPECT_EQ(65u, A.count());
234
235 A.resize(96);
236 EXPECT_EQ(65u, A.count());
237
238 A.clear();
239 A.resize(128);
240 A.setBitsNotInMask(Mask1, 3);
241 EXPECT_EQ(96u-5u, A.count());
242
243 A.clearBitsNotInMask(Mask1, 1);
244 EXPECT_EQ(64-4u, A.count());
245}
Dan Gohmane7962c92010-02-10 05:54:04 +0000246
Jakob Stoklund Olesen03a38112012-05-14 15:01:19 +0000247TEST(BitVectorTest, BinOps) {
248 BitVector A;
249 BitVector B;
250
251 A.resize(65);
252 EXPECT_FALSE(A.anyCommon(B));
253 EXPECT_FALSE(B.anyCommon(B));
254
255 B.resize(64);
256 A.set(64);
257 EXPECT_FALSE(A.anyCommon(B));
258 EXPECT_FALSE(B.anyCommon(A));
259
260 B.set(63);
261 EXPECT_FALSE(A.anyCommon(B));
262 EXPECT_FALSE(B.anyCommon(A));
263
264 A.set(63);
265 EXPECT_TRUE(A.anyCommon(B));
266 EXPECT_TRUE(B.anyCommon(A));
267
268 B.resize(70);
269 B.set(64);
270 B.reset(63);
271 A.resize(64);
272 EXPECT_FALSE(A.anyCommon(B));
273 EXPECT_FALSE(B.anyCommon(A));
274}
275}
Dale Johannesence97b752010-02-09 22:15:27 +0000276#endif