blob: a562080981ae8141053624175450d99f8fd408ce [file] [log] [blame]
Dan Gohmana3755d82009-07-09 22:07:27 +00001//===- 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"
Nick Lewyckyf2d7b7c2010-09-28 18:18:36 +000011#include "llvm/Instructions.h"
Dan Gohmana3755d82009-07-09 22:07:27 +000012
13#include "gtest/gtest.h"
14
15using namespace llvm;
16
17namespace {
18
Nick Lewycky44b3e8d2009-07-11 18:43:20 +000019class ConstantRangeTest : public ::testing::Test {
20protected:
21 static ConstantRange Full;
22 static ConstantRange Empty;
23 static ConstantRange One;
24 static ConstantRange Some;
25 static ConstantRange Wrap;
26};
Dan Gohmana3755d82009-07-09 22:07:27 +000027
Nick Lewycky44b3e8d2009-07-11 18:43:20 +000028ConstantRange ConstantRangeTest::Full(16);
29ConstantRange ConstantRangeTest::Empty(16, false);
30ConstantRange ConstantRangeTest::One(APInt(16, 0xa));
31ConstantRange ConstantRangeTest::Some(APInt(16, 0xa), APInt(16, 0xaaa));
32ConstantRange ConstantRangeTest::Wrap(APInt(16, 0xaaa), APInt(16, 0xa));
33
34TEST_F(ConstantRangeTest, Basics) {
Dan Gohmana3755d82009-07-09 22:07:27 +000035 EXPECT_TRUE(Full.isFullSet());
36 EXPECT_FALSE(Full.isEmptySet());
Owen Anderson9773e452010-08-07 05:47:46 +000037 EXPECT_TRUE(Full.inverse().isEmptySet());
Dan Gohmana3755d82009-07-09 22:07:27 +000038 EXPECT_FALSE(Full.isWrappedSet());
39 EXPECT_TRUE(Full.contains(APInt(16, 0x0)));
40 EXPECT_TRUE(Full.contains(APInt(16, 0x9)));
41 EXPECT_TRUE(Full.contains(APInt(16, 0xa)));
42 EXPECT_TRUE(Full.contains(APInt(16, 0xaa9)));
43 EXPECT_TRUE(Full.contains(APInt(16, 0xaaa)));
44
45 EXPECT_FALSE(Empty.isFullSet());
46 EXPECT_TRUE(Empty.isEmptySet());
Owen Anderson9773e452010-08-07 05:47:46 +000047 EXPECT_TRUE(Empty.inverse().isFullSet());
Dan Gohmana3755d82009-07-09 22:07:27 +000048 EXPECT_FALSE(Empty.isWrappedSet());
49 EXPECT_FALSE(Empty.contains(APInt(16, 0x0)));
50 EXPECT_FALSE(Empty.contains(APInt(16, 0x9)));
51 EXPECT_FALSE(Empty.contains(APInt(16, 0xa)));
52 EXPECT_FALSE(Empty.contains(APInt(16, 0xaa9)));
53 EXPECT_FALSE(Empty.contains(APInt(16, 0xaaa)));
54
55 EXPECT_FALSE(One.isFullSet());
56 EXPECT_FALSE(One.isEmptySet());
57 EXPECT_FALSE(One.isWrappedSet());
58 EXPECT_FALSE(One.contains(APInt(16, 0x0)));
59 EXPECT_FALSE(One.contains(APInt(16, 0x9)));
60 EXPECT_TRUE(One.contains(APInt(16, 0xa)));
61 EXPECT_FALSE(One.contains(APInt(16, 0xaa9)));
62 EXPECT_FALSE(One.contains(APInt(16, 0xaaa)));
Owen Anderson9773e452010-08-07 05:47:46 +000063 EXPECT_FALSE(One.inverse().contains(APInt(16, 0xa)));
Dan Gohmana3755d82009-07-09 22:07:27 +000064
65 EXPECT_FALSE(Some.isFullSet());
66 EXPECT_FALSE(Some.isEmptySet());
67 EXPECT_FALSE(Some.isWrappedSet());
68 EXPECT_FALSE(Some.contains(APInt(16, 0x0)));
69 EXPECT_FALSE(Some.contains(APInt(16, 0x9)));
70 EXPECT_TRUE(Some.contains(APInt(16, 0xa)));
71 EXPECT_TRUE(Some.contains(APInt(16, 0xaa9)));
72 EXPECT_FALSE(Some.contains(APInt(16, 0xaaa)));
73
74 EXPECT_FALSE(Wrap.isFullSet());
75 EXPECT_FALSE(Wrap.isEmptySet());
76 EXPECT_TRUE(Wrap.isWrappedSet());
77 EXPECT_TRUE(Wrap.contains(APInt(16, 0x0)));
78 EXPECT_TRUE(Wrap.contains(APInt(16, 0x9)));
79 EXPECT_FALSE(Wrap.contains(APInt(16, 0xa)));
80 EXPECT_FALSE(Wrap.contains(APInt(16, 0xaa9)));
81 EXPECT_TRUE(Wrap.contains(APInt(16, 0xaaa)));
Nick Lewycky44b3e8d2009-07-11 18:43:20 +000082}
Dan Gohmana3755d82009-07-09 22:07:27 +000083
Nick Lewycky44b3e8d2009-07-11 18:43:20 +000084TEST_F(ConstantRangeTest, Equality) {
Nick Lewycky8211bec2009-09-05 18:27:40 +000085 EXPECT_EQ(Full, Full);
86 EXPECT_EQ(Empty, Empty);
87 EXPECT_EQ(One, One);
88 EXPECT_EQ(Some, Some);
89 EXPECT_EQ(Wrap, Wrap);
90 EXPECT_NE(Full, Empty);
91 EXPECT_NE(Full, One);
92 EXPECT_NE(Full, Some);
93 EXPECT_NE(Full, Wrap);
94 EXPECT_NE(Empty, One);
95 EXPECT_NE(Empty, Some);
96 EXPECT_NE(Empty, Wrap);
97 EXPECT_NE(One, Some);
98 EXPECT_NE(One, Wrap);
99 EXPECT_NE(Some, Wrap);
Nick Lewycky44b3e8d2009-07-11 18:43:20 +0000100}
Dan Gohmana3755d82009-07-09 22:07:27 +0000101
Nick Lewycky44b3e8d2009-07-11 18:43:20 +0000102TEST_F(ConstantRangeTest, SingleElement) {
Dan Gohmana3755d82009-07-09 22:07:27 +0000103 EXPECT_EQ(Full.getSingleElement(), static_cast<APInt *>(NULL));
104 EXPECT_EQ(Empty.getSingleElement(), static_cast<APInt *>(NULL));
105 EXPECT_EQ(*One.getSingleElement(), APInt(16, 0xa));
106 EXPECT_EQ(Some.getSingleElement(), static_cast<APInt *>(NULL));
107 EXPECT_EQ(Wrap.getSingleElement(), static_cast<APInt *>(NULL));
108
109 EXPECT_FALSE(Full.isSingleElement());
110 EXPECT_FALSE(Empty.isSingleElement());
111 EXPECT_TRUE(One.isSingleElement());
112 EXPECT_FALSE(Some.isSingleElement());
113 EXPECT_FALSE(Wrap.isSingleElement());
Nick Lewycky44b3e8d2009-07-11 18:43:20 +0000114}
Dan Gohmana3755d82009-07-09 22:07:27 +0000115
Nick Lewycky44b3e8d2009-07-11 18:43:20 +0000116TEST_F(ConstantRangeTest, GetSetSize) {
Dan Gohmana3755d82009-07-09 22:07:27 +0000117 EXPECT_EQ(Full.getSetSize(), APInt(16, 0));
118 EXPECT_EQ(Empty.getSetSize(), APInt(16, 0));
119 EXPECT_EQ(One.getSetSize(), APInt(16, 1));
120 EXPECT_EQ(Some.getSetSize(), APInt(16, 0xaa0));
121 EXPECT_EQ(Wrap.getSetSize(), APInt(16, 0x10000 - 0xaa0));
Nick Lewycky44b3e8d2009-07-11 18:43:20 +0000122}
Dan Gohmana3755d82009-07-09 22:07:27 +0000123
Nick Lewycky44b3e8d2009-07-11 18:43:20 +0000124TEST_F(ConstantRangeTest, GetMinsAndMaxes) {
Dan Gohmana3755d82009-07-09 22:07:27 +0000125 EXPECT_EQ(Full.getUnsignedMax(), APInt(16, UINT16_MAX));
126 EXPECT_EQ(One.getUnsignedMax(), APInt(16, 0xa));
127 EXPECT_EQ(Some.getUnsignedMax(), APInt(16, 0xaa9));
128 EXPECT_EQ(Wrap.getUnsignedMax(), APInt(16, UINT16_MAX));
129
130 EXPECT_EQ(Full.getUnsignedMin(), APInt(16, 0));
131 EXPECT_EQ(One.getUnsignedMin(), APInt(16, 0xa));
132 EXPECT_EQ(Some.getUnsignedMin(), APInt(16, 0xa));
133 EXPECT_EQ(Wrap.getUnsignedMin(), APInt(16, 0));
134
135 EXPECT_EQ(Full.getSignedMax(), APInt(16, INT16_MAX));
136 EXPECT_EQ(One.getSignedMax(), APInt(16, 0xa));
137 EXPECT_EQ(Some.getSignedMax(), APInt(16, 0xaa9));
138 EXPECT_EQ(Wrap.getSignedMax(), APInt(16, INT16_MAX));
139
Ryan Flynnb714c082009-07-22 16:17:36 +0000140 EXPECT_EQ(Full.getSignedMin(), APInt(16, (uint64_t)INT16_MIN));
Dan Gohmana3755d82009-07-09 22:07:27 +0000141 EXPECT_EQ(One.getSignedMin(), APInt(16, 0xa));
142 EXPECT_EQ(Some.getSignedMin(), APInt(16, 0xa));
Ryan Flynnb714c082009-07-22 16:17:36 +0000143 EXPECT_EQ(Wrap.getSignedMin(), APInt(16, (uint64_t)INT16_MIN));
Nick Lewycky780905e2009-07-13 04:50:21 +0000144
145 // Found by Klee
146 EXPECT_EQ(ConstantRange(APInt(4, 7), APInt(4, 0)).getSignedMax(),
147 APInt(4, 7));
Nick Lewycky44b3e8d2009-07-11 18:43:20 +0000148}
Dan Gohmana3755d82009-07-09 22:07:27 +0000149
Nick Lewycky32cda112010-09-06 23:52:49 +0000150TEST_F(ConstantRangeTest, SignWrapped) {
151 EXPECT_TRUE(Full.isSignWrappedSet());
152 EXPECT_FALSE(Empty.isSignWrappedSet());
153 EXPECT_FALSE(One.isSignWrappedSet());
154 EXPECT_FALSE(Some.isSignWrappedSet());
155 EXPECT_TRUE(Wrap.isSignWrappedSet());
156
157 EXPECT_FALSE(ConstantRange(APInt(8, 127), APInt(8, 128)).isSignWrappedSet());
158 EXPECT_TRUE(ConstantRange(APInt(8, 127), APInt(8, 129)).isSignWrappedSet());
159 EXPECT_FALSE(ConstantRange(APInt(8, 128), APInt(8, 129)).isSignWrappedSet());
160 EXPECT_TRUE(ConstantRange(APInt(8, 10), APInt(8, 9)).isSignWrappedSet());
161 EXPECT_TRUE(ConstantRange(APInt(8, 10), APInt(8, 250)).isSignWrappedSet());
162 EXPECT_FALSE(ConstantRange(APInt(8, 250), APInt(8, 10)).isSignWrappedSet());
163 EXPECT_FALSE(ConstantRange(APInt(8, 250), APInt(8, 251)).isSignWrappedSet());
164}
165
Nick Lewycky44b3e8d2009-07-11 18:43:20 +0000166TEST_F(ConstantRangeTest, Trunc) {
Dan Gohmana3755d82009-07-09 22:07:27 +0000167 ConstantRange TFull = Full.truncate(10);
168 ConstantRange TEmpty = Empty.truncate(10);
169 ConstantRange TOne = One.truncate(10);
170 ConstantRange TSome = Some.truncate(10);
171 ConstantRange TWrap = Wrap.truncate(10);
172 EXPECT_TRUE(TFull.isFullSet());
173 EXPECT_TRUE(TEmpty.isEmptySet());
Jay Foad40f8f622010-12-07 08:25:19 +0000174 EXPECT_EQ(TOne, ConstantRange(One.getLower().trunc(10),
175 One.getUpper().trunc(10)));
Dan Gohmana3755d82009-07-09 22:07:27 +0000176 EXPECT_TRUE(TSome.isFullSet());
Nick Lewycky44b3e8d2009-07-11 18:43:20 +0000177}
Dan Gohmana3755d82009-07-09 22:07:27 +0000178
Nick Lewycky44b3e8d2009-07-11 18:43:20 +0000179TEST_F(ConstantRangeTest, ZExt) {
Dan Gohmana3755d82009-07-09 22:07:27 +0000180 ConstantRange ZFull = Full.zeroExtend(20);
181 ConstantRange ZEmpty = Empty.zeroExtend(20);
182 ConstantRange ZOne = One.zeroExtend(20);
183 ConstantRange ZSome = Some.zeroExtend(20);
184 ConstantRange ZWrap = Wrap.zeroExtend(20);
Nick Lewycky8211bec2009-09-05 18:27:40 +0000185 EXPECT_EQ(ZFull, ConstantRange(APInt(20, 0), APInt(20, 0x10000)));
Dan Gohmana3755d82009-07-09 22:07:27 +0000186 EXPECT_TRUE(ZEmpty.isEmptySet());
Jay Foad40f8f622010-12-07 08:25:19 +0000187 EXPECT_EQ(ZOne, ConstantRange(One.getLower().zext(20),
188 One.getUpper().zext(20)));
189 EXPECT_EQ(ZSome, ConstantRange(Some.getLower().zext(20),
190 Some.getUpper().zext(20)));
Nick Lewycky32cda112010-09-06 23:52:49 +0000191 EXPECT_EQ(ZWrap, ConstantRange(APInt(20, 0), APInt(20, 0x10000)));
Nick Lewycky44b3e8d2009-07-11 18:43:20 +0000192}
Dan Gohmana3755d82009-07-09 22:07:27 +0000193
Nick Lewycky44b3e8d2009-07-11 18:43:20 +0000194TEST_F(ConstantRangeTest, SExt) {
Dan Gohmana3755d82009-07-09 22:07:27 +0000195 ConstantRange SFull = Full.signExtend(20);
196 ConstantRange SEmpty = Empty.signExtend(20);
197 ConstantRange SOne = One.signExtend(20);
198 ConstantRange SSome = Some.signExtend(20);
199 ConstantRange SWrap = Wrap.signExtend(20);
Nick Lewycky8211bec2009-09-05 18:27:40 +0000200 EXPECT_EQ(SFull, ConstantRange(APInt(20, (uint64_t)INT16_MIN, true),
201 APInt(20, INT16_MAX + 1, true)));
Dan Gohmana3755d82009-07-09 22:07:27 +0000202 EXPECT_TRUE(SEmpty.isEmptySet());
Jay Foad40f8f622010-12-07 08:25:19 +0000203 EXPECT_EQ(SOne, ConstantRange(One.getLower().sext(20),
204 One.getUpper().sext(20)));
205 EXPECT_EQ(SSome, ConstantRange(Some.getLower().sext(20),
206 Some.getUpper().sext(20)));
Nick Lewycky32cda112010-09-06 23:52:49 +0000207 EXPECT_EQ(SWrap, ConstantRange(APInt(20, (uint64_t)INT16_MIN, true),
208 APInt(20, INT16_MAX + 1, true)));
209
210 EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, 140)).signExtend(16),
211 ConstantRange(APInt(16, -128), APInt(16, 128)));
Nick Lewycky44b3e8d2009-07-11 18:43:20 +0000212}
213
214TEST_F(ConstantRangeTest, IntersectWith) {
Nick Lewycky8211bec2009-09-05 18:27:40 +0000215 EXPECT_EQ(Empty.intersectWith(Full), Empty);
216 EXPECT_EQ(Empty.intersectWith(Empty), Empty);
217 EXPECT_EQ(Empty.intersectWith(One), Empty);
218 EXPECT_EQ(Empty.intersectWith(Some), Empty);
219 EXPECT_EQ(Empty.intersectWith(Wrap), Empty);
220 EXPECT_EQ(Full.intersectWith(Full), Full);
221 EXPECT_EQ(Some.intersectWith(Some), Some);
222 EXPECT_EQ(Some.intersectWith(One), One);
223 EXPECT_EQ(Full.intersectWith(One), One);
224 EXPECT_EQ(Full.intersectWith(Some), Some);
225 EXPECT_EQ(Some.intersectWith(Wrap), Empty);
226 EXPECT_EQ(One.intersectWith(Wrap), Empty);
227 EXPECT_EQ(One.intersectWith(Wrap), Wrap.intersectWith(One));
Dan Gohmana3755d82009-07-09 22:07:27 +0000228
Nick Lewycky3a4a8842009-07-18 06:34:42 +0000229 // Klee generated testcase from PR4545.
230 // The intersection of i16 [4, 2) and [6, 5) is disjoint, looking like
231 // 01..4.6789ABCDEF where the dots represent values not in the intersection.
232 ConstantRange LHS(APInt(16, 4), APInt(16, 2));
233 ConstantRange RHS(APInt(16, 6), APInt(16, 5));
Chris Lattner8142ce52009-08-23 06:32:25 +0000234 EXPECT_TRUE(LHS.intersectWith(RHS) == LHS);
Nuno Lopesfbb7a732012-05-18 00:14:36 +0000235
236 // previous bug: intersection of [min, 3) and [2, max) should be 2
Nuno Lopes532516a2012-06-28 00:59:33 +0000237 LHS = ConstantRange(APInt(32, -2147483646), APInt(32, 3));
238 RHS = ConstantRange(APInt(32, 2), APInt(32, 2147483646));
Nuno Lopesfbb7a732012-05-18 00:14:36 +0000239 EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 2)));
Nuno Lopes532516a2012-06-28 00:59:33 +0000240
241 // [2, 0) /\ [4, 3) = [2, 0)
242 LHS = ConstantRange(APInt(32, 2), APInt(32, 0));
243 RHS = ConstantRange(APInt(32, 4), APInt(32, 3));
244 EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 2), APInt(32, 0)));
245
246 // [2, 0) /\ [4, 2) = [4, 0)
247 LHS = ConstantRange(APInt(32, 2), APInt(32, 0));
248 RHS = ConstantRange(APInt(32, 4), APInt(32, 2));
249 EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 4), APInt(32, 0)));
250
251 // [4, 2) /\ [5, 1) = [5, 1)
252 LHS = ConstantRange(APInt(32, 4), APInt(32, 2));
253 RHS = ConstantRange(APInt(32, 5), APInt(32, 1));
254 EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 5), APInt(32, 1)));
255
256 // [2, 0) /\ [7, 4) = [7, 4)
257 LHS = ConstantRange(APInt(32, 2), APInt(32, 0));
258 RHS = ConstantRange(APInt(32, 7), APInt(32, 4));
259 EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 7), APInt(32, 4)));
260
261 // [4, 2) /\ [1, 0) = [1, 0)
262 LHS = ConstantRange(APInt(32, 4), APInt(32, 2));
263 RHS = ConstantRange(APInt(32, 1), APInt(32, 0));
264 EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 4), APInt(32, 2)));
265
266 // [15, 0) /\ [7, 6) = [15, 0)
267 LHS = ConstantRange(APInt(32, 15), APInt(32, 0));
268 RHS = ConstantRange(APInt(32, 7), APInt(32, 6));
269 EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 15), APInt(32, 0)));
Nick Lewycky44b3e8d2009-07-11 18:43:20 +0000270}
Dan Gohmana3755d82009-07-09 22:07:27 +0000271
Nick Lewycky44b3e8d2009-07-11 18:43:20 +0000272TEST_F(ConstantRangeTest, UnionWith) {
Nick Lewycky8211bec2009-09-05 18:27:40 +0000273 EXPECT_EQ(Wrap.unionWith(One),
274 ConstantRange(APInt(16, 0xaaa), APInt(16, 0xb)));
275 EXPECT_EQ(One.unionWith(Wrap), Wrap.unionWith(One));
276 EXPECT_EQ(Empty.unionWith(Empty), Empty);
277 EXPECT_EQ(Full.unionWith(Full), Full);
278 EXPECT_EQ(Some.unionWith(Wrap), Full);
Nick Lewycky7e7dc452009-07-19 03:44:35 +0000279
280 // PR4545
Nick Lewycky8211bec2009-09-05 18:27:40 +0000281 EXPECT_EQ(ConstantRange(APInt(16, 14), APInt(16, 1)).unionWith(
282 ConstantRange(APInt(16, 0), APInt(16, 8))),
283 ConstantRange(APInt(16, 14), APInt(16, 8)));
284 EXPECT_EQ(ConstantRange(APInt(16, 6), APInt(16, 4)).unionWith(
285 ConstantRange(APInt(16, 4), APInt(16, 0))),
Chris Lattner8142ce52009-08-23 06:32:25 +0000286 ConstantRange(16));
Nick Lewycky8211bec2009-09-05 18:27:40 +0000287 EXPECT_EQ(ConstantRange(APInt(16, 1), APInt(16, 0)).unionWith(
288 ConstantRange(APInt(16, 2), APInt(16, 1))),
Chris Lattner8142ce52009-08-23 06:32:25 +0000289 ConstantRange(16));
Nick Lewycky44b3e8d2009-07-11 18:43:20 +0000290}
Dan Gohmana3755d82009-07-09 22:07:27 +0000291
Nick Lewycky44b3e8d2009-07-11 18:43:20 +0000292TEST_F(ConstantRangeTest, SubtractAPInt) {
Nick Lewycky8211bec2009-09-05 18:27:40 +0000293 EXPECT_EQ(Full.subtract(APInt(16, 4)), Full);
294 EXPECT_EQ(Empty.subtract(APInt(16, 4)), Empty);
295 EXPECT_EQ(Some.subtract(APInt(16, 4)),
296 ConstantRange(APInt(16, 0x6), APInt(16, 0xaa6)));
297 EXPECT_EQ(Wrap.subtract(APInt(16, 4)),
298 ConstantRange(APInt(16, 0xaa6), APInt(16, 0x6)));
299 EXPECT_EQ(One.subtract(APInt(16, 4)),
300 ConstantRange(APInt(16, 0x6)));
Nick Lewycky44b3e8d2009-07-11 18:43:20 +0000301}
Dan Gohmana3755d82009-07-09 22:07:27 +0000302
Nick Lewycky44b3e8d2009-07-11 18:43:20 +0000303TEST_F(ConstantRangeTest, Add) {
Nick Lewycky8211bec2009-09-05 18:27:40 +0000304 EXPECT_EQ(Full.add(APInt(16, 4)), Full);
305 EXPECT_EQ(Full.add(Full), Full);
306 EXPECT_EQ(Full.add(Empty), Empty);
307 EXPECT_EQ(Full.add(One), Full);
308 EXPECT_EQ(Full.add(Some), Full);
309 EXPECT_EQ(Full.add(Wrap), Full);
310 EXPECT_EQ(Empty.add(Empty), Empty);
311 EXPECT_EQ(Empty.add(One), Empty);
312 EXPECT_EQ(Empty.add(Some), Empty);
313 EXPECT_EQ(Empty.add(Wrap), Empty);
314 EXPECT_EQ(Empty.add(APInt(16, 4)), Empty);
315 EXPECT_EQ(Some.add(APInt(16, 4)),
Nick Lewycky7f9ef4b2010-08-11 22:04:36 +0000316 ConstantRange(APInt(16, 0xe), APInt(16, 0xaae)));
Nick Lewycky8211bec2009-09-05 18:27:40 +0000317 EXPECT_EQ(Wrap.add(APInt(16, 4)),
Nick Lewycky7f9ef4b2010-08-11 22:04:36 +0000318 ConstantRange(APInt(16, 0xaae), APInt(16, 0xe)));
Nick Lewycky8211bec2009-09-05 18:27:40 +0000319 EXPECT_EQ(One.add(APInt(16, 4)),
Nick Lewycky7f9ef4b2010-08-11 22:04:36 +0000320 ConstantRange(APInt(16, 0xe)));
321}
322
323TEST_F(ConstantRangeTest, Sub) {
324 EXPECT_EQ(Full.sub(APInt(16, 4)), Full);
325 EXPECT_EQ(Full.sub(Full), Full);
326 EXPECT_EQ(Full.sub(Empty), Empty);
327 EXPECT_EQ(Full.sub(One), Full);
328 EXPECT_EQ(Full.sub(Some), Full);
329 EXPECT_EQ(Full.sub(Wrap), Full);
330 EXPECT_EQ(Empty.sub(Empty), Empty);
331 EXPECT_EQ(Empty.sub(One), Empty);
332 EXPECT_EQ(Empty.sub(Some), Empty);
333 EXPECT_EQ(Empty.sub(Wrap), Empty);
334 EXPECT_EQ(Empty.sub(APInt(16, 4)), Empty);
335 EXPECT_EQ(Some.sub(APInt(16, 4)),
336 ConstantRange(APInt(16, 0x6), APInt(16, 0xaa6)));
Nick Lewyckye6240e82011-06-22 21:13:46 +0000337 EXPECT_EQ(Some.sub(Some),
338 ConstantRange(APInt(16, 0xf561), APInt(16, 0xaa0)));
Nick Lewycky7f9ef4b2010-08-11 22:04:36 +0000339 EXPECT_EQ(Wrap.sub(APInt(16, 4)),
340 ConstantRange(APInt(16, 0xaa6), APInt(16, 0x6)));
341 EXPECT_EQ(One.sub(APInt(16, 4)),
342 ConstantRange(APInt(16, 0x6)));
Nick Lewycky44b3e8d2009-07-11 18:43:20 +0000343}
Dan Gohmana3755d82009-07-09 22:07:27 +0000344
Nick Lewycky44b3e8d2009-07-11 18:43:20 +0000345TEST_F(ConstantRangeTest, Multiply) {
Nick Lewycky8211bec2009-09-05 18:27:40 +0000346 EXPECT_EQ(Full.multiply(Full), Full);
347 EXPECT_EQ(Full.multiply(Empty), Empty);
348 EXPECT_EQ(Full.multiply(One), Full);
349 EXPECT_EQ(Full.multiply(Some), Full);
350 EXPECT_EQ(Full.multiply(Wrap), Full);
351 EXPECT_EQ(Empty.multiply(Empty), Empty);
352 EXPECT_EQ(Empty.multiply(One), Empty);
353 EXPECT_EQ(Empty.multiply(Some), Empty);
354 EXPECT_EQ(Empty.multiply(Wrap), Empty);
355 EXPECT_EQ(One.multiply(One), ConstantRange(APInt(16, 0xa*0xa),
356 APInt(16, 0xa*0xa + 1)));
357 EXPECT_EQ(One.multiply(Some), ConstantRange(APInt(16, 0xa*0xa),
358 APInt(16, 0xa*0xaa9 + 1)));
359 EXPECT_EQ(One.multiply(Wrap), Full);
360 EXPECT_EQ(Some.multiply(Some), Full);
361 EXPECT_EQ(Some.multiply(Wrap), Full);
362 EXPECT_EQ(Wrap.multiply(Wrap), Full);
Nick Lewyckyf1db1202009-07-13 03:27:41 +0000363
364 // http://llvm.org/PR4545
Nick Lewycky8211bec2009-09-05 18:27:40 +0000365 EXPECT_EQ(ConstantRange(APInt(4, 1), APInt(4, 6)).multiply(
366 ConstantRange(APInt(4, 6), APInt(4, 2))),
367 ConstantRange(4, /*isFullSet=*/true));
Nick Lewycky44b3e8d2009-07-11 18:43:20 +0000368}
Dan Gohmana3755d82009-07-09 22:07:27 +0000369
Nick Lewycky44b3e8d2009-07-11 18:43:20 +0000370TEST_F(ConstantRangeTest, UMax) {
Nick Lewycky8211bec2009-09-05 18:27:40 +0000371 EXPECT_EQ(Full.umax(Full), Full);
372 EXPECT_EQ(Full.umax(Empty), Empty);
373 EXPECT_EQ(Full.umax(Some), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
374 EXPECT_EQ(Full.umax(Wrap), Full);
375 EXPECT_EQ(Full.umax(Some), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
376 EXPECT_EQ(Empty.umax(Empty), Empty);
377 EXPECT_EQ(Empty.umax(Some), Empty);
378 EXPECT_EQ(Empty.umax(Wrap), Empty);
379 EXPECT_EQ(Empty.umax(One), Empty);
380 EXPECT_EQ(Some.umax(Some), Some);
381 EXPECT_EQ(Some.umax(Wrap), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
382 EXPECT_EQ(Some.umax(One), Some);
Nick Lewycky44b3e8d2009-07-11 18:43:20 +0000383 // TODO: ConstantRange is currently over-conservative here.
Nick Lewycky8211bec2009-09-05 18:27:40 +0000384 EXPECT_EQ(Wrap.umax(Wrap), Full);
385 EXPECT_EQ(Wrap.umax(One), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
386 EXPECT_EQ(One.umax(One), One);
Nick Lewycky44b3e8d2009-07-11 18:43:20 +0000387}
388
389TEST_F(ConstantRangeTest, SMax) {
Nick Lewycky8211bec2009-09-05 18:27:40 +0000390 EXPECT_EQ(Full.smax(Full), Full);
391 EXPECT_EQ(Full.smax(Empty), Empty);
392 EXPECT_EQ(Full.smax(Some), ConstantRange(APInt(16, 0xa),
393 APInt::getSignedMinValue(16)));
394 EXPECT_EQ(Full.smax(Wrap), Full);
395 EXPECT_EQ(Full.smax(One), ConstantRange(APInt(16, 0xa),
396 APInt::getSignedMinValue(16)));
397 EXPECT_EQ(Empty.smax(Empty), Empty);
398 EXPECT_EQ(Empty.smax(Some), Empty);
399 EXPECT_EQ(Empty.smax(Wrap), Empty);
400 EXPECT_EQ(Empty.smax(One), Empty);
401 EXPECT_EQ(Some.smax(Some), Some);
402 EXPECT_EQ(Some.smax(Wrap), ConstantRange(APInt(16, 0xa),
403 APInt(16, (uint64_t)INT16_MIN)));
404 EXPECT_EQ(Some.smax(One), Some);
405 EXPECT_EQ(Wrap.smax(One), ConstantRange(APInt(16, 0xa),
406 APInt(16, (uint64_t)INT16_MIN)));
407 EXPECT_EQ(One.smax(One), One);
Nick Lewycky44b3e8d2009-07-11 18:43:20 +0000408}
Dan Gohmana3755d82009-07-09 22:07:27 +0000409
Nick Lewycky44b3e8d2009-07-11 18:43:20 +0000410TEST_F(ConstantRangeTest, UDiv) {
Nick Lewycky8211bec2009-09-05 18:27:40 +0000411 EXPECT_EQ(Full.udiv(Full), Full);
412 EXPECT_EQ(Full.udiv(Empty), Empty);
413 EXPECT_EQ(Full.udiv(One), ConstantRange(APInt(16, 0),
414 APInt(16, 0xffff / 0xa + 1)));
415 EXPECT_EQ(Full.udiv(Some), ConstantRange(APInt(16, 0),
416 APInt(16, 0xffff / 0xa + 1)));
417 EXPECT_EQ(Full.udiv(Wrap), Full);
418 EXPECT_EQ(Empty.udiv(Empty), Empty);
419 EXPECT_EQ(Empty.udiv(One), Empty);
420 EXPECT_EQ(Empty.udiv(Some), Empty);
421 EXPECT_EQ(Empty.udiv(Wrap), Empty);
422 EXPECT_EQ(One.udiv(One), ConstantRange(APInt(16, 1)));
423 EXPECT_EQ(One.udiv(Some), ConstantRange(APInt(16, 0), APInt(16, 2)));
424 EXPECT_EQ(One.udiv(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
425 EXPECT_EQ(Some.udiv(Some), ConstantRange(APInt(16, 0), APInt(16, 0x111)));
426 EXPECT_EQ(Some.udiv(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
427 EXPECT_EQ(Wrap.udiv(Wrap), Full);
Dan Gohmana3755d82009-07-09 22:07:27 +0000428}
429
Nick Lewycky7f9ef4b2010-08-11 22:04:36 +0000430TEST_F(ConstantRangeTest, Shl) {
431 EXPECT_EQ(Full.shl(Full), Full);
432 EXPECT_EQ(Full.shl(Empty), Empty);
433 EXPECT_EQ(Full.shl(One), Full); // TODO: [0, (-1 << 0xa) + 1)
434 EXPECT_EQ(Full.shl(Some), Full); // TODO: [0, (-1 << 0xa) + 1)
435 EXPECT_EQ(Full.shl(Wrap), Full);
436 EXPECT_EQ(Empty.shl(Empty), Empty);
437 EXPECT_EQ(Empty.shl(One), Empty);
438 EXPECT_EQ(Empty.shl(Some), Empty);
439 EXPECT_EQ(Empty.shl(Wrap), Empty);
440 EXPECT_EQ(One.shl(One), ConstantRange(APInt(16, 0xa << 0xa),
441 APInt(16, (0xa << 0xa) + 1)));
442 EXPECT_EQ(One.shl(Some), Full); // TODO: [0xa << 0xa, 0)
443 EXPECT_EQ(One.shl(Wrap), Full); // TODO: [0xa, 0xa << 14 + 1)
444 EXPECT_EQ(Some.shl(Some), Full); // TODO: [0xa << 0xa, 0xfc01)
445 EXPECT_EQ(Some.shl(Wrap), Full); // TODO: [0xa, 0x7ff << 0x5 + 1)
446 EXPECT_EQ(Wrap.shl(Wrap), Full);
447}
448
449TEST_F(ConstantRangeTest, Lshr) {
450 EXPECT_EQ(Full.lshr(Full), Full);
451 EXPECT_EQ(Full.lshr(Empty), Empty);
452 EXPECT_EQ(Full.lshr(One), ConstantRange(APInt(16, 0),
453 APInt(16, (0xffff >> 0xa) + 1)));
454 EXPECT_EQ(Full.lshr(Some), ConstantRange(APInt(16, 0),
455 APInt(16, (0xffff >> 0xa) + 1)));
456 EXPECT_EQ(Full.lshr(Wrap), Full);
457 EXPECT_EQ(Empty.lshr(Empty), Empty);
458 EXPECT_EQ(Empty.lshr(One), Empty);
459 EXPECT_EQ(Empty.lshr(Some), Empty);
460 EXPECT_EQ(Empty.lshr(Wrap), Empty);
461 EXPECT_EQ(One.lshr(One), ConstantRange(APInt(16, 0)));
462 EXPECT_EQ(One.lshr(Some), ConstantRange(APInt(16, 0)));
463 EXPECT_EQ(One.lshr(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
464 EXPECT_EQ(Some.lshr(Some), ConstantRange(APInt(16, 0),
465 APInt(16, (0xaaa >> 0xa) + 1)));
466 EXPECT_EQ(Some.lshr(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
467 EXPECT_EQ(Wrap.lshr(Wrap), Full);
468}
469
Nick Lewyckyf2d7b7c2010-09-28 18:18:36 +0000470TEST(ConstantRange, MakeICmpRegion) {
471 // PR8250
472 ConstantRange SMax = ConstantRange(APInt::getSignedMaxValue(32));
473 EXPECT_TRUE(ConstantRange::makeICmpRegion(ICmpInst::ICMP_SGT,
474 SMax).isEmptySet());
475}
476
Dan Gohmana3755d82009-07-09 22:07:27 +0000477} // anonymous namespace