56f315a09af3e9ddf03cb6ce67710f3e6f76a5f1
[oota-llvm.git] / unittests / Support / ConstantRangeTest.cpp
1 //===- llvm/unittest/Support/ConstantRangeTest.cpp - ConstantRange 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
10 #include "llvm/Support/ConstantRange.h"
11 #include "llvm/Support/raw_ostream.h"
12
13 #include "gtest/gtest.h"
14
15 using namespace llvm;
16
17 namespace {
18
19 // Support APInt output to an std::ostream.
20 inline std::ostream &operator<<(std::ostream &OS, const APInt &Value) {
21   raw_os_ostream RawOS(OS);
22   RawOS << Value;
23   return OS;
24 }
25
26 class ConstantRangeTest : public ::testing::Test {
27 protected:
28   static ConstantRange Full;
29   static ConstantRange Empty;
30   static ConstantRange One;
31   static ConstantRange Some;
32   static ConstantRange Wrap;
33 };
34
35 ConstantRange ConstantRangeTest::Full(16);
36 ConstantRange ConstantRangeTest::Empty(16, false);
37 ConstantRange ConstantRangeTest::One(APInt(16, 0xa));
38 ConstantRange ConstantRangeTest::Some(APInt(16, 0xa), APInt(16, 0xaaa));
39 ConstantRange ConstantRangeTest::Wrap(APInt(16, 0xaaa), APInt(16, 0xa));
40
41 TEST_F(ConstantRangeTest, Basics) {
42   EXPECT_TRUE(Full.isFullSet());
43   EXPECT_FALSE(Full.isEmptySet());
44   EXPECT_FALSE(Full.isWrappedSet());
45   EXPECT_TRUE(Full.contains(APInt(16, 0x0)));
46   EXPECT_TRUE(Full.contains(APInt(16, 0x9)));
47   EXPECT_TRUE(Full.contains(APInt(16, 0xa)));
48   EXPECT_TRUE(Full.contains(APInt(16, 0xaa9)));
49   EXPECT_TRUE(Full.contains(APInt(16, 0xaaa)));
50
51   EXPECT_FALSE(Empty.isFullSet());
52   EXPECT_TRUE(Empty.isEmptySet());
53   EXPECT_FALSE(Empty.isWrappedSet());
54   EXPECT_FALSE(Empty.contains(APInt(16, 0x0)));
55   EXPECT_FALSE(Empty.contains(APInt(16, 0x9)));
56   EXPECT_FALSE(Empty.contains(APInt(16, 0xa)));
57   EXPECT_FALSE(Empty.contains(APInt(16, 0xaa9)));
58   EXPECT_FALSE(Empty.contains(APInt(16, 0xaaa)));
59
60   EXPECT_FALSE(One.isFullSet());
61   EXPECT_FALSE(One.isEmptySet());
62   EXPECT_FALSE(One.isWrappedSet());
63   EXPECT_FALSE(One.contains(APInt(16, 0x0)));
64   EXPECT_FALSE(One.contains(APInt(16, 0x9)));
65   EXPECT_TRUE(One.contains(APInt(16, 0xa)));
66   EXPECT_FALSE(One.contains(APInt(16, 0xaa9)));
67   EXPECT_FALSE(One.contains(APInt(16, 0xaaa)));
68
69   EXPECT_FALSE(Some.isFullSet());
70   EXPECT_FALSE(Some.isEmptySet());
71   EXPECT_FALSE(Some.isWrappedSet());
72   EXPECT_FALSE(Some.contains(APInt(16, 0x0)));
73   EXPECT_FALSE(Some.contains(APInt(16, 0x9)));
74   EXPECT_TRUE(Some.contains(APInt(16, 0xa)));
75   EXPECT_TRUE(Some.contains(APInt(16, 0xaa9)));
76   EXPECT_FALSE(Some.contains(APInt(16, 0xaaa)));
77
78   EXPECT_FALSE(Wrap.isFullSet());
79   EXPECT_FALSE(Wrap.isEmptySet());
80   EXPECT_TRUE(Wrap.isWrappedSet());
81   EXPECT_TRUE(Wrap.contains(APInt(16, 0x0)));
82   EXPECT_TRUE(Wrap.contains(APInt(16, 0x9)));
83   EXPECT_FALSE(Wrap.contains(APInt(16, 0xa)));
84   EXPECT_FALSE(Wrap.contains(APInt(16, 0xaa9)));
85   EXPECT_TRUE(Wrap.contains(APInt(16, 0xaaa)));
86 }
87
88 TEST_F(ConstantRangeTest, Equality) {
89   EXPECT_TRUE(Full == Full);
90   EXPECT_TRUE(Empty == Empty);
91   EXPECT_TRUE(One == One);
92   EXPECT_TRUE(Some == Some);
93   EXPECT_TRUE(Wrap == Wrap);
94   EXPECT_TRUE(Full != Empty);
95   EXPECT_TRUE(Full != One);
96   EXPECT_TRUE(Full != Some);
97   EXPECT_TRUE(Full != Wrap);
98   EXPECT_TRUE(Empty != One);
99   EXPECT_TRUE(Empty != Some);
100   EXPECT_TRUE(Empty != Wrap);
101   EXPECT_TRUE(One != Some);
102   EXPECT_TRUE(One != Wrap);
103   EXPECT_TRUE(Some != Wrap);
104 }
105
106 TEST_F(ConstantRangeTest, SingleElement) {
107   EXPECT_EQ(Full.getSingleElement(), static_cast<APInt *>(NULL));
108   EXPECT_EQ(Empty.getSingleElement(), static_cast<APInt *>(NULL));
109   EXPECT_EQ(*One.getSingleElement(), APInt(16, 0xa));
110   EXPECT_EQ(Some.getSingleElement(), static_cast<APInt *>(NULL));
111   EXPECT_EQ(Wrap.getSingleElement(), static_cast<APInt *>(NULL));
112
113   EXPECT_FALSE(Full.isSingleElement());
114   EXPECT_FALSE(Empty.isSingleElement());
115   EXPECT_TRUE(One.isSingleElement());
116   EXPECT_FALSE(Some.isSingleElement());
117   EXPECT_FALSE(Wrap.isSingleElement());
118 }
119
120 TEST_F(ConstantRangeTest, GetSetSize) {
121   EXPECT_EQ(Full.getSetSize(), APInt(16, 0));
122   EXPECT_EQ(Empty.getSetSize(), APInt(16, 0));
123   EXPECT_EQ(One.getSetSize(), APInt(16, 1));
124   EXPECT_EQ(Some.getSetSize(), APInt(16, 0xaa0));
125   EXPECT_EQ(Wrap.getSetSize(), APInt(16, 0x10000 - 0xaa0));
126 }
127
128 TEST_F(ConstantRangeTest, GetMinsAndMaxes) {
129   EXPECT_EQ(Full.getUnsignedMax(), APInt(16, UINT16_MAX));
130   EXPECT_EQ(One.getUnsignedMax(), APInt(16, 0xa));
131   EXPECT_EQ(Some.getUnsignedMax(), APInt(16, 0xaa9));
132   EXPECT_EQ(Wrap.getUnsignedMax(), APInt(16, UINT16_MAX));
133
134   EXPECT_EQ(Full.getUnsignedMin(), APInt(16, 0));
135   EXPECT_EQ(One.getUnsignedMin(), APInt(16, 0xa));
136   EXPECT_EQ(Some.getUnsignedMin(), APInt(16, 0xa));
137   EXPECT_EQ(Wrap.getUnsignedMin(), APInt(16, 0));
138
139   EXPECT_EQ(Full.getSignedMax(), APInt(16, INT16_MAX));
140   EXPECT_EQ(One.getSignedMax(), APInt(16, 0xa));
141   EXPECT_EQ(Some.getSignedMax(), APInt(16, 0xaa9));
142   EXPECT_EQ(Wrap.getSignedMax(), APInt(16, INT16_MAX));
143
144   EXPECT_EQ(Full.getSignedMin(), APInt(16, (uint64_t)INT16_MIN));
145   EXPECT_EQ(One.getSignedMin(), APInt(16, 0xa));
146   EXPECT_EQ(Some.getSignedMin(), APInt(16, 0xa));
147   EXPECT_EQ(Wrap.getSignedMin(), APInt(16, (uint64_t)INT16_MIN));
148
149   // Found by Klee
150   EXPECT_EQ(ConstantRange(APInt(4, 7), APInt(4, 0)).getSignedMax(),
151             APInt(4, 7));
152 }
153
154 TEST_F(ConstantRangeTest, Trunc) {
155   ConstantRange TFull = Full.truncate(10);
156   ConstantRange TEmpty = Empty.truncate(10);
157   ConstantRange TOne = One.truncate(10);
158   ConstantRange TSome = Some.truncate(10);
159   ConstantRange TWrap = Wrap.truncate(10);
160   EXPECT_TRUE(TFull.isFullSet());
161   EXPECT_TRUE(TEmpty.isEmptySet());
162   EXPECT_TRUE(TOne == ConstantRange(APInt(One.getLower()).trunc(10),
163                                 APInt(One.getUpper()).trunc(10)));
164   EXPECT_TRUE(TSome.isFullSet());
165 }
166
167 TEST_F(ConstantRangeTest, ZExt) {
168   ConstantRange ZFull = Full.zeroExtend(20);
169   ConstantRange ZEmpty = Empty.zeroExtend(20);
170   ConstantRange ZOne = One.zeroExtend(20);
171   ConstantRange ZSome = Some.zeroExtend(20);
172   ConstantRange ZWrap = Wrap.zeroExtend(20);
173   EXPECT_TRUE(ZFull == ConstantRange(APInt(20, 0), APInt(20, 0x10000)));
174   EXPECT_TRUE(ZEmpty.isEmptySet());
175   EXPECT_TRUE(ZOne == ConstantRange(APInt(One.getLower()).zext(20),
176                                     APInt(One.getUpper()).zext(20)));
177   EXPECT_TRUE(ZSome == ConstantRange(APInt(Some.getLower()).zext(20),
178                                      APInt(Some.getUpper()).zext(20)));
179   EXPECT_TRUE(ZWrap == ConstantRange(APInt(Wrap.getLower()).zext(20),
180                                      APInt(Wrap.getUpper()).zext(20)));
181 }
182
183 TEST_F(ConstantRangeTest, SExt) {
184   ConstantRange SFull = Full.signExtend(20);
185   ConstantRange SEmpty = Empty.signExtend(20);
186   ConstantRange SOne = One.signExtend(20);
187   ConstantRange SSome = Some.signExtend(20);
188   ConstantRange SWrap = Wrap.signExtend(20);
189   EXPECT_TRUE(SFull == ConstantRange(APInt(20, (uint64_t)INT16_MIN, true),
190                                      APInt(20, INT16_MAX + 1, true)));
191   EXPECT_TRUE(SEmpty.isEmptySet());
192   EXPECT_TRUE(SOne == ConstantRange(APInt(One.getLower()).sext(20),
193                                     APInt(One.getUpper()).sext(20)));
194   EXPECT_TRUE(SSome == ConstantRange(APInt(Some.getLower()).sext(20),
195                                      APInt(Some.getUpper()).sext(20)));
196   EXPECT_TRUE(SWrap == ConstantRange(APInt(Wrap.getLower()).sext(20),
197                                      APInt(Wrap.getUpper()).sext(20)));
198 }
199
200 TEST_F(ConstantRangeTest, IntersectWith) {
201   EXPECT_TRUE(Empty.intersectWith(Full).isEmptySet());
202   EXPECT_TRUE(Empty.intersectWith(Empty).isEmptySet());
203   EXPECT_TRUE(Empty.intersectWith(One).isEmptySet());
204   EXPECT_TRUE(Empty.intersectWith(Some).isEmptySet());
205   EXPECT_TRUE(Empty.intersectWith(Wrap).isEmptySet());
206   EXPECT_TRUE(Full.intersectWith(Full).isFullSet());
207   EXPECT_TRUE(Some.intersectWith(Some) == Some);
208   EXPECT_TRUE(Some.intersectWith(One) == One);
209   EXPECT_TRUE(Full.intersectWith(One) == One);
210   EXPECT_TRUE(Full.intersectWith(Some) == Some);
211   EXPECT_TRUE(Some.intersectWith(Wrap).isEmptySet());
212   EXPECT_TRUE(One.intersectWith(Wrap).isEmptySet());
213   EXPECT_TRUE(One.intersectWith(Wrap) == Wrap.intersectWith(One));
214
215   // Klee generated testcase from PR4545.
216   // The intersection of i16 [4, 2) and [6, 5) is disjoint, looking like
217   // 01..4.6789ABCDEF where the dots represent values not in the intersection.
218   ConstantRange LHS(APInt(16, 4), APInt(16, 2));
219   ConstantRange RHS(APInt(16, 6), APInt(16, 5));
220   EXPECT_TRUE(LHS.intersectWith(RHS) == LHS);
221 }
222
223 TEST_F(ConstantRangeTest, UnionWith) {
224   EXPECT_TRUE(Wrap.unionWith(One) ==
225               ConstantRange(APInt(16, 0xaaa), APInt(16, 0xb)));
226   EXPECT_TRUE(One.unionWith(Wrap) == Wrap.unionWith(One));
227   EXPECT_TRUE(Empty.unionWith(Empty).isEmptySet());
228   EXPECT_TRUE(Full.unionWith(Full).isFullSet());
229   EXPECT_TRUE(Some.unionWith(Wrap).isFullSet());
230
231   // PR4545
232   EXPECT_TRUE(ConstantRange(APInt(16, 14), APInt(16, 1)).unionWith(
233                                  ConstantRange(APInt(16, 0), APInt(16, 8))) ==
234               ConstantRange(APInt(16, 14), APInt(16, 8)));
235   EXPECT_TRUE(ConstantRange(APInt(16, 6), APInt(16, 4)).unionWith(
236               ConstantRange(APInt(16, 4), APInt(16, 0))) ==
237               ConstantRange(16));
238   EXPECT_TRUE(ConstantRange(APInt(16, 1), APInt(16, 0)).unionWith(
239               ConstantRange(APInt(16, 2), APInt(16, 1))) ==
240               ConstantRange(16));
241 }
242
243 TEST_F(ConstantRangeTest, SubtractAPInt) {
244   EXPECT_TRUE(Full.subtract(APInt(16, 4)).isFullSet());
245   EXPECT_TRUE(Empty.subtract(APInt(16, 4)).isEmptySet());
246   EXPECT_TRUE(Some.subtract(APInt(16, 4)) ==
247               ConstantRange(APInt(16, 0x6), APInt(16, 0xaa6)));
248   EXPECT_TRUE(Wrap.subtract(APInt(16, 4)) ==
249               ConstantRange(APInt(16, 0xaa6), APInt(16, 0x6)));
250   EXPECT_TRUE(One.subtract(APInt(16, 4)) ==
251               ConstantRange(APInt(16, 0x6)));
252 }
253
254 TEST_F(ConstantRangeTest, Add) {
255   EXPECT_TRUE(Full.add(APInt(16, 4)).isFullSet());
256   EXPECT_TRUE(Full.add(Full) == Full);
257   EXPECT_TRUE(Full.add(Empty) == Empty);
258   EXPECT_TRUE(Full.add(One) == Full);
259   EXPECT_TRUE(Full.add(Some) == Full);
260   EXPECT_TRUE(Full.add(Wrap) == Full);
261   EXPECT_TRUE(Empty.add(Empty) == Empty);
262   EXPECT_TRUE(Empty.add(One) == Empty);
263   EXPECT_TRUE(Empty.add(Some) == Empty);
264   EXPECT_TRUE(Empty.add(Wrap) == Empty);
265   EXPECT_TRUE(Empty.add(APInt(16, 4)).isEmptySet());
266   EXPECT_TRUE(Some.add(APInt(16, 4)) ==
267               ConstantRange(APInt(16, 0xe), APInt(16, 0xaae)));
268   EXPECT_TRUE(Wrap.add(APInt(16, 4)) ==
269               ConstantRange(APInt(16, 0xaae), APInt(16, 0xe)));
270   EXPECT_TRUE(One.add(APInt(16, 4)) ==
271               ConstantRange(APInt(16, 0xe)));
272 }
273
274 TEST_F(ConstantRangeTest, Multiply) {
275   EXPECT_TRUE(Full.multiply(Full) == Full);
276   EXPECT_TRUE(Full.multiply(Empty) == Empty);
277   EXPECT_TRUE(Full.multiply(One) == Full);
278   EXPECT_TRUE(Full.multiply(Some) == Full);
279   EXPECT_TRUE(Full.multiply(Wrap) == Full);
280   EXPECT_TRUE(Empty.multiply(Empty) == Empty);
281   EXPECT_TRUE(Empty.multiply(One) == Empty);
282   EXPECT_TRUE(Empty.multiply(Some) == Empty);
283   EXPECT_TRUE(Empty.multiply(Wrap) == Empty);
284   EXPECT_TRUE(One.multiply(One) == ConstantRange(APInt(16, 0xa*0xa),
285                                                  APInt(16, 0xa*0xa + 1)));
286   EXPECT_TRUE(One.multiply(Some) == ConstantRange(APInt(16, 0xa*0xa),
287                                                   APInt(16, 0xa*0xaa9 + 1)));
288   EXPECT_TRUE(One.multiply(Wrap).isFullSet());
289   EXPECT_TRUE(Some.multiply(Some).isFullSet());
290   EXPECT_TRUE(Some.multiply(Wrap) == Full);
291   EXPECT_TRUE(Wrap.multiply(Wrap) == Full);
292
293   // http://llvm.org/PR4545
294   EXPECT_TRUE(ConstantRange(APInt(4, 1), APInt(4, 6)).multiply(
295               ConstantRange(APInt(4, 6), APInt(4, 2))) ==
296               ConstantRange(4, /*isFullSet=*/true));
297 }
298
299 TEST_F(ConstantRangeTest, UMax) {
300   EXPECT_TRUE(Full.umax(Full).isFullSet());
301   EXPECT_TRUE(Full.umax(Empty).isEmptySet());
302   EXPECT_TRUE(Full.umax(Some) == ConstantRange(APInt(16, 0xa), APInt(16, 0)));
303   EXPECT_TRUE(Full.umax(Wrap).isFullSet());
304   EXPECT_TRUE(Full.umax(Some) == ConstantRange(APInt(16, 0xa), APInt(16, 0)));
305   EXPECT_TRUE(Empty.umax(Empty) == Empty);
306   EXPECT_TRUE(Empty.umax(Some) == Empty);
307   EXPECT_TRUE(Empty.umax(Wrap) == Empty);
308   EXPECT_TRUE(Empty.umax(One) == Empty);
309   EXPECT_TRUE(Some.umax(Some) == Some);
310   EXPECT_TRUE(Some.umax(Wrap) == ConstantRange(APInt(16, 0xa), APInt(16, 0)));
311   EXPECT_TRUE(Some.umax(One) == Some);
312   // TODO: ConstantRange is currently over-conservative here.
313   EXPECT_TRUE(Wrap.umax(Wrap) == Full);
314   EXPECT_TRUE(Wrap.umax(One) == ConstantRange(APInt(16, 0xa), APInt(16, 0)));
315   EXPECT_TRUE(One.umax(One) == One);
316 }
317
318 TEST_F(ConstantRangeTest, SMax) {
319   EXPECT_TRUE(Full.smax(Full).isFullSet());
320   EXPECT_TRUE(Full.smax(Empty).isEmptySet());
321   EXPECT_TRUE(Full.smax(Some) == ConstantRange(APInt(16, 0xa),
322                                                APInt::getSignedMinValue(16)));
323   EXPECT_TRUE(Full.smax(Wrap).isFullSet());
324   EXPECT_TRUE(Full.smax(One) == ConstantRange(APInt(16, 0xa),
325                                               APInt::getSignedMinValue(16)));
326   EXPECT_TRUE(Empty.smax(Empty) == Empty);
327   EXPECT_TRUE(Empty.smax(Some) == Empty);
328   EXPECT_TRUE(Empty.smax(Wrap) == Empty);
329   EXPECT_TRUE(Empty.smax(One) == Empty);
330   EXPECT_TRUE(Some.smax(Some) == Some);
331   EXPECT_TRUE(Some.smax(Wrap) == ConstantRange(APInt(16, 0xa),
332                                                APInt(16, (uint64_t)INT16_MIN)));
333   EXPECT_TRUE(Some.smax(One) == Some);
334   EXPECT_TRUE(Wrap.smax(One) == ConstantRange(APInt(16, 0xa),
335                                               APInt(16, (uint64_t)INT16_MIN)));
336   EXPECT_TRUE(One.smax(One) == One);
337 }
338
339 TEST_F(ConstantRangeTest, UDiv) {
340   EXPECT_TRUE(Full.udiv(Full) == Full);
341   EXPECT_TRUE(Full.udiv(Empty) == Empty);
342   EXPECT_TRUE(Full.udiv(One) == ConstantRange(APInt(16, 0),
343                                               APInt(16, 0xffff / 0xa + 1)));
344   EXPECT_TRUE(Full.udiv(Some) == ConstantRange(APInt(16, 0),
345                                                APInt(16, 0xffff / 0xa + 1)));
346   EXPECT_TRUE(Full.udiv(Wrap) == Full);
347   EXPECT_TRUE(Empty.udiv(Empty) == Empty);
348   EXPECT_TRUE(Empty.udiv(One) == Empty);
349   EXPECT_TRUE(Empty.udiv(Some) == Empty);
350   EXPECT_TRUE(Empty.udiv(Wrap) == Empty);
351   EXPECT_TRUE(One.udiv(One) == ConstantRange(APInt(16, 1)));
352   EXPECT_TRUE(One.udiv(Some) == ConstantRange(APInt(16, 0), APInt(16, 2)));
353   EXPECT_TRUE(One.udiv(Wrap) == ConstantRange(APInt(16, 0), APInt(16, 0xb)));
354   EXPECT_TRUE(Some.udiv(Some) == ConstantRange(APInt(16, 0), APInt(16, 0x111)));
355   EXPECT_TRUE(Some.udiv(Wrap) == ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
356   EXPECT_TRUE(Wrap.udiv(Wrap) == Full);
357 }
358
359 }  // anonymous namespace