blob: a03b7680d29aab4577fc9d88e97ed26a92f7aef0 [file] [log] [blame]
Chandler Carruth8cd041e2014-03-04 12:24:34 +00001//===- ConstantRangeTest.cpp - ConstantRange tests ------------------------===//
Dan Gohman5035fbf2009-07-09 22:07:27 +00002//
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
Chandler Carruth8cd041e2014-03-04 12:24:34 +000010#include "llvm/IR/ConstantRange.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000011#include "llvm/IR/Instructions.h"
Sanjoy Das6ed05302015-10-22 03:12:57 +000012#include "llvm/IR/Operator.h"
Dan Gohman5035fbf2009-07-09 22:07:27 +000013#include "gtest/gtest.h"
14
15using namespace llvm;
16
17namespace {
18
Nick Lewycky17a4fa82009-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 Gohman5035fbf2009-07-09 22:07:27 +000027
Nick Lewycky17a4fa82009-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 Gohman5035fbf2009-07-09 22:07:27 +000035 EXPECT_TRUE(Full.isFullSet());
36 EXPECT_FALSE(Full.isEmptySet());
Owen Anderson1a9078b2010-08-07 05:47:46 +000037 EXPECT_TRUE(Full.inverse().isEmptySet());
Dan Gohman5035fbf2009-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 Anderson1a9078b2010-08-07 05:47:46 +000047 EXPECT_TRUE(Empty.inverse().isFullSet());
Dan Gohman5035fbf2009-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 Anderson1a9078b2010-08-07 05:47:46 +000063 EXPECT_FALSE(One.inverse().contains(APInt(16, 0xa)));
Dan Gohman5035fbf2009-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 Lewycky17a4fa82009-07-11 18:43:20 +000082}
Dan Gohman5035fbf2009-07-09 22:07:27 +000083
Nick Lewycky17a4fa82009-07-11 18:43:20 +000084TEST_F(ConstantRangeTest, Equality) {
Nick Lewyckyd5923992009-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 Lewycky17a4fa82009-07-11 18:43:20 +0000100}
Dan Gohman5035fbf2009-07-09 22:07:27 +0000101
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000102TEST_F(ConstantRangeTest, SingleElement) {
Craig Topper66f09ad2014-06-08 22:29:17 +0000103 EXPECT_EQ(Full.getSingleElement(), static_cast<APInt *>(nullptr));
104 EXPECT_EQ(Empty.getSingleElement(), static_cast<APInt *>(nullptr));
Sanjoy Dasc7d32912016-10-02 20:59:05 +0000105 EXPECT_EQ(Full.getSingleMissingElement(), static_cast<APInt *>(nullptr));
106 EXPECT_EQ(Empty.getSingleMissingElement(), static_cast<APInt *>(nullptr));
107
Dan Gohman5035fbf2009-07-09 22:07:27 +0000108 EXPECT_EQ(*One.getSingleElement(), APInt(16, 0xa));
Craig Topper66f09ad2014-06-08 22:29:17 +0000109 EXPECT_EQ(Some.getSingleElement(), static_cast<APInt *>(nullptr));
110 EXPECT_EQ(Wrap.getSingleElement(), static_cast<APInt *>(nullptr));
Dan Gohman5035fbf2009-07-09 22:07:27 +0000111
Sanjoy Dasc7d32912016-10-02 20:59:05 +0000112 EXPECT_EQ(One.getSingleMissingElement(), static_cast<APInt *>(nullptr));
113 EXPECT_EQ(Some.getSingleMissingElement(), static_cast<APInt *>(nullptr));
114
115 ConstantRange OneInverse = One.inverse();
116 EXPECT_EQ(*OneInverse.getSingleMissingElement(), *One.getSingleElement());
117
Dan Gohman5035fbf2009-07-09 22:07:27 +0000118 EXPECT_FALSE(Full.isSingleElement());
119 EXPECT_FALSE(Empty.isSingleElement());
120 EXPECT_TRUE(One.isSingleElement());
121 EXPECT_FALSE(Some.isSingleElement());
122 EXPECT_FALSE(Wrap.isSingleElement());
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000123}
Dan Gohman5035fbf2009-07-09 22:07:27 +0000124
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000125TEST_F(ConstantRangeTest, GetSetSize) {
Nuno Lopes99504c52012-07-16 18:08:12 +0000126 EXPECT_EQ(Full.getSetSize(), APInt(17, 65536));
127 EXPECT_EQ(Empty.getSetSize(), APInt(17, 0));
128 EXPECT_EQ(One.getSetSize(), APInt(17, 1));
129 EXPECT_EQ(Some.getSetSize(), APInt(17, 0xaa0));
130
131 ConstantRange Wrap(APInt(4, 7), APInt(4, 3));
132 ConstantRange Wrap2(APInt(4, 8), APInt(4, 7));
133 EXPECT_EQ(Wrap.getSetSize(), APInt(5, 12));
134 EXPECT_EQ(Wrap2.getSetSize(), APInt(5, 15));
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000135}
Dan Gohman5035fbf2009-07-09 22:07:27 +0000136
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000137TEST_F(ConstantRangeTest, GetMinsAndMaxes) {
Dan Gohman5035fbf2009-07-09 22:07:27 +0000138 EXPECT_EQ(Full.getUnsignedMax(), APInt(16, UINT16_MAX));
139 EXPECT_EQ(One.getUnsignedMax(), APInt(16, 0xa));
140 EXPECT_EQ(Some.getUnsignedMax(), APInt(16, 0xaa9));
141 EXPECT_EQ(Wrap.getUnsignedMax(), APInt(16, UINT16_MAX));
142
143 EXPECT_EQ(Full.getUnsignedMin(), APInt(16, 0));
144 EXPECT_EQ(One.getUnsignedMin(), APInt(16, 0xa));
145 EXPECT_EQ(Some.getUnsignedMin(), APInt(16, 0xa));
146 EXPECT_EQ(Wrap.getUnsignedMin(), APInt(16, 0));
147
148 EXPECT_EQ(Full.getSignedMax(), APInt(16, INT16_MAX));
149 EXPECT_EQ(One.getSignedMax(), APInt(16, 0xa));
150 EXPECT_EQ(Some.getSignedMax(), APInt(16, 0xaa9));
151 EXPECT_EQ(Wrap.getSignedMax(), APInt(16, INT16_MAX));
152
Ryan Flynna845ef02009-07-22 16:17:36 +0000153 EXPECT_EQ(Full.getSignedMin(), APInt(16, (uint64_t)INT16_MIN));
Dan Gohman5035fbf2009-07-09 22:07:27 +0000154 EXPECT_EQ(One.getSignedMin(), APInt(16, 0xa));
155 EXPECT_EQ(Some.getSignedMin(), APInt(16, 0xa));
Ryan Flynna845ef02009-07-22 16:17:36 +0000156 EXPECT_EQ(Wrap.getSignedMin(), APInt(16, (uint64_t)INT16_MIN));
Nick Lewycky571bf542009-07-13 04:50:21 +0000157
158 // Found by Klee
159 EXPECT_EQ(ConstantRange(APInt(4, 7), APInt(4, 0)).getSignedMax(),
160 APInt(4, 7));
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000161}
Dan Gohman5035fbf2009-07-09 22:07:27 +0000162
Nick Lewyckya35462d2010-09-06 23:52:49 +0000163TEST_F(ConstantRangeTest, SignWrapped) {
164 EXPECT_TRUE(Full.isSignWrappedSet());
165 EXPECT_FALSE(Empty.isSignWrappedSet());
166 EXPECT_FALSE(One.isSignWrappedSet());
167 EXPECT_FALSE(Some.isSignWrappedSet());
168 EXPECT_TRUE(Wrap.isSignWrappedSet());
169
170 EXPECT_FALSE(ConstantRange(APInt(8, 127), APInt(8, 128)).isSignWrappedSet());
171 EXPECT_TRUE(ConstantRange(APInt(8, 127), APInt(8, 129)).isSignWrappedSet());
172 EXPECT_FALSE(ConstantRange(APInt(8, 128), APInt(8, 129)).isSignWrappedSet());
173 EXPECT_TRUE(ConstantRange(APInt(8, 10), APInt(8, 9)).isSignWrappedSet());
174 EXPECT_TRUE(ConstantRange(APInt(8, 10), APInt(8, 250)).isSignWrappedSet());
175 EXPECT_FALSE(ConstantRange(APInt(8, 250), APInt(8, 10)).isSignWrappedSet());
176 EXPECT_FALSE(ConstantRange(APInt(8, 250), APInt(8, 251)).isSignWrappedSet());
177}
178
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000179TEST_F(ConstantRangeTest, Trunc) {
Dan Gohman5035fbf2009-07-09 22:07:27 +0000180 ConstantRange TFull = Full.truncate(10);
181 ConstantRange TEmpty = Empty.truncate(10);
182 ConstantRange TOne = One.truncate(10);
183 ConstantRange TSome = Some.truncate(10);
184 ConstantRange TWrap = Wrap.truncate(10);
185 EXPECT_TRUE(TFull.isFullSet());
186 EXPECT_TRUE(TEmpty.isEmptySet());
Jay Foad583abbc2010-12-07 08:25:19 +0000187 EXPECT_EQ(TOne, ConstantRange(One.getLower().trunc(10),
188 One.getUpper().trunc(10)));
Dan Gohman5035fbf2009-07-09 22:07:27 +0000189 EXPECT_TRUE(TSome.isFullSet());
Craig Topper2df639e2017-06-04 23:03:52 +0000190 EXPECT_TRUE(TWrap.isFullSet());
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000191}
Dan Gohman5035fbf2009-07-09 22:07:27 +0000192
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000193TEST_F(ConstantRangeTest, ZExt) {
Dan Gohman5035fbf2009-07-09 22:07:27 +0000194 ConstantRange ZFull = Full.zeroExtend(20);
195 ConstantRange ZEmpty = Empty.zeroExtend(20);
196 ConstantRange ZOne = One.zeroExtend(20);
197 ConstantRange ZSome = Some.zeroExtend(20);
198 ConstantRange ZWrap = Wrap.zeroExtend(20);
Nick Lewyckyd5923992009-09-05 18:27:40 +0000199 EXPECT_EQ(ZFull, ConstantRange(APInt(20, 0), APInt(20, 0x10000)));
Dan Gohman5035fbf2009-07-09 22:07:27 +0000200 EXPECT_TRUE(ZEmpty.isEmptySet());
Jay Foad583abbc2010-12-07 08:25:19 +0000201 EXPECT_EQ(ZOne, ConstantRange(One.getLower().zext(20),
202 One.getUpper().zext(20)));
203 EXPECT_EQ(ZSome, ConstantRange(Some.getLower().zext(20),
204 Some.getUpper().zext(20)));
Nick Lewyckya35462d2010-09-06 23:52:49 +0000205 EXPECT_EQ(ZWrap, ConstantRange(APInt(20, 0), APInt(20, 0x10000)));
Nuno Lopeseb9d2752012-07-23 20:33:29 +0000206
207 // zext([5, 0), 3->7) = [5, 8)
208 ConstantRange FiveZero(APInt(3, 5), APInt(3, 0));
209 EXPECT_EQ(FiveZero.zeroExtend(7), ConstantRange(APInt(7, 5), APInt(7, 8)));
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000210}
Dan Gohman5035fbf2009-07-09 22:07:27 +0000211
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000212TEST_F(ConstantRangeTest, SExt) {
Dan Gohman5035fbf2009-07-09 22:07:27 +0000213 ConstantRange SFull = Full.signExtend(20);
214 ConstantRange SEmpty = Empty.signExtend(20);
215 ConstantRange SOne = One.signExtend(20);
216 ConstantRange SSome = Some.signExtend(20);
217 ConstantRange SWrap = Wrap.signExtend(20);
Nick Lewyckyd5923992009-09-05 18:27:40 +0000218 EXPECT_EQ(SFull, ConstantRange(APInt(20, (uint64_t)INT16_MIN, true),
219 APInt(20, INT16_MAX + 1, true)));
Dan Gohman5035fbf2009-07-09 22:07:27 +0000220 EXPECT_TRUE(SEmpty.isEmptySet());
Jay Foad583abbc2010-12-07 08:25:19 +0000221 EXPECT_EQ(SOne, ConstantRange(One.getLower().sext(20),
222 One.getUpper().sext(20)));
223 EXPECT_EQ(SSome, ConstantRange(Some.getLower().sext(20),
224 Some.getUpper().sext(20)));
Nick Lewyckya35462d2010-09-06 23:52:49 +0000225 EXPECT_EQ(SWrap, ConstantRange(APInt(20, (uint64_t)INT16_MIN, true),
226 APInt(20, INT16_MAX + 1, true)));
227
228 EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, 140)).signExtend(16),
229 ConstantRange(APInt(16, -128), APInt(16, 128)));
Nuno Lopes1112eca2013-10-30 15:36:50 +0000230
231 EXPECT_EQ(ConstantRange(APInt(16, 0x0200), APInt(16, 0x8000)).signExtend(19),
232 ConstantRange(APInt(19, 0x0200), APInt(19, 0x8000)));
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000233}
234
235TEST_F(ConstantRangeTest, IntersectWith) {
Nick Lewyckyd5923992009-09-05 18:27:40 +0000236 EXPECT_EQ(Empty.intersectWith(Full), Empty);
237 EXPECT_EQ(Empty.intersectWith(Empty), Empty);
238 EXPECT_EQ(Empty.intersectWith(One), Empty);
239 EXPECT_EQ(Empty.intersectWith(Some), Empty);
240 EXPECT_EQ(Empty.intersectWith(Wrap), Empty);
241 EXPECT_EQ(Full.intersectWith(Full), Full);
242 EXPECT_EQ(Some.intersectWith(Some), Some);
243 EXPECT_EQ(Some.intersectWith(One), One);
244 EXPECT_EQ(Full.intersectWith(One), One);
245 EXPECT_EQ(Full.intersectWith(Some), Some);
246 EXPECT_EQ(Some.intersectWith(Wrap), Empty);
247 EXPECT_EQ(One.intersectWith(Wrap), Empty);
248 EXPECT_EQ(One.intersectWith(Wrap), Wrap.intersectWith(One));
Dan Gohman5035fbf2009-07-09 22:07:27 +0000249
Nick Lewycky0d139032009-07-18 06:34:42 +0000250 // Klee generated testcase from PR4545.
251 // The intersection of i16 [4, 2) and [6, 5) is disjoint, looking like
252 // 01..4.6789ABCDEF where the dots represent values not in the intersection.
253 ConstantRange LHS(APInt(16, 4), APInt(16, 2));
254 ConstantRange RHS(APInt(16, 6), APInt(16, 5));
Chris Lattnerdbbdc792009-08-23 06:32:25 +0000255 EXPECT_TRUE(LHS.intersectWith(RHS) == LHS);
Nuno Lopes63afc082012-05-18 00:14:36 +0000256
257 // previous bug: intersection of [min, 3) and [2, max) should be 2
Nuno Lopesebb0c942012-06-28 00:59:33 +0000258 LHS = ConstantRange(APInt(32, -2147483646), APInt(32, 3));
259 RHS = ConstantRange(APInt(32, 2), APInt(32, 2147483646));
Nuno Lopes63afc082012-05-18 00:14:36 +0000260 EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 2)));
Nuno Lopesebb0c942012-06-28 00:59:33 +0000261
262 // [2, 0) /\ [4, 3) = [2, 0)
263 LHS = ConstantRange(APInt(32, 2), APInt(32, 0));
264 RHS = ConstantRange(APInt(32, 4), APInt(32, 3));
265 EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 2), APInt(32, 0)));
266
267 // [2, 0) /\ [4, 2) = [4, 0)
268 LHS = ConstantRange(APInt(32, 2), APInt(32, 0));
269 RHS = ConstantRange(APInt(32, 4), APInt(32, 2));
270 EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 4), APInt(32, 0)));
271
272 // [4, 2) /\ [5, 1) = [5, 1)
273 LHS = ConstantRange(APInt(32, 4), APInt(32, 2));
274 RHS = ConstantRange(APInt(32, 5), APInt(32, 1));
275 EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 5), APInt(32, 1)));
276
277 // [2, 0) /\ [7, 4) = [7, 4)
278 LHS = ConstantRange(APInt(32, 2), APInt(32, 0));
279 RHS = ConstantRange(APInt(32, 7), APInt(32, 4));
280 EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 7), APInt(32, 4)));
281
282 // [4, 2) /\ [1, 0) = [1, 0)
283 LHS = ConstantRange(APInt(32, 4), APInt(32, 2));
284 RHS = ConstantRange(APInt(32, 1), APInt(32, 0));
285 EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 4), APInt(32, 2)));
286
287 // [15, 0) /\ [7, 6) = [15, 0)
288 LHS = ConstantRange(APInt(32, 15), APInt(32, 0));
289 RHS = ConstantRange(APInt(32, 7), APInt(32, 6));
290 EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 15), APInt(32, 0)));
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000291}
Dan Gohman5035fbf2009-07-09 22:07:27 +0000292
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000293TEST_F(ConstantRangeTest, UnionWith) {
Nick Lewyckyd5923992009-09-05 18:27:40 +0000294 EXPECT_EQ(Wrap.unionWith(One),
295 ConstantRange(APInt(16, 0xaaa), APInt(16, 0xb)));
296 EXPECT_EQ(One.unionWith(Wrap), Wrap.unionWith(One));
297 EXPECT_EQ(Empty.unionWith(Empty), Empty);
298 EXPECT_EQ(Full.unionWith(Full), Full);
299 EXPECT_EQ(Some.unionWith(Wrap), Full);
Nick Lewycky567daf32009-07-19 03:44:35 +0000300
301 // PR4545
Nick Lewyckyd5923992009-09-05 18:27:40 +0000302 EXPECT_EQ(ConstantRange(APInt(16, 14), APInt(16, 1)).unionWith(
303 ConstantRange(APInt(16, 0), APInt(16, 8))),
304 ConstantRange(APInt(16, 14), APInt(16, 8)));
305 EXPECT_EQ(ConstantRange(APInt(16, 6), APInt(16, 4)).unionWith(
306 ConstantRange(APInt(16, 4), APInt(16, 0))),
Chris Lattnerdbbdc792009-08-23 06:32:25 +0000307 ConstantRange(16));
Nick Lewyckyd5923992009-09-05 18:27:40 +0000308 EXPECT_EQ(ConstantRange(APInt(16, 1), APInt(16, 0)).unionWith(
309 ConstantRange(APInt(16, 2), APInt(16, 1))),
Chris Lattnerdbbdc792009-08-23 06:32:25 +0000310 ConstantRange(16));
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000311}
Dan Gohman5035fbf2009-07-09 22:07:27 +0000312
Nuno Lopes5020db22012-06-28 16:10:13 +0000313TEST_F(ConstantRangeTest, SetDifference) {
314 EXPECT_EQ(Full.difference(Empty), Full);
315 EXPECT_EQ(Full.difference(Full), Empty);
316 EXPECT_EQ(Empty.difference(Empty), Empty);
317 EXPECT_EQ(Empty.difference(Full), Empty);
318
319 ConstantRange A(APInt(16, 3), APInt(16, 7));
320 ConstantRange B(APInt(16, 5), APInt(16, 9));
321 ConstantRange C(APInt(16, 3), APInt(16, 5));
322 ConstantRange D(APInt(16, 7), APInt(16, 9));
323 ConstantRange E(APInt(16, 5), APInt(16, 4));
324 ConstantRange F(APInt(16, 7), APInt(16, 3));
325 EXPECT_EQ(A.difference(B), C);
326 EXPECT_EQ(B.difference(A), D);
327 EXPECT_EQ(E.difference(A), F);
328}
329
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000330TEST_F(ConstantRangeTest, SubtractAPInt) {
Nick Lewyckyd5923992009-09-05 18:27:40 +0000331 EXPECT_EQ(Full.subtract(APInt(16, 4)), Full);
332 EXPECT_EQ(Empty.subtract(APInt(16, 4)), Empty);
333 EXPECT_EQ(Some.subtract(APInt(16, 4)),
334 ConstantRange(APInt(16, 0x6), APInt(16, 0xaa6)));
335 EXPECT_EQ(Wrap.subtract(APInt(16, 4)),
336 ConstantRange(APInt(16, 0xaa6), APInt(16, 0x6)));
337 EXPECT_EQ(One.subtract(APInt(16, 4)),
338 ConstantRange(APInt(16, 0x6)));
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000339}
Dan Gohman5035fbf2009-07-09 22:07:27 +0000340
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000341TEST_F(ConstantRangeTest, Add) {
Nick Lewyckyd5923992009-09-05 18:27:40 +0000342 EXPECT_EQ(Full.add(APInt(16, 4)), Full);
343 EXPECT_EQ(Full.add(Full), Full);
344 EXPECT_EQ(Full.add(Empty), Empty);
345 EXPECT_EQ(Full.add(One), Full);
346 EXPECT_EQ(Full.add(Some), Full);
347 EXPECT_EQ(Full.add(Wrap), Full);
348 EXPECT_EQ(Empty.add(Empty), Empty);
349 EXPECT_EQ(Empty.add(One), Empty);
350 EXPECT_EQ(Empty.add(Some), Empty);
351 EXPECT_EQ(Empty.add(Wrap), Empty);
352 EXPECT_EQ(Empty.add(APInt(16, 4)), Empty);
353 EXPECT_EQ(Some.add(APInt(16, 4)),
Nick Lewyckyd385c222010-08-11 22:04:36 +0000354 ConstantRange(APInt(16, 0xe), APInt(16, 0xaae)));
Nick Lewyckyd5923992009-09-05 18:27:40 +0000355 EXPECT_EQ(Wrap.add(APInt(16, 4)),
Nick Lewyckyd385c222010-08-11 22:04:36 +0000356 ConstantRange(APInt(16, 0xaae), APInt(16, 0xe)));
Nick Lewyckyd5923992009-09-05 18:27:40 +0000357 EXPECT_EQ(One.add(APInt(16, 4)),
Nick Lewyckyd385c222010-08-11 22:04:36 +0000358 ConstantRange(APInt(16, 0xe)));
359}
360
Artur Pilipenkoed841032016-10-19 14:44:23 +0000361TEST_F(ConstantRangeTest, AddWithNoSignedWrap) {
362 EXPECT_EQ(Empty.addWithNoSignedWrap(APInt(16, 1)), Empty);
363 EXPECT_EQ(Full.addWithNoSignedWrap(APInt(16, 1)),
364 ConstantRange(APInt(16, INT16_MIN+1), APInt(16, INT16_MIN)));
365 EXPECT_EQ(ConstantRange(APInt(8, -50), APInt(8, 50)).addWithNoSignedWrap(APInt(8, 10)),
366 ConstantRange(APInt(8, -40), APInt(8, 60)));
367 EXPECT_EQ(ConstantRange(APInt(8, -50), APInt(8, 120)).addWithNoSignedWrap(APInt(8, 10)),
368 ConstantRange(APInt(8, -40), APInt(8, INT8_MIN)));
369 EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, -10)).addWithNoSignedWrap(APInt(8, 5)),
370 ConstantRange(APInt(8, 125), APInt(8, -5)));
371 EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, -120)).addWithNoSignedWrap(APInt(8, 10)),
372 ConstantRange(APInt(8, INT8_MIN+10), APInt(8, -110)));
373
374 EXPECT_EQ(Empty.addWithNoSignedWrap(APInt(16, -1)), Empty);
375 EXPECT_EQ(Full.addWithNoSignedWrap(APInt(16, -1)),
376 ConstantRange(APInt(16, INT16_MIN), APInt(16, INT16_MAX)));
377 EXPECT_EQ(ConstantRange(APInt(8, -50), APInt(8, 50)).addWithNoSignedWrap(APInt(8, -10)),
378 ConstantRange(APInt(8, -60), APInt(8, 40)));
379 EXPECT_EQ(ConstantRange(APInt(8, -120), APInt(8, 50)).addWithNoSignedWrap(APInt(8, -10)),
380 ConstantRange(APInt(8, INT8_MIN), APInt(8, 40)));
381 EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, -120)).addWithNoSignedWrap(APInt(8, -5)),
382 ConstantRange(APInt(8, 115), APInt(8, -125)));
383 EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, -120)).addWithNoSignedWrap(APInt(8, -10)),
384 ConstantRange(APInt(8, 110), APInt(8, INT8_MIN-10)));
385}
386
Nick Lewyckyd385c222010-08-11 22:04:36 +0000387TEST_F(ConstantRangeTest, Sub) {
388 EXPECT_EQ(Full.sub(APInt(16, 4)), Full);
389 EXPECT_EQ(Full.sub(Full), Full);
390 EXPECT_EQ(Full.sub(Empty), Empty);
391 EXPECT_EQ(Full.sub(One), Full);
392 EXPECT_EQ(Full.sub(Some), Full);
393 EXPECT_EQ(Full.sub(Wrap), Full);
394 EXPECT_EQ(Empty.sub(Empty), Empty);
395 EXPECT_EQ(Empty.sub(One), Empty);
396 EXPECT_EQ(Empty.sub(Some), Empty);
397 EXPECT_EQ(Empty.sub(Wrap), Empty);
398 EXPECT_EQ(Empty.sub(APInt(16, 4)), Empty);
399 EXPECT_EQ(Some.sub(APInt(16, 4)),
400 ConstantRange(APInt(16, 0x6), APInt(16, 0xaa6)));
Nick Lewycky5dc6b792011-06-22 21:13:46 +0000401 EXPECT_EQ(Some.sub(Some),
402 ConstantRange(APInt(16, 0xf561), APInt(16, 0xaa0)));
Nick Lewyckyd385c222010-08-11 22:04:36 +0000403 EXPECT_EQ(Wrap.sub(APInt(16, 4)),
404 ConstantRange(APInt(16, 0xaa6), APInt(16, 0x6)));
405 EXPECT_EQ(One.sub(APInt(16, 4)),
406 ConstantRange(APInt(16, 0x6)));
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000407}
Dan Gohman5035fbf2009-07-09 22:07:27 +0000408
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000409TEST_F(ConstantRangeTest, Multiply) {
Nick Lewyckyd5923992009-09-05 18:27:40 +0000410 EXPECT_EQ(Full.multiply(Full), Full);
411 EXPECT_EQ(Full.multiply(Empty), Empty);
412 EXPECT_EQ(Full.multiply(One), Full);
413 EXPECT_EQ(Full.multiply(Some), Full);
414 EXPECT_EQ(Full.multiply(Wrap), Full);
415 EXPECT_EQ(Empty.multiply(Empty), Empty);
416 EXPECT_EQ(Empty.multiply(One), Empty);
417 EXPECT_EQ(Empty.multiply(Some), Empty);
418 EXPECT_EQ(Empty.multiply(Wrap), Empty);
419 EXPECT_EQ(One.multiply(One), ConstantRange(APInt(16, 0xa*0xa),
420 APInt(16, 0xa*0xa + 1)));
421 EXPECT_EQ(One.multiply(Some), ConstantRange(APInt(16, 0xa*0xa),
422 APInt(16, 0xa*0xaa9 + 1)));
423 EXPECT_EQ(One.multiply(Wrap), Full);
424 EXPECT_EQ(Some.multiply(Some), Full);
425 EXPECT_EQ(Some.multiply(Wrap), Full);
426 EXPECT_EQ(Wrap.multiply(Wrap), Full);
Nick Lewycky53023892009-07-13 03:27:41 +0000427
Nuno Lopes986cc182012-07-16 20:47:16 +0000428 ConstantRange Zero(APInt(16, 0));
429 EXPECT_EQ(Zero.multiply(Full), Zero);
430 EXPECT_EQ(Zero.multiply(Some), Zero);
431 EXPECT_EQ(Zero.multiply(Wrap), Zero);
432 EXPECT_EQ(Full.multiply(Zero), Zero);
433 EXPECT_EQ(Some.multiply(Zero), Zero);
434 EXPECT_EQ(Wrap.multiply(Zero), Zero);
435
Nick Lewycky53023892009-07-13 03:27:41 +0000436 // http://llvm.org/PR4545
Nick Lewyckyd5923992009-09-05 18:27:40 +0000437 EXPECT_EQ(ConstantRange(APInt(4, 1), APInt(4, 6)).multiply(
438 ConstantRange(APInt(4, 6), APInt(4, 2))),
439 ConstantRange(4, /*isFullSet=*/true));
James Molloydcc78ec2015-03-06 15:50:47 +0000440
441 EXPECT_EQ(ConstantRange(APInt(8, 254), APInt(8, 0)).multiply(
442 ConstantRange(APInt(8, 252), APInt(8, 4))),
443 ConstantRange(APInt(8, 250), APInt(8, 9)));
444 EXPECT_EQ(ConstantRange(APInt(8, 254), APInt(8, 255)).multiply(
445 ConstantRange(APInt(8, 2), APInt(8, 4))),
446 ConstantRange(APInt(8, 250), APInt(8, 253)));
Craig Topper9bbae502017-05-10 18:15:06 +0000447
448 // TODO: This should be return [-2, 0]
449 EXPECT_EQ(ConstantRange(APInt(8, -2)).multiply(
450 ConstantRange(APInt(8, 0), APInt(8, 2))),
Craig Topperc51d0532017-05-10 20:01:48 +0000451 ConstantRange(APInt(8, -2), APInt(8, 1)));
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000452}
Dan Gohman5035fbf2009-07-09 22:07:27 +0000453
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000454TEST_F(ConstantRangeTest, UMax) {
Nick Lewyckyd5923992009-09-05 18:27:40 +0000455 EXPECT_EQ(Full.umax(Full), Full);
456 EXPECT_EQ(Full.umax(Empty), Empty);
457 EXPECT_EQ(Full.umax(Some), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
458 EXPECT_EQ(Full.umax(Wrap), Full);
459 EXPECT_EQ(Full.umax(Some), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
460 EXPECT_EQ(Empty.umax(Empty), Empty);
461 EXPECT_EQ(Empty.umax(Some), Empty);
462 EXPECT_EQ(Empty.umax(Wrap), Empty);
463 EXPECT_EQ(Empty.umax(One), Empty);
464 EXPECT_EQ(Some.umax(Some), Some);
465 EXPECT_EQ(Some.umax(Wrap), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
466 EXPECT_EQ(Some.umax(One), Some);
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000467 // TODO: ConstantRange is currently over-conservative here.
Nick Lewyckyd5923992009-09-05 18:27:40 +0000468 EXPECT_EQ(Wrap.umax(Wrap), Full);
469 EXPECT_EQ(Wrap.umax(One), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
470 EXPECT_EQ(One.umax(One), One);
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000471}
472
473TEST_F(ConstantRangeTest, SMax) {
Nick Lewyckyd5923992009-09-05 18:27:40 +0000474 EXPECT_EQ(Full.smax(Full), Full);
475 EXPECT_EQ(Full.smax(Empty), Empty);
476 EXPECT_EQ(Full.smax(Some), ConstantRange(APInt(16, 0xa),
477 APInt::getSignedMinValue(16)));
478 EXPECT_EQ(Full.smax(Wrap), Full);
479 EXPECT_EQ(Full.smax(One), ConstantRange(APInt(16, 0xa),
480 APInt::getSignedMinValue(16)));
481 EXPECT_EQ(Empty.smax(Empty), Empty);
482 EXPECT_EQ(Empty.smax(Some), Empty);
483 EXPECT_EQ(Empty.smax(Wrap), Empty);
484 EXPECT_EQ(Empty.smax(One), Empty);
485 EXPECT_EQ(Some.smax(Some), Some);
486 EXPECT_EQ(Some.smax(Wrap), ConstantRange(APInt(16, 0xa),
487 APInt(16, (uint64_t)INT16_MIN)));
488 EXPECT_EQ(Some.smax(One), Some);
489 EXPECT_EQ(Wrap.smax(One), ConstantRange(APInt(16, 0xa),
490 APInt(16, (uint64_t)INT16_MIN)));
491 EXPECT_EQ(One.smax(One), One);
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000492}
Dan Gohman5035fbf2009-07-09 22:07:27 +0000493
Philip Reamesba313122016-02-26 22:08:18 +0000494TEST_F(ConstantRangeTest, UMin) {
495 EXPECT_EQ(Full.umin(Full), Full);
496 EXPECT_EQ(Full.umin(Empty), Empty);
497 EXPECT_EQ(Full.umin(Some), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
498 EXPECT_EQ(Full.umin(Wrap), Full);
499 EXPECT_EQ(Empty.umin(Empty), Empty);
500 EXPECT_EQ(Empty.umin(Some), Empty);
501 EXPECT_EQ(Empty.umin(Wrap), Empty);
502 EXPECT_EQ(Empty.umin(One), Empty);
503 EXPECT_EQ(Some.umin(Some), Some);
504 EXPECT_EQ(Some.umin(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
505 EXPECT_EQ(Some.umin(One), One);
506 // TODO: ConstantRange is currently over-conservative here.
507 EXPECT_EQ(Wrap.umin(Wrap), Full);
508 EXPECT_EQ(Wrap.umin(One), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
509 EXPECT_EQ(One.umin(One), One);
510}
511
512TEST_F(ConstantRangeTest, SMin) {
513 EXPECT_EQ(Full.smin(Full), Full);
514 EXPECT_EQ(Full.smin(Empty), Empty);
515 EXPECT_EQ(Full.smin(Some), ConstantRange(APInt(16, (uint64_t)INT16_MIN),
516 APInt(16, 0xaaa)));
517 EXPECT_EQ(Full.smin(Wrap), Full);
518 EXPECT_EQ(Empty.smin(Empty), Empty);
519 EXPECT_EQ(Empty.smin(Some), Empty);
520 EXPECT_EQ(Empty.smin(Wrap), Empty);
521 EXPECT_EQ(Empty.smin(One), Empty);
522 EXPECT_EQ(Some.smin(Some), Some);
523 EXPECT_EQ(Some.smin(Wrap), ConstantRange(APInt(16, (uint64_t)INT16_MIN),
524 APInt(16, 0xaaa)));
525 EXPECT_EQ(Some.smin(One), One);
526 // TODO: ConstantRange is currently over-conservative here.
527 EXPECT_EQ(Wrap.smin(Wrap), Full);
528 EXPECT_EQ(Wrap.smin(One), ConstantRange(APInt(16, (uint64_t)INT16_MIN),
529 APInt(16, 0xb)));
530 EXPECT_EQ(One.smin(One), One);
531}
532
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000533TEST_F(ConstantRangeTest, UDiv) {
Nick Lewyckyd5923992009-09-05 18:27:40 +0000534 EXPECT_EQ(Full.udiv(Full), Full);
535 EXPECT_EQ(Full.udiv(Empty), Empty);
536 EXPECT_EQ(Full.udiv(One), ConstantRange(APInt(16, 0),
537 APInt(16, 0xffff / 0xa + 1)));
538 EXPECT_EQ(Full.udiv(Some), ConstantRange(APInt(16, 0),
539 APInt(16, 0xffff / 0xa + 1)));
540 EXPECT_EQ(Full.udiv(Wrap), Full);
541 EXPECT_EQ(Empty.udiv(Empty), Empty);
542 EXPECT_EQ(Empty.udiv(One), Empty);
543 EXPECT_EQ(Empty.udiv(Some), Empty);
544 EXPECT_EQ(Empty.udiv(Wrap), Empty);
545 EXPECT_EQ(One.udiv(One), ConstantRange(APInt(16, 1)));
546 EXPECT_EQ(One.udiv(Some), ConstantRange(APInt(16, 0), APInt(16, 2)));
547 EXPECT_EQ(One.udiv(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
548 EXPECT_EQ(Some.udiv(Some), ConstantRange(APInt(16, 0), APInt(16, 0x111)));
549 EXPECT_EQ(Some.udiv(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
550 EXPECT_EQ(Wrap.udiv(Wrap), Full);
Dan Gohman5035fbf2009-07-09 22:07:27 +0000551}
552
Nick Lewyckyd385c222010-08-11 22:04:36 +0000553TEST_F(ConstantRangeTest, Shl) {
554 EXPECT_EQ(Full.shl(Full), Full);
555 EXPECT_EQ(Full.shl(Empty), Empty);
556 EXPECT_EQ(Full.shl(One), Full); // TODO: [0, (-1 << 0xa) + 1)
557 EXPECT_EQ(Full.shl(Some), Full); // TODO: [0, (-1 << 0xa) + 1)
558 EXPECT_EQ(Full.shl(Wrap), Full);
559 EXPECT_EQ(Empty.shl(Empty), Empty);
560 EXPECT_EQ(Empty.shl(One), Empty);
561 EXPECT_EQ(Empty.shl(Some), Empty);
562 EXPECT_EQ(Empty.shl(Wrap), Empty);
563 EXPECT_EQ(One.shl(One), ConstantRange(APInt(16, 0xa << 0xa),
564 APInt(16, (0xa << 0xa) + 1)));
565 EXPECT_EQ(One.shl(Some), Full); // TODO: [0xa << 0xa, 0)
566 EXPECT_EQ(One.shl(Wrap), Full); // TODO: [0xa, 0xa << 14 + 1)
567 EXPECT_EQ(Some.shl(Some), Full); // TODO: [0xa << 0xa, 0xfc01)
568 EXPECT_EQ(Some.shl(Wrap), Full); // TODO: [0xa, 0x7ff << 0x5 + 1)
569 EXPECT_EQ(Wrap.shl(Wrap), Full);
570}
571
572TEST_F(ConstantRangeTest, Lshr) {
573 EXPECT_EQ(Full.lshr(Full), Full);
574 EXPECT_EQ(Full.lshr(Empty), Empty);
575 EXPECT_EQ(Full.lshr(One), ConstantRange(APInt(16, 0),
576 APInt(16, (0xffff >> 0xa) + 1)));
577 EXPECT_EQ(Full.lshr(Some), ConstantRange(APInt(16, 0),
578 APInt(16, (0xffff >> 0xa) + 1)));
579 EXPECT_EQ(Full.lshr(Wrap), Full);
580 EXPECT_EQ(Empty.lshr(Empty), Empty);
581 EXPECT_EQ(Empty.lshr(One), Empty);
582 EXPECT_EQ(Empty.lshr(Some), Empty);
583 EXPECT_EQ(Empty.lshr(Wrap), Empty);
584 EXPECT_EQ(One.lshr(One), ConstantRange(APInt(16, 0)));
585 EXPECT_EQ(One.lshr(Some), ConstantRange(APInt(16, 0)));
586 EXPECT_EQ(One.lshr(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
587 EXPECT_EQ(Some.lshr(Some), ConstantRange(APInt(16, 0),
588 APInt(16, (0xaaa >> 0xa) + 1)));
589 EXPECT_EQ(Some.lshr(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
590 EXPECT_EQ(Wrap.lshr(Wrap), Full);
591}
592
Sanjoy Das7182d362015-03-18 00:41:24 +0000593TEST(ConstantRange, MakeAllowedICmpRegion) {
Nick Lewycky5154ee02010-09-28 18:18:36 +0000594 // PR8250
595 ConstantRange SMax = ConstantRange(APInt::getSignedMaxValue(32));
Sanjoy Das7182d362015-03-18 00:41:24 +0000596 EXPECT_TRUE(ConstantRange::makeAllowedICmpRegion(ICmpInst::ICMP_SGT, SMax)
597 .isEmptySet());
598}
599
600TEST(ConstantRange, MakeSatisfyingICmpRegion) {
601 ConstantRange LowHalf(APInt(8, 0), APInt(8, 128));
602 ConstantRange HighHalf(APInt(8, 128), APInt(8, 0));
603 ConstantRange EmptySet(8, /* isFullSet = */ false);
604
605 EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_NE, LowHalf),
606 HighHalf);
607
608 EXPECT_EQ(
609 ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_NE, HighHalf),
610 LowHalf);
611
612 EXPECT_TRUE(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_EQ,
613 HighHalf).isEmptySet());
614
615 ConstantRange UnsignedSample(APInt(8, 5), APInt(8, 200));
616
617 EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_ULT,
618 UnsignedSample),
619 ConstantRange(APInt(8, 0), APInt(8, 5)));
620
621 EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_ULE,
622 UnsignedSample),
623 ConstantRange(APInt(8, 0), APInt(8, 6)));
624
625 EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_UGT,
626 UnsignedSample),
627 ConstantRange(APInt(8, 200), APInt(8, 0)));
628
629 EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_UGE,
630 UnsignedSample),
631 ConstantRange(APInt(8, 199), APInt(8, 0)));
632
633 ConstantRange SignedSample(APInt(8, -5), APInt(8, 5));
634
635 EXPECT_EQ(
636 ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SLT, SignedSample),
637 ConstantRange(APInt(8, -128), APInt(8, -5)));
638
639 EXPECT_EQ(
640 ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SLE, SignedSample),
641 ConstantRange(APInt(8, -128), APInt(8, -4)));
642
643 EXPECT_EQ(
644 ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SGT, SignedSample),
645 ConstantRange(APInt(8, 5), APInt(8, -128)));
646
647 EXPECT_EQ(
648 ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SGE, SignedSample),
649 ConstantRange(APInt(8, 4), APInt(8, -128)));
Nick Lewycky5154ee02010-09-28 18:18:36 +0000650}
651
Sanjoy Das39289102016-03-03 18:31:33 +0000652TEST(ConstantRange, MakeGuaranteedNoWrapRegion) {
Sanjoy Das6ed05302015-10-22 03:12:57 +0000653 const int IntMin4Bits = 8;
654 const int IntMax4Bits = 7;
655 typedef OverflowingBinaryOperator OBO;
656
657 for (int Const : {0, -1, -2, 1, 2, IntMin4Bits, IntMax4Bits}) {
658 APInt C(4, Const, true /* = isSigned */);
659
Sanjoy Das5079f622016-02-22 16:13:02 +0000660 auto NUWRegion = ConstantRange::makeGuaranteedNoWrapRegion(
661 Instruction::Add, C, OBO::NoUnsignedWrap);
Sanjoy Das6ed05302015-10-22 03:12:57 +0000662
663 EXPECT_FALSE(NUWRegion.isEmptySet());
664
Sanjoy Das5079f622016-02-22 16:13:02 +0000665 auto NSWRegion = ConstantRange::makeGuaranteedNoWrapRegion(
666 Instruction::Add, C, OBO::NoSignedWrap);
Sanjoy Das6ed05302015-10-22 03:12:57 +0000667
668 EXPECT_FALSE(NSWRegion.isEmptySet());
669
Sanjoy Das5079f622016-02-22 16:13:02 +0000670 auto NoWrapRegion = ConstantRange::makeGuaranteedNoWrapRegion(
Sanjoy Das6ed05302015-10-22 03:12:57 +0000671 Instruction::Add, C, OBO::NoSignedWrap | OBO::NoUnsignedWrap);
672
673 EXPECT_FALSE(NoWrapRegion.isEmptySet());
674 EXPECT_TRUE(NUWRegion.intersectWith(NSWRegion).contains(NoWrapRegion));
675
676 for (APInt I = NUWRegion.getLower(), E = NUWRegion.getUpper(); I != E;
677 ++I) {
678 bool Overflow = false;
Craig Topper3cc8da32017-04-19 22:11:05 +0000679 (void)I.uadd_ov(C, Overflow);
Sanjoy Das6ed05302015-10-22 03:12:57 +0000680 EXPECT_FALSE(Overflow);
681 }
682
683 for (APInt I = NSWRegion.getLower(), E = NSWRegion.getUpper(); I != E;
684 ++I) {
685 bool Overflow = false;
Craig Topper3cc8da32017-04-19 22:11:05 +0000686 (void)I.sadd_ov(C, Overflow);
Sanjoy Das6ed05302015-10-22 03:12:57 +0000687 EXPECT_FALSE(Overflow);
688 }
689
690 for (APInt I = NoWrapRegion.getLower(), E = NoWrapRegion.getUpper(); I != E;
691 ++I) {
692 bool Overflow = false;
693
Craig Topper3cc8da32017-04-19 22:11:05 +0000694 (void)I.sadd_ov(C, Overflow);
Sanjoy Das6ed05302015-10-22 03:12:57 +0000695 EXPECT_FALSE(Overflow);
696
Craig Topper3cc8da32017-04-19 22:11:05 +0000697 (void)I.uadd_ov(C, Overflow);
Sanjoy Das6ed05302015-10-22 03:12:57 +0000698 EXPECT_FALSE(Overflow);
699 }
700 }
Sanjoy Dasf3867e62016-03-03 18:31:16 +0000701
702 auto NSWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion(
703 Instruction::Add, ConstantRange(32, /* isFullSet = */ true),
704 OBO::NoSignedWrap);
705 EXPECT_TRUE(NSWForAllValues.isSingleElement() &&
706 NSWForAllValues.getSingleElement()->isMinValue());
707
708 auto NUWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion(
709 Instruction::Add, ConstantRange(32, /* isFullSet = */ true),
710 OBO::NoUnsignedWrap);
711 EXPECT_TRUE(NUWForAllValues.isSingleElement() &&
Craig Topper5c0a5472017-05-15 04:40:19 +0000712 NUWForAllValues.getSingleElement()->isMinValue());
Sanjoy Dasf3867e62016-03-03 18:31:16 +0000713
714 auto NUWAndNSWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion(
715 Instruction::Add, ConstantRange(32, /* isFullSet = */ true),
716 OBO::NoUnsignedWrap | OBO::NoSignedWrap);
717 EXPECT_TRUE(NUWAndNSWForAllValues.isSingleElement() &&
Craig Topper5c0a5472017-05-15 04:40:19 +0000718 NUWAndNSWForAllValues.getSingleElement()->isMinValue());
Sanjoy Dasf3867e62016-03-03 18:31:16 +0000719
720 ConstantRange OneToFive(APInt(32, 1), APInt(32, 6));
721 EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
722 Instruction::Add, OneToFive, OBO::NoSignedWrap),
723 ConstantRange(APInt::getSignedMinValue(32),
724 APInt::getSignedMaxValue(32) - 4));
725 EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
726 Instruction::Add, OneToFive, OBO::NoUnsignedWrap),
727 ConstantRange(APInt::getMinValue(32), APInt::getMinValue(32) - 5));
728 EXPECT_EQ(
729 ConstantRange::makeGuaranteedNoWrapRegion(
730 Instruction::Add, OneToFive, OBO::NoUnsignedWrap | OBO::NoSignedWrap),
731 ConstantRange(APInt::getMinValue(32), APInt::getSignedMaxValue(32) - 4));
732
733 ConstantRange MinusFiveToMinusTwo(APInt(32, -5), APInt(32, -1));
734 EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
735 Instruction::Add, MinusFiveToMinusTwo, OBO::NoSignedWrap),
736 ConstantRange(APInt::getSignedMinValue(32) + 5,
737 APInt::getSignedMinValue(32)));
738 EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
739 Instruction::Add, MinusFiveToMinusTwo, OBO::NoUnsignedWrap),
740 ConstantRange(APInt(32, 0), APInt(32, 2)));
741 EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
742 Instruction::Add, MinusFiveToMinusTwo,
743 OBO::NoUnsignedWrap | OBO::NoSignedWrap),
744 ConstantRange(APInt(32, 0), APInt(32, 2)));
745
746 ConstantRange MinusOneToOne(APInt(32, -1), APInt(32, 2));
747 EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
748 Instruction::Add, MinusOneToOne, OBO::NoSignedWrap),
749 ConstantRange(APInt::getSignedMinValue(32) + 1,
750 APInt::getSignedMinValue(32) - 1));
751 EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
752 Instruction::Add, MinusOneToOne, OBO::NoUnsignedWrap),
753 ConstantRange(APInt(32, 0), APInt(32, 1)));
754 EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
755 Instruction::Add, MinusOneToOne,
756 OBO::NoUnsignedWrap | OBO::NoSignedWrap),
757 ConstantRange(APInt(32, 0), APInt(32, 1)));
Sanjoy Das6ed05302015-10-22 03:12:57 +0000758}
759
Sanjoy Das590614c2016-05-19 03:53:06 +0000760TEST(ConstantRange, GetEquivalentICmp) {
761 APInt RHS;
762 CmpInst::Predicate Pred;
763
764 EXPECT_TRUE(ConstantRange(APInt::getMinValue(32), APInt(32, 100))
765 .getEquivalentICmp(Pred, RHS));
766 EXPECT_EQ(Pred, CmpInst::ICMP_ULT);
767 EXPECT_EQ(RHS, APInt(32, 100));
768
769 EXPECT_TRUE(ConstantRange(APInt::getSignedMinValue(32), APInt(32, 100))
770 .getEquivalentICmp(Pred, RHS));
771 EXPECT_EQ(Pred, CmpInst::ICMP_SLT);
772 EXPECT_EQ(RHS, APInt(32, 100));
773
774 EXPECT_TRUE(ConstantRange(APInt(32, 100), APInt::getMinValue(32))
775 .getEquivalentICmp(Pred, RHS));
776 EXPECT_EQ(Pred, CmpInst::ICMP_UGE);
777 EXPECT_EQ(RHS, APInt(32, 100));
778
779 EXPECT_TRUE(ConstantRange(APInt(32, 100), APInt::getSignedMinValue(32))
780 .getEquivalentICmp(Pred, RHS));
781 EXPECT_EQ(Pred, CmpInst::ICMP_SGE);
782 EXPECT_EQ(RHS, APInt(32, 100));
783
784 EXPECT_TRUE(
785 ConstantRange(32, /*isFullSet=*/true).getEquivalentICmp(Pred, RHS));
786 EXPECT_EQ(Pred, CmpInst::ICMP_UGE);
787 EXPECT_EQ(RHS, APInt(32, 0));
788
789 EXPECT_TRUE(
790 ConstantRange(32, /*isFullSet=*/false).getEquivalentICmp(Pred, RHS));
791 EXPECT_EQ(Pred, CmpInst::ICMP_ULT);
792 EXPECT_EQ(RHS, APInt(32, 0));
793
794 EXPECT_FALSE(ConstantRange(APInt(32, 100), APInt(32, 200))
795 .getEquivalentICmp(Pred, RHS));
796
797 EXPECT_FALSE(ConstantRange(APInt::getSignedMinValue(32) - APInt(32, 100),
798 APInt::getSignedMinValue(32) + APInt(32, 100))
799 .getEquivalentICmp(Pred, RHS));
800
801 EXPECT_FALSE(ConstantRange(APInt::getMinValue(32) - APInt(32, 100),
802 APInt::getMinValue(32) + APInt(32, 100))
803 .getEquivalentICmp(Pred, RHS));
Sanjoy Dasc7d32912016-10-02 20:59:05 +0000804
805 EXPECT_TRUE(ConstantRange(APInt(32, 100)).getEquivalentICmp(Pred, RHS));
806 EXPECT_EQ(Pred, CmpInst::ICMP_EQ);
807 EXPECT_EQ(RHS, APInt(32, 100));
808
809 EXPECT_TRUE(
810 ConstantRange(APInt(32, 100)).inverse().getEquivalentICmp(Pred, RHS));
811 EXPECT_EQ(Pred, CmpInst::ICMP_NE);
812 EXPECT_EQ(RHS, APInt(32, 100));
813
814 EXPECT_TRUE(
815 ConstantRange(APInt(512, 100)).inverse().getEquivalentICmp(Pred, RHS));
816 EXPECT_EQ(Pred, CmpInst::ICMP_NE);
817 EXPECT_EQ(RHS, APInt(512, 100));
818
819 // NB! It would be correct for the following four calls to getEquivalentICmp
820 // to return ordered predicates like CmpInst::ICMP_ULT or CmpInst::ICMP_UGT.
821 // However, that's not the case today.
822
823 EXPECT_TRUE(ConstantRange(APInt(32, 0)).getEquivalentICmp(Pred, RHS));
824 EXPECT_EQ(Pred, CmpInst::ICMP_EQ);
825 EXPECT_EQ(RHS, APInt(32, 0));
826
827 EXPECT_TRUE(
828 ConstantRange(APInt(32, 0)).inverse().getEquivalentICmp(Pred, RHS));
829 EXPECT_EQ(Pred, CmpInst::ICMP_NE);
830 EXPECT_EQ(RHS, APInt(32, 0));
831
832 EXPECT_TRUE(ConstantRange(APInt(32, -1)).getEquivalentICmp(Pred, RHS));
833 EXPECT_EQ(Pred, CmpInst::ICMP_EQ);
834 EXPECT_EQ(RHS, APInt(32, -1));
835
836 EXPECT_TRUE(
837 ConstantRange(APInt(32, -1)).inverse().getEquivalentICmp(Pred, RHS));
838 EXPECT_EQ(Pred, CmpInst::ICMP_NE);
839 EXPECT_EQ(RHS, APInt(32, -1));
Sanjoy Das590614c2016-05-19 03:53:06 +0000840}
841
Dan Gohman5035fbf2009-07-09 22:07:27 +0000842} // anonymous namespace