BitVectorTest.cpp revision fab4c9e9df1aeb33b55cfcfa174fac8d61df96fd
1cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman//===- llvm/unittest/ADT/BitVectorTest.cpp - BitVector tests --------------===//
2cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman//
3cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman//                     The LLVM Compiler Infrastructure
4cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman//
5cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman// This file is distributed under the University of Illinois Open Source
6cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman// License. See LICENSE.TXT for details.
7cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman//
8cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman//===----------------------------------------------------------------------===//
9cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
103f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman// Some of these tests fail on PowerPC for unknown reasons.
113f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman#ifndef __ppc__
123f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman
13cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman#include "llvm/ADT/BitVector.h"
14cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman#include "gtest/gtest.h"
15cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
16cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohmanusing namespace llvm;
17cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
18cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohmannamespace {
19cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
20cb89afc965c66029ae38712d1c52f5bbe4dee942Dan GohmanTEST(BitVectorTest, TrivialOperation) {
21cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  BitVector Vec;
22cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(0U, Vec.count());
23cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(0U, Vec.size());
24cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Vec.any());
25fab4c9e9df1aeb33b55cfcfa174fac8d61df96fdDan Gohman  EXPECT_TRUE(Vec.all());
26cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Vec.none());
27cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Vec.empty());
28cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
29cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.resize(5, true);
30cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(5U, Vec.count());
31cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(5U, Vec.size());
32cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Vec.any());
33fab4c9e9df1aeb33b55cfcfa174fac8d61df96fdDan Gohman  EXPECT_TRUE(Vec.all());
34cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Vec.none());
35cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Vec.empty());
36cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
37cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.resize(11);
38cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(5U, Vec.count());
39cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(11U, Vec.size());
40cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Vec.any());
41fab4c9e9df1aeb33b55cfcfa174fac8d61df96fdDan Gohman  EXPECT_FALSE(Vec.all());
42cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Vec.none());
43cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Vec.empty());
44cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
45cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  BitVector Inv = ~Vec;
46cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(6U, Inv.count());
47cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(11U, Inv.size());
48cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Inv.any());
49fab4c9e9df1aeb33b55cfcfa174fac8d61df96fdDan Gohman  EXPECT_FALSE(Inv.all());
50cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Inv.none());
51cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Inv.empty());
52cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
53cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Inv == Vec);
54cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Inv != Vec);
55cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec = ~Vec;
56cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Inv == Vec);
57cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Inv != Vec);
58cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
59cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  // Add some "interesting" data to Vec.
60cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.resize(23, true);
61cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.resize(25, false);
62cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.resize(26, true);
63cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.resize(29, false);
64cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.resize(33, true);
653f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman  Vec.resize(57, false);
66cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  unsigned Count = 0;
67cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  for (unsigned i = Vec.find_first(); i != -1u; i = Vec.find_next(i)) {
68cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman    ++Count;
69cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman    EXPECT_TRUE(Vec[i]);
70cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman    EXPECT_TRUE(Vec.test(i));
71cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  }
72cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(Count, Vec.count());
73cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(Count, 23u);
74cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Vec[0]);
75cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Vec[32]);
763f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman  EXPECT_FALSE(Vec[56]);
773f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman  Vec.resize(61, false);
78cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
79cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  BitVector Copy = Vec;
80cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  BitVector Alt(3, false);
81cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Alt.resize(6, true);
82cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  std::swap(Alt, Vec);
83cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Copy == Alt);
84cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Vec.size() == 6);
85cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Vec.count() == 3);
86cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Vec.find_first() == 3);
87cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  std::swap(Copy, Vec);
88cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
89cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  // Add some more "interesting" data.
90cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.resize(68, true);
91cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.resize(78, false);
92cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.resize(89, true);
93cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.resize(90, false);
94cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.resize(91, true);
95cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.resize(130, false);
96cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Count = 0;
97cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  for (unsigned i = Vec.find_first(); i != -1u; i = Vec.find_next(i)) {
98cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman    ++Count;
99cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman    EXPECT_TRUE(Vec[i]);
100cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman    EXPECT_TRUE(Vec.test(i));
101cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  }
102cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(Count, Vec.count());
103cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(Count, 42u);
104cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Vec[0]);
105cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Vec[32]);
106cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Vec[60]);
107cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Vec[129]);
108cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
109cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.flip(60);
110cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Vec[60]);
111cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(Count + 1, Vec.count());
112cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.flip(60);
113cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Vec[60]);
114cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(Count, Vec.count());
115cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
116cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.reset(32);
117cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Vec[32]);
118cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(Count - 1, Vec.count());
119cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.set(32);
120cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Vec[32]);
121cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(Count, Vec.count());
122cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
123cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.flip();
124cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(Vec.size() - Count, Vec.count());
125cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
126cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.reset();
127cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(0U, Vec.count());
128cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(130U, Vec.size());
129cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Vec.any());
130fab4c9e9df1aeb33b55cfcfa174fac8d61df96fdDan Gohman  EXPECT_FALSE(Vec.all());
131cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Vec.none());
132cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Vec.empty());
133cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
134cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Inv = ~BitVector();
135cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(0U, Inv.count());
136cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(0U, Inv.size());
137cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Inv.any());
138fab4c9e9df1aeb33b55cfcfa174fac8d61df96fdDan Gohman  EXPECT_TRUE(Inv.all());
139cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Inv.none());
140cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Inv.empty());
141cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
142cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  Vec.clear();
143cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(0U, Vec.count());
144cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_EQ(0U, Vec.size());
145cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_FALSE(Vec.any());
146fab4c9e9df1aeb33b55cfcfa174fac8d61df96fdDan Gohman  EXPECT_TRUE(Vec.all());
147cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Vec.none());
148cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman  EXPECT_TRUE(Vec.empty());
149cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman}
150cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman
151e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan GohmanTEST(BitVectorTest, CompoundAssignment) {
152e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  BitVector A;
153e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  A.resize(10);
154e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  A.set(4);
155e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  A.set(7);
156e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman
157e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  BitVector B;
158e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  B.resize(50);
159e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  B.set(5);
160e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  B.set(18);
161e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman
162e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  A |= B;
163e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  EXPECT_TRUE(A.test(4));
164e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  EXPECT_TRUE(A.test(5));
165e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  EXPECT_TRUE(A.test(7));
166e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  EXPECT_TRUE(A.test(18));
167c9e31cc8232892b30dac38f97c90ebc41428f59aBenjamin Kramer  EXPECT_EQ(4U, A.count());
168c9e31cc8232892b30dac38f97c90ebc41428f59aBenjamin Kramer  EXPECT_EQ(50U, A.size());
169e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman
170e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  B.resize(10);
171e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  B.set();
172e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  B.reset(2);
173e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  B.reset(7);
174e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  A &= B;
175e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  EXPECT_FALSE(A.test(2));
176e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  EXPECT_FALSE(A.test(7));
177c9e31cc8232892b30dac38f97c90ebc41428f59aBenjamin Kramer  EXPECT_EQ(2U, A.count());
178c9e31cc8232892b30dac38f97c90ebc41428f59aBenjamin Kramer  EXPECT_EQ(50U, A.size());
179e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman
180e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  B.resize(100);
181e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  B.set();
182e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman
183e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  A ^= B;
184e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  EXPECT_TRUE(A.test(2));
185e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman  EXPECT_TRUE(A.test(7));
186c9e31cc8232892b30dac38f97c90ebc41428f59aBenjamin Kramer  EXPECT_EQ(98U, A.count());
187c9e31cc8232892b30dac38f97c90ebc41428f59aBenjamin Kramer  EXPECT_EQ(100U, A.size());
188cb89afc965c66029ae38712d1c52f5bbe4dee942Dan Gohman}
189e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman
1903f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan GohmanTEST(BitVectorTest, ProxyIndex) {
1913f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman  BitVector Vec(3);
1923f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman  EXPECT_TRUE(Vec.none());
1933f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman  Vec[0] = Vec[1] = Vec[2] = true;
1943f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman  EXPECT_EQ(Vec.size(), Vec.count());
1953f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman  Vec[2] = Vec[1] = Vec[0] = false;
1963f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman  EXPECT_TRUE(Vec.none());
1973f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman}
1983f5e91565273e3f4639d37ee5a5b856699e8c9e5Dan Gohman
199e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman}
200e7962c9897cf3ac5fc731702d5e5d8963fc5c723Dan Gohman
201ce97b75c1d507808abcb67635cfcdce2f48e53c9Dale Johannesen#endif
202