blob: c6a0ef8f1b71b68cc4e5139f59dfc6b8efef5c70 [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());
Craig Topper0be7a1b2017-06-04 23:03:54 +0000191
192 // trunc([2, 5), 3->2) = [2, 1)
193 ConstantRange TwoFive(APInt(3, 2), APInt(3, 5));
194 EXPECT_EQ(TwoFive.truncate(2), ConstantRange(APInt(2, 2), APInt(2, 1)));
195
196 // trunc([2, 6), 3->2) = full
197 ConstantRange TwoSix(APInt(3, 2), APInt(3, 6));
198 EXPECT_TRUE(TwoSix.truncate(2).isFullSet());
199
200 // trunc([5, 7), 3->2) = [1, 3)
201 ConstantRange FiveSeven(APInt(3, 5), APInt(3, 7));
202 EXPECT_EQ(FiveSeven.truncate(2), ConstantRange(APInt(2, 1), APInt(2, 3)));
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000203}
Dan Gohman5035fbf2009-07-09 22:07:27 +0000204
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000205TEST_F(ConstantRangeTest, ZExt) {
Dan Gohman5035fbf2009-07-09 22:07:27 +0000206 ConstantRange ZFull = Full.zeroExtend(20);
207 ConstantRange ZEmpty = Empty.zeroExtend(20);
208 ConstantRange ZOne = One.zeroExtend(20);
209 ConstantRange ZSome = Some.zeroExtend(20);
210 ConstantRange ZWrap = Wrap.zeroExtend(20);
Nick Lewyckyd5923992009-09-05 18:27:40 +0000211 EXPECT_EQ(ZFull, ConstantRange(APInt(20, 0), APInt(20, 0x10000)));
Dan Gohman5035fbf2009-07-09 22:07:27 +0000212 EXPECT_TRUE(ZEmpty.isEmptySet());
Jay Foad583abbc2010-12-07 08:25:19 +0000213 EXPECT_EQ(ZOne, ConstantRange(One.getLower().zext(20),
214 One.getUpper().zext(20)));
215 EXPECT_EQ(ZSome, ConstantRange(Some.getLower().zext(20),
216 Some.getUpper().zext(20)));
Nick Lewyckya35462d2010-09-06 23:52:49 +0000217 EXPECT_EQ(ZWrap, ConstantRange(APInt(20, 0), APInt(20, 0x10000)));
Nuno Lopeseb9d2752012-07-23 20:33:29 +0000218
219 // zext([5, 0), 3->7) = [5, 8)
220 ConstantRange FiveZero(APInt(3, 5), APInt(3, 0));
221 EXPECT_EQ(FiveZero.zeroExtend(7), ConstantRange(APInt(7, 5), APInt(7, 8)));
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000222}
Dan Gohman5035fbf2009-07-09 22:07:27 +0000223
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000224TEST_F(ConstantRangeTest, SExt) {
Dan Gohman5035fbf2009-07-09 22:07:27 +0000225 ConstantRange SFull = Full.signExtend(20);
226 ConstantRange SEmpty = Empty.signExtend(20);
227 ConstantRange SOne = One.signExtend(20);
228 ConstantRange SSome = Some.signExtend(20);
229 ConstantRange SWrap = Wrap.signExtend(20);
Nick Lewyckyd5923992009-09-05 18:27:40 +0000230 EXPECT_EQ(SFull, ConstantRange(APInt(20, (uint64_t)INT16_MIN, true),
231 APInt(20, INT16_MAX + 1, true)));
Dan Gohman5035fbf2009-07-09 22:07:27 +0000232 EXPECT_TRUE(SEmpty.isEmptySet());
Jay Foad583abbc2010-12-07 08:25:19 +0000233 EXPECT_EQ(SOne, ConstantRange(One.getLower().sext(20),
234 One.getUpper().sext(20)));
235 EXPECT_EQ(SSome, ConstantRange(Some.getLower().sext(20),
236 Some.getUpper().sext(20)));
Nick Lewyckya35462d2010-09-06 23:52:49 +0000237 EXPECT_EQ(SWrap, ConstantRange(APInt(20, (uint64_t)INT16_MIN, true),
238 APInt(20, INT16_MAX + 1, true)));
239
240 EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, 140)).signExtend(16),
241 ConstantRange(APInt(16, -128), APInt(16, 128)));
Nuno Lopes1112eca2013-10-30 15:36:50 +0000242
243 EXPECT_EQ(ConstantRange(APInt(16, 0x0200), APInt(16, 0x8000)).signExtend(19),
244 ConstantRange(APInt(19, 0x0200), APInt(19, 0x8000)));
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000245}
246
247TEST_F(ConstantRangeTest, IntersectWith) {
Nick Lewyckyd5923992009-09-05 18:27:40 +0000248 EXPECT_EQ(Empty.intersectWith(Full), Empty);
249 EXPECT_EQ(Empty.intersectWith(Empty), Empty);
250 EXPECT_EQ(Empty.intersectWith(One), Empty);
251 EXPECT_EQ(Empty.intersectWith(Some), Empty);
252 EXPECT_EQ(Empty.intersectWith(Wrap), Empty);
253 EXPECT_EQ(Full.intersectWith(Full), Full);
254 EXPECT_EQ(Some.intersectWith(Some), Some);
255 EXPECT_EQ(Some.intersectWith(One), One);
256 EXPECT_EQ(Full.intersectWith(One), One);
257 EXPECT_EQ(Full.intersectWith(Some), Some);
258 EXPECT_EQ(Some.intersectWith(Wrap), Empty);
259 EXPECT_EQ(One.intersectWith(Wrap), Empty);
260 EXPECT_EQ(One.intersectWith(Wrap), Wrap.intersectWith(One));
Dan Gohman5035fbf2009-07-09 22:07:27 +0000261
Nick Lewycky0d139032009-07-18 06:34:42 +0000262 // Klee generated testcase from PR4545.
263 // The intersection of i16 [4, 2) and [6, 5) is disjoint, looking like
264 // 01..4.6789ABCDEF where the dots represent values not in the intersection.
265 ConstantRange LHS(APInt(16, 4), APInt(16, 2));
266 ConstantRange RHS(APInt(16, 6), APInt(16, 5));
Chris Lattnerdbbdc792009-08-23 06:32:25 +0000267 EXPECT_TRUE(LHS.intersectWith(RHS) == LHS);
Nuno Lopes63afc082012-05-18 00:14:36 +0000268
269 // previous bug: intersection of [min, 3) and [2, max) should be 2
Nuno Lopesebb0c942012-06-28 00:59:33 +0000270 LHS = ConstantRange(APInt(32, -2147483646), APInt(32, 3));
271 RHS = ConstantRange(APInt(32, 2), APInt(32, 2147483646));
Nuno Lopes63afc082012-05-18 00:14:36 +0000272 EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 2)));
Nuno Lopesebb0c942012-06-28 00:59:33 +0000273
274 // [2, 0) /\ [4, 3) = [2, 0)
275 LHS = ConstantRange(APInt(32, 2), APInt(32, 0));
276 RHS = ConstantRange(APInt(32, 4), APInt(32, 3));
277 EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 2), APInt(32, 0)));
278
279 // [2, 0) /\ [4, 2) = [4, 0)
280 LHS = ConstantRange(APInt(32, 2), APInt(32, 0));
281 RHS = ConstantRange(APInt(32, 4), APInt(32, 2));
282 EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 4), APInt(32, 0)));
283
284 // [4, 2) /\ [5, 1) = [5, 1)
285 LHS = ConstantRange(APInt(32, 4), APInt(32, 2));
286 RHS = ConstantRange(APInt(32, 5), APInt(32, 1));
287 EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 5), APInt(32, 1)));
288
289 // [2, 0) /\ [7, 4) = [7, 4)
290 LHS = ConstantRange(APInt(32, 2), APInt(32, 0));
291 RHS = ConstantRange(APInt(32, 7), APInt(32, 4));
292 EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 7), APInt(32, 4)));
293
294 // [4, 2) /\ [1, 0) = [1, 0)
295 LHS = ConstantRange(APInt(32, 4), APInt(32, 2));
296 RHS = ConstantRange(APInt(32, 1), APInt(32, 0));
297 EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 4), APInt(32, 2)));
298
299 // [15, 0) /\ [7, 6) = [15, 0)
300 LHS = ConstantRange(APInt(32, 15), APInt(32, 0));
301 RHS = ConstantRange(APInt(32, 7), APInt(32, 6));
302 EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 15), APInt(32, 0)));
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000303}
Dan Gohman5035fbf2009-07-09 22:07:27 +0000304
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000305TEST_F(ConstantRangeTest, UnionWith) {
Nick Lewyckyd5923992009-09-05 18:27:40 +0000306 EXPECT_EQ(Wrap.unionWith(One),
307 ConstantRange(APInt(16, 0xaaa), APInt(16, 0xb)));
308 EXPECT_EQ(One.unionWith(Wrap), Wrap.unionWith(One));
309 EXPECT_EQ(Empty.unionWith(Empty), Empty);
310 EXPECT_EQ(Full.unionWith(Full), Full);
311 EXPECT_EQ(Some.unionWith(Wrap), Full);
Nick Lewycky567daf32009-07-19 03:44:35 +0000312
313 // PR4545
Nick Lewyckyd5923992009-09-05 18:27:40 +0000314 EXPECT_EQ(ConstantRange(APInt(16, 14), APInt(16, 1)).unionWith(
315 ConstantRange(APInt(16, 0), APInt(16, 8))),
316 ConstantRange(APInt(16, 14), APInt(16, 8)));
317 EXPECT_EQ(ConstantRange(APInt(16, 6), APInt(16, 4)).unionWith(
318 ConstantRange(APInt(16, 4), APInt(16, 0))),
Chris Lattnerdbbdc792009-08-23 06:32:25 +0000319 ConstantRange(16));
Nick Lewyckyd5923992009-09-05 18:27:40 +0000320 EXPECT_EQ(ConstantRange(APInt(16, 1), APInt(16, 0)).unionWith(
321 ConstantRange(APInt(16, 2), APInt(16, 1))),
Chris Lattnerdbbdc792009-08-23 06:32:25 +0000322 ConstantRange(16));
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000323}
Dan Gohman5035fbf2009-07-09 22:07:27 +0000324
Nuno Lopes5020db22012-06-28 16:10:13 +0000325TEST_F(ConstantRangeTest, SetDifference) {
326 EXPECT_EQ(Full.difference(Empty), Full);
327 EXPECT_EQ(Full.difference(Full), Empty);
328 EXPECT_EQ(Empty.difference(Empty), Empty);
329 EXPECT_EQ(Empty.difference(Full), Empty);
330
331 ConstantRange A(APInt(16, 3), APInt(16, 7));
332 ConstantRange B(APInt(16, 5), APInt(16, 9));
333 ConstantRange C(APInt(16, 3), APInt(16, 5));
334 ConstantRange D(APInt(16, 7), APInt(16, 9));
335 ConstantRange E(APInt(16, 5), APInt(16, 4));
336 ConstantRange F(APInt(16, 7), APInt(16, 3));
337 EXPECT_EQ(A.difference(B), C);
338 EXPECT_EQ(B.difference(A), D);
339 EXPECT_EQ(E.difference(A), F);
340}
341
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000342TEST_F(ConstantRangeTest, SubtractAPInt) {
Nick Lewyckyd5923992009-09-05 18:27:40 +0000343 EXPECT_EQ(Full.subtract(APInt(16, 4)), Full);
344 EXPECT_EQ(Empty.subtract(APInt(16, 4)), Empty);
345 EXPECT_EQ(Some.subtract(APInt(16, 4)),
346 ConstantRange(APInt(16, 0x6), APInt(16, 0xaa6)));
347 EXPECT_EQ(Wrap.subtract(APInt(16, 4)),
348 ConstantRange(APInt(16, 0xaa6), APInt(16, 0x6)));
349 EXPECT_EQ(One.subtract(APInt(16, 4)),
350 ConstantRange(APInt(16, 0x6)));
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000351}
Dan Gohman5035fbf2009-07-09 22:07:27 +0000352
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000353TEST_F(ConstantRangeTest, Add) {
Nick Lewyckyd5923992009-09-05 18:27:40 +0000354 EXPECT_EQ(Full.add(APInt(16, 4)), Full);
355 EXPECT_EQ(Full.add(Full), Full);
356 EXPECT_EQ(Full.add(Empty), Empty);
357 EXPECT_EQ(Full.add(One), Full);
358 EXPECT_EQ(Full.add(Some), Full);
359 EXPECT_EQ(Full.add(Wrap), Full);
360 EXPECT_EQ(Empty.add(Empty), Empty);
361 EXPECT_EQ(Empty.add(One), Empty);
362 EXPECT_EQ(Empty.add(Some), Empty);
363 EXPECT_EQ(Empty.add(Wrap), Empty);
364 EXPECT_EQ(Empty.add(APInt(16, 4)), Empty);
365 EXPECT_EQ(Some.add(APInt(16, 4)),
Nick Lewyckyd385c222010-08-11 22:04:36 +0000366 ConstantRange(APInt(16, 0xe), APInt(16, 0xaae)));
Nick Lewyckyd5923992009-09-05 18:27:40 +0000367 EXPECT_EQ(Wrap.add(APInt(16, 4)),
Nick Lewyckyd385c222010-08-11 22:04:36 +0000368 ConstantRange(APInt(16, 0xaae), APInt(16, 0xe)));
Nick Lewyckyd5923992009-09-05 18:27:40 +0000369 EXPECT_EQ(One.add(APInt(16, 4)),
Nick Lewyckyd385c222010-08-11 22:04:36 +0000370 ConstantRange(APInt(16, 0xe)));
371}
372
Artur Pilipenkoed841032016-10-19 14:44:23 +0000373TEST_F(ConstantRangeTest, AddWithNoSignedWrap) {
374 EXPECT_EQ(Empty.addWithNoSignedWrap(APInt(16, 1)), Empty);
375 EXPECT_EQ(Full.addWithNoSignedWrap(APInt(16, 1)),
376 ConstantRange(APInt(16, INT16_MIN+1), APInt(16, INT16_MIN)));
377 EXPECT_EQ(ConstantRange(APInt(8, -50), APInt(8, 50)).addWithNoSignedWrap(APInt(8, 10)),
378 ConstantRange(APInt(8, -40), APInt(8, 60)));
379 EXPECT_EQ(ConstantRange(APInt(8, -50), APInt(8, 120)).addWithNoSignedWrap(APInt(8, 10)),
380 ConstantRange(APInt(8, -40), APInt(8, INT8_MIN)));
381 EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, -10)).addWithNoSignedWrap(APInt(8, 5)),
382 ConstantRange(APInt(8, 125), APInt(8, -5)));
383 EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, -120)).addWithNoSignedWrap(APInt(8, 10)),
384 ConstantRange(APInt(8, INT8_MIN+10), APInt(8, -110)));
385
386 EXPECT_EQ(Empty.addWithNoSignedWrap(APInt(16, -1)), Empty);
387 EXPECT_EQ(Full.addWithNoSignedWrap(APInt(16, -1)),
388 ConstantRange(APInt(16, INT16_MIN), APInt(16, INT16_MAX)));
389 EXPECT_EQ(ConstantRange(APInt(8, -50), APInt(8, 50)).addWithNoSignedWrap(APInt(8, -10)),
390 ConstantRange(APInt(8, -60), APInt(8, 40)));
391 EXPECT_EQ(ConstantRange(APInt(8, -120), APInt(8, 50)).addWithNoSignedWrap(APInt(8, -10)),
392 ConstantRange(APInt(8, INT8_MIN), APInt(8, 40)));
393 EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, -120)).addWithNoSignedWrap(APInt(8, -5)),
394 ConstantRange(APInt(8, 115), APInt(8, -125)));
395 EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, -120)).addWithNoSignedWrap(APInt(8, -10)),
396 ConstantRange(APInt(8, 110), APInt(8, INT8_MIN-10)));
397}
398
Nick Lewyckyd385c222010-08-11 22:04:36 +0000399TEST_F(ConstantRangeTest, Sub) {
400 EXPECT_EQ(Full.sub(APInt(16, 4)), Full);
401 EXPECT_EQ(Full.sub(Full), Full);
402 EXPECT_EQ(Full.sub(Empty), Empty);
403 EXPECT_EQ(Full.sub(One), Full);
404 EXPECT_EQ(Full.sub(Some), Full);
405 EXPECT_EQ(Full.sub(Wrap), Full);
406 EXPECT_EQ(Empty.sub(Empty), Empty);
407 EXPECT_EQ(Empty.sub(One), Empty);
408 EXPECT_EQ(Empty.sub(Some), Empty);
409 EXPECT_EQ(Empty.sub(Wrap), Empty);
410 EXPECT_EQ(Empty.sub(APInt(16, 4)), Empty);
411 EXPECT_EQ(Some.sub(APInt(16, 4)),
412 ConstantRange(APInt(16, 0x6), APInt(16, 0xaa6)));
Nick Lewycky5dc6b792011-06-22 21:13:46 +0000413 EXPECT_EQ(Some.sub(Some),
414 ConstantRange(APInt(16, 0xf561), APInt(16, 0xaa0)));
Nick Lewyckyd385c222010-08-11 22:04:36 +0000415 EXPECT_EQ(Wrap.sub(APInt(16, 4)),
416 ConstantRange(APInt(16, 0xaa6), APInt(16, 0x6)));
417 EXPECT_EQ(One.sub(APInt(16, 4)),
418 ConstantRange(APInt(16, 0x6)));
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000419}
Dan Gohman5035fbf2009-07-09 22:07:27 +0000420
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000421TEST_F(ConstantRangeTest, Multiply) {
Nick Lewyckyd5923992009-09-05 18:27:40 +0000422 EXPECT_EQ(Full.multiply(Full), Full);
423 EXPECT_EQ(Full.multiply(Empty), Empty);
424 EXPECT_EQ(Full.multiply(One), Full);
425 EXPECT_EQ(Full.multiply(Some), Full);
426 EXPECT_EQ(Full.multiply(Wrap), Full);
427 EXPECT_EQ(Empty.multiply(Empty), Empty);
428 EXPECT_EQ(Empty.multiply(One), Empty);
429 EXPECT_EQ(Empty.multiply(Some), Empty);
430 EXPECT_EQ(Empty.multiply(Wrap), Empty);
431 EXPECT_EQ(One.multiply(One), ConstantRange(APInt(16, 0xa*0xa),
432 APInt(16, 0xa*0xa + 1)));
433 EXPECT_EQ(One.multiply(Some), ConstantRange(APInt(16, 0xa*0xa),
434 APInt(16, 0xa*0xaa9 + 1)));
435 EXPECT_EQ(One.multiply(Wrap), Full);
436 EXPECT_EQ(Some.multiply(Some), Full);
437 EXPECT_EQ(Some.multiply(Wrap), Full);
438 EXPECT_EQ(Wrap.multiply(Wrap), Full);
Nick Lewycky53023892009-07-13 03:27:41 +0000439
Nuno Lopes986cc182012-07-16 20:47:16 +0000440 ConstantRange Zero(APInt(16, 0));
441 EXPECT_EQ(Zero.multiply(Full), Zero);
442 EXPECT_EQ(Zero.multiply(Some), Zero);
443 EXPECT_EQ(Zero.multiply(Wrap), Zero);
444 EXPECT_EQ(Full.multiply(Zero), Zero);
445 EXPECT_EQ(Some.multiply(Zero), Zero);
446 EXPECT_EQ(Wrap.multiply(Zero), Zero);
447
Nick Lewycky53023892009-07-13 03:27:41 +0000448 // http://llvm.org/PR4545
Nick Lewyckyd5923992009-09-05 18:27:40 +0000449 EXPECT_EQ(ConstantRange(APInt(4, 1), APInt(4, 6)).multiply(
450 ConstantRange(APInt(4, 6), APInt(4, 2))),
451 ConstantRange(4, /*isFullSet=*/true));
James Molloydcc78ec2015-03-06 15:50:47 +0000452
453 EXPECT_EQ(ConstantRange(APInt(8, 254), APInt(8, 0)).multiply(
454 ConstantRange(APInt(8, 252), APInt(8, 4))),
455 ConstantRange(APInt(8, 250), APInt(8, 9)));
456 EXPECT_EQ(ConstantRange(APInt(8, 254), APInt(8, 255)).multiply(
457 ConstantRange(APInt(8, 2), APInt(8, 4))),
458 ConstantRange(APInt(8, 250), APInt(8, 253)));
Craig Topper9bbae502017-05-10 18:15:06 +0000459
460 // TODO: This should be return [-2, 0]
461 EXPECT_EQ(ConstantRange(APInt(8, -2)).multiply(
462 ConstantRange(APInt(8, 0), APInt(8, 2))),
Craig Topperc51d0532017-05-10 20:01:48 +0000463 ConstantRange(APInt(8, -2), APInt(8, 1)));
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000464}
Dan Gohman5035fbf2009-07-09 22:07:27 +0000465
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000466TEST_F(ConstantRangeTest, UMax) {
Nick Lewyckyd5923992009-09-05 18:27:40 +0000467 EXPECT_EQ(Full.umax(Full), Full);
468 EXPECT_EQ(Full.umax(Empty), Empty);
469 EXPECT_EQ(Full.umax(Some), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
470 EXPECT_EQ(Full.umax(Wrap), Full);
471 EXPECT_EQ(Full.umax(Some), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
472 EXPECT_EQ(Empty.umax(Empty), Empty);
473 EXPECT_EQ(Empty.umax(Some), Empty);
474 EXPECT_EQ(Empty.umax(Wrap), Empty);
475 EXPECT_EQ(Empty.umax(One), Empty);
476 EXPECT_EQ(Some.umax(Some), Some);
477 EXPECT_EQ(Some.umax(Wrap), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
478 EXPECT_EQ(Some.umax(One), Some);
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000479 // TODO: ConstantRange is currently over-conservative here.
Nick Lewyckyd5923992009-09-05 18:27:40 +0000480 EXPECT_EQ(Wrap.umax(Wrap), Full);
481 EXPECT_EQ(Wrap.umax(One), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
482 EXPECT_EQ(One.umax(One), One);
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000483}
484
485TEST_F(ConstantRangeTest, SMax) {
Nick Lewyckyd5923992009-09-05 18:27:40 +0000486 EXPECT_EQ(Full.smax(Full), Full);
487 EXPECT_EQ(Full.smax(Empty), Empty);
488 EXPECT_EQ(Full.smax(Some), ConstantRange(APInt(16, 0xa),
489 APInt::getSignedMinValue(16)));
490 EXPECT_EQ(Full.smax(Wrap), Full);
491 EXPECT_EQ(Full.smax(One), ConstantRange(APInt(16, 0xa),
492 APInt::getSignedMinValue(16)));
493 EXPECT_EQ(Empty.smax(Empty), Empty);
494 EXPECT_EQ(Empty.smax(Some), Empty);
495 EXPECT_EQ(Empty.smax(Wrap), Empty);
496 EXPECT_EQ(Empty.smax(One), Empty);
497 EXPECT_EQ(Some.smax(Some), Some);
498 EXPECT_EQ(Some.smax(Wrap), ConstantRange(APInt(16, 0xa),
499 APInt(16, (uint64_t)INT16_MIN)));
500 EXPECT_EQ(Some.smax(One), Some);
501 EXPECT_EQ(Wrap.smax(One), ConstantRange(APInt(16, 0xa),
502 APInt(16, (uint64_t)INT16_MIN)));
503 EXPECT_EQ(One.smax(One), One);
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000504}
Dan Gohman5035fbf2009-07-09 22:07:27 +0000505
Philip Reamesba313122016-02-26 22:08:18 +0000506TEST_F(ConstantRangeTest, UMin) {
507 EXPECT_EQ(Full.umin(Full), Full);
508 EXPECT_EQ(Full.umin(Empty), Empty);
509 EXPECT_EQ(Full.umin(Some), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
510 EXPECT_EQ(Full.umin(Wrap), Full);
511 EXPECT_EQ(Empty.umin(Empty), Empty);
512 EXPECT_EQ(Empty.umin(Some), Empty);
513 EXPECT_EQ(Empty.umin(Wrap), Empty);
514 EXPECT_EQ(Empty.umin(One), Empty);
515 EXPECT_EQ(Some.umin(Some), Some);
516 EXPECT_EQ(Some.umin(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
517 EXPECT_EQ(Some.umin(One), One);
518 // TODO: ConstantRange is currently over-conservative here.
519 EXPECT_EQ(Wrap.umin(Wrap), Full);
520 EXPECT_EQ(Wrap.umin(One), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
521 EXPECT_EQ(One.umin(One), One);
522}
523
524TEST_F(ConstantRangeTest, SMin) {
525 EXPECT_EQ(Full.smin(Full), Full);
526 EXPECT_EQ(Full.smin(Empty), Empty);
527 EXPECT_EQ(Full.smin(Some), ConstantRange(APInt(16, (uint64_t)INT16_MIN),
528 APInt(16, 0xaaa)));
529 EXPECT_EQ(Full.smin(Wrap), Full);
530 EXPECT_EQ(Empty.smin(Empty), Empty);
531 EXPECT_EQ(Empty.smin(Some), Empty);
532 EXPECT_EQ(Empty.smin(Wrap), Empty);
533 EXPECT_EQ(Empty.smin(One), Empty);
534 EXPECT_EQ(Some.smin(Some), Some);
535 EXPECT_EQ(Some.smin(Wrap), ConstantRange(APInt(16, (uint64_t)INT16_MIN),
536 APInt(16, 0xaaa)));
537 EXPECT_EQ(Some.smin(One), One);
538 // TODO: ConstantRange is currently over-conservative here.
539 EXPECT_EQ(Wrap.smin(Wrap), Full);
540 EXPECT_EQ(Wrap.smin(One), ConstantRange(APInt(16, (uint64_t)INT16_MIN),
541 APInt(16, 0xb)));
542 EXPECT_EQ(One.smin(One), One);
543}
544
Nick Lewycky17a4fa82009-07-11 18:43:20 +0000545TEST_F(ConstantRangeTest, UDiv) {
Nick Lewyckyd5923992009-09-05 18:27:40 +0000546 EXPECT_EQ(Full.udiv(Full), Full);
547 EXPECT_EQ(Full.udiv(Empty), Empty);
548 EXPECT_EQ(Full.udiv(One), ConstantRange(APInt(16, 0),
549 APInt(16, 0xffff / 0xa + 1)));
550 EXPECT_EQ(Full.udiv(Some), ConstantRange(APInt(16, 0),
551 APInt(16, 0xffff / 0xa + 1)));
552 EXPECT_EQ(Full.udiv(Wrap), Full);
553 EXPECT_EQ(Empty.udiv(Empty), Empty);
554 EXPECT_EQ(Empty.udiv(One), Empty);
555 EXPECT_EQ(Empty.udiv(Some), Empty);
556 EXPECT_EQ(Empty.udiv(Wrap), Empty);
557 EXPECT_EQ(One.udiv(One), ConstantRange(APInt(16, 1)));
558 EXPECT_EQ(One.udiv(Some), ConstantRange(APInt(16, 0), APInt(16, 2)));
559 EXPECT_EQ(One.udiv(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
560 EXPECT_EQ(Some.udiv(Some), ConstantRange(APInt(16, 0), APInt(16, 0x111)));
561 EXPECT_EQ(Some.udiv(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
562 EXPECT_EQ(Wrap.udiv(Wrap), Full);
Dan Gohman5035fbf2009-07-09 22:07:27 +0000563}
564
Nick Lewyckyd385c222010-08-11 22:04:36 +0000565TEST_F(ConstantRangeTest, Shl) {
566 EXPECT_EQ(Full.shl(Full), Full);
567 EXPECT_EQ(Full.shl(Empty), Empty);
568 EXPECT_EQ(Full.shl(One), Full); // TODO: [0, (-1 << 0xa) + 1)
569 EXPECT_EQ(Full.shl(Some), Full); // TODO: [0, (-1 << 0xa) + 1)
570 EXPECT_EQ(Full.shl(Wrap), Full);
571 EXPECT_EQ(Empty.shl(Empty), Empty);
572 EXPECT_EQ(Empty.shl(One), Empty);
573 EXPECT_EQ(Empty.shl(Some), Empty);
574 EXPECT_EQ(Empty.shl(Wrap), Empty);
575 EXPECT_EQ(One.shl(One), ConstantRange(APInt(16, 0xa << 0xa),
576 APInt(16, (0xa << 0xa) + 1)));
577 EXPECT_EQ(One.shl(Some), Full); // TODO: [0xa << 0xa, 0)
578 EXPECT_EQ(One.shl(Wrap), Full); // TODO: [0xa, 0xa << 14 + 1)
579 EXPECT_EQ(Some.shl(Some), Full); // TODO: [0xa << 0xa, 0xfc01)
580 EXPECT_EQ(Some.shl(Wrap), Full); // TODO: [0xa, 0x7ff << 0x5 + 1)
581 EXPECT_EQ(Wrap.shl(Wrap), Full);
582}
583
584TEST_F(ConstantRangeTest, Lshr) {
585 EXPECT_EQ(Full.lshr(Full), Full);
586 EXPECT_EQ(Full.lshr(Empty), Empty);
587 EXPECT_EQ(Full.lshr(One), ConstantRange(APInt(16, 0),
588 APInt(16, (0xffff >> 0xa) + 1)));
589 EXPECT_EQ(Full.lshr(Some), ConstantRange(APInt(16, 0),
590 APInt(16, (0xffff >> 0xa) + 1)));
591 EXPECT_EQ(Full.lshr(Wrap), Full);
592 EXPECT_EQ(Empty.lshr(Empty), Empty);
593 EXPECT_EQ(Empty.lshr(One), Empty);
594 EXPECT_EQ(Empty.lshr(Some), Empty);
595 EXPECT_EQ(Empty.lshr(Wrap), Empty);
596 EXPECT_EQ(One.lshr(One), ConstantRange(APInt(16, 0)));
597 EXPECT_EQ(One.lshr(Some), ConstantRange(APInt(16, 0)));
598 EXPECT_EQ(One.lshr(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
599 EXPECT_EQ(Some.lshr(Some), ConstantRange(APInt(16, 0),
600 APInt(16, (0xaaa >> 0xa) + 1)));
601 EXPECT_EQ(Some.lshr(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
602 EXPECT_EQ(Wrap.lshr(Wrap), Full);
603}
604
Sanjoy Das7182d362015-03-18 00:41:24 +0000605TEST(ConstantRange, MakeAllowedICmpRegion) {
Nick Lewycky5154ee02010-09-28 18:18:36 +0000606 // PR8250
607 ConstantRange SMax = ConstantRange(APInt::getSignedMaxValue(32));
Sanjoy Das7182d362015-03-18 00:41:24 +0000608 EXPECT_TRUE(ConstantRange::makeAllowedICmpRegion(ICmpInst::ICMP_SGT, SMax)
609 .isEmptySet());
610}
611
612TEST(ConstantRange, MakeSatisfyingICmpRegion) {
613 ConstantRange LowHalf(APInt(8, 0), APInt(8, 128));
614 ConstantRange HighHalf(APInt(8, 128), APInt(8, 0));
615 ConstantRange EmptySet(8, /* isFullSet = */ false);
616
617 EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_NE, LowHalf),
618 HighHalf);
619
620 EXPECT_EQ(
621 ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_NE, HighHalf),
622 LowHalf);
623
624 EXPECT_TRUE(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_EQ,
625 HighHalf).isEmptySet());
626
627 ConstantRange UnsignedSample(APInt(8, 5), APInt(8, 200));
628
629 EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_ULT,
630 UnsignedSample),
631 ConstantRange(APInt(8, 0), APInt(8, 5)));
632
633 EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_ULE,
634 UnsignedSample),
635 ConstantRange(APInt(8, 0), APInt(8, 6)));
636
637 EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_UGT,
638 UnsignedSample),
639 ConstantRange(APInt(8, 200), APInt(8, 0)));
640
641 EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_UGE,
642 UnsignedSample),
643 ConstantRange(APInt(8, 199), APInt(8, 0)));
644
645 ConstantRange SignedSample(APInt(8, -5), APInt(8, 5));
646
647 EXPECT_EQ(
648 ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SLT, SignedSample),
649 ConstantRange(APInt(8, -128), APInt(8, -5)));
650
651 EXPECT_EQ(
652 ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SLE, SignedSample),
653 ConstantRange(APInt(8, -128), APInt(8, -4)));
654
655 EXPECT_EQ(
656 ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SGT, SignedSample),
657 ConstantRange(APInt(8, 5), APInt(8, -128)));
658
659 EXPECT_EQ(
660 ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SGE, SignedSample),
661 ConstantRange(APInt(8, 4), APInt(8, -128)));
Nick Lewycky5154ee02010-09-28 18:18:36 +0000662}
663
Sanjoy Das39289102016-03-03 18:31:33 +0000664TEST(ConstantRange, MakeGuaranteedNoWrapRegion) {
Sanjoy Das6ed05302015-10-22 03:12:57 +0000665 const int IntMin4Bits = 8;
666 const int IntMax4Bits = 7;
667 typedef OverflowingBinaryOperator OBO;
668
669 for (int Const : {0, -1, -2, 1, 2, IntMin4Bits, IntMax4Bits}) {
670 APInt C(4, Const, true /* = isSigned */);
671
Sanjoy Das5079f622016-02-22 16:13:02 +0000672 auto NUWRegion = ConstantRange::makeGuaranteedNoWrapRegion(
673 Instruction::Add, C, OBO::NoUnsignedWrap);
Sanjoy Das6ed05302015-10-22 03:12:57 +0000674
675 EXPECT_FALSE(NUWRegion.isEmptySet());
676
Sanjoy Das5079f622016-02-22 16:13:02 +0000677 auto NSWRegion = ConstantRange::makeGuaranteedNoWrapRegion(
678 Instruction::Add, C, OBO::NoSignedWrap);
Sanjoy Das6ed05302015-10-22 03:12:57 +0000679
680 EXPECT_FALSE(NSWRegion.isEmptySet());
681
Sanjoy Das5079f622016-02-22 16:13:02 +0000682 auto NoWrapRegion = ConstantRange::makeGuaranteedNoWrapRegion(
Sanjoy Das6ed05302015-10-22 03:12:57 +0000683 Instruction::Add, C, OBO::NoSignedWrap | OBO::NoUnsignedWrap);
684
685 EXPECT_FALSE(NoWrapRegion.isEmptySet());
686 EXPECT_TRUE(NUWRegion.intersectWith(NSWRegion).contains(NoWrapRegion));
687
688 for (APInt I = NUWRegion.getLower(), E = NUWRegion.getUpper(); I != E;
689 ++I) {
690 bool Overflow = false;
Craig Topper3cc8da32017-04-19 22:11:05 +0000691 (void)I.uadd_ov(C, Overflow);
Sanjoy Das6ed05302015-10-22 03:12:57 +0000692 EXPECT_FALSE(Overflow);
693 }
694
695 for (APInt I = NSWRegion.getLower(), E = NSWRegion.getUpper(); I != E;
696 ++I) {
697 bool Overflow = false;
Craig Topper3cc8da32017-04-19 22:11:05 +0000698 (void)I.sadd_ov(C, Overflow);
Sanjoy Das6ed05302015-10-22 03:12:57 +0000699 EXPECT_FALSE(Overflow);
700 }
701
702 for (APInt I = NoWrapRegion.getLower(), E = NoWrapRegion.getUpper(); I != E;
703 ++I) {
704 bool Overflow = false;
705
Craig Topper3cc8da32017-04-19 22:11:05 +0000706 (void)I.sadd_ov(C, Overflow);
Sanjoy Das6ed05302015-10-22 03:12:57 +0000707 EXPECT_FALSE(Overflow);
708
Craig Topper3cc8da32017-04-19 22:11:05 +0000709 (void)I.uadd_ov(C, Overflow);
Sanjoy Das6ed05302015-10-22 03:12:57 +0000710 EXPECT_FALSE(Overflow);
711 }
712 }
Sanjoy Dasf3867e62016-03-03 18:31:16 +0000713
714 auto NSWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion(
715 Instruction::Add, ConstantRange(32, /* isFullSet = */ true),
716 OBO::NoSignedWrap);
717 EXPECT_TRUE(NSWForAllValues.isSingleElement() &&
718 NSWForAllValues.getSingleElement()->isMinValue());
719
720 auto NUWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion(
721 Instruction::Add, ConstantRange(32, /* isFullSet = */ true),
722 OBO::NoUnsignedWrap);
723 EXPECT_TRUE(NUWForAllValues.isSingleElement() &&
Craig Topper5c0a5472017-05-15 04:40:19 +0000724 NUWForAllValues.getSingleElement()->isMinValue());
Sanjoy Dasf3867e62016-03-03 18:31:16 +0000725
726 auto NUWAndNSWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion(
727 Instruction::Add, ConstantRange(32, /* isFullSet = */ true),
728 OBO::NoUnsignedWrap | OBO::NoSignedWrap);
729 EXPECT_TRUE(NUWAndNSWForAllValues.isSingleElement() &&
Craig Topper5c0a5472017-05-15 04:40:19 +0000730 NUWAndNSWForAllValues.getSingleElement()->isMinValue());
Sanjoy Dasf3867e62016-03-03 18:31:16 +0000731
732 ConstantRange OneToFive(APInt(32, 1), APInt(32, 6));
733 EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
734 Instruction::Add, OneToFive, OBO::NoSignedWrap),
735 ConstantRange(APInt::getSignedMinValue(32),
736 APInt::getSignedMaxValue(32) - 4));
737 EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
738 Instruction::Add, OneToFive, OBO::NoUnsignedWrap),
739 ConstantRange(APInt::getMinValue(32), APInt::getMinValue(32) - 5));
740 EXPECT_EQ(
741 ConstantRange::makeGuaranteedNoWrapRegion(
742 Instruction::Add, OneToFive, OBO::NoUnsignedWrap | OBO::NoSignedWrap),
743 ConstantRange(APInt::getMinValue(32), APInt::getSignedMaxValue(32) - 4));
744
745 ConstantRange MinusFiveToMinusTwo(APInt(32, -5), APInt(32, -1));
746 EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
747 Instruction::Add, MinusFiveToMinusTwo, OBO::NoSignedWrap),
748 ConstantRange(APInt::getSignedMinValue(32) + 5,
749 APInt::getSignedMinValue(32)));
750 EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
751 Instruction::Add, MinusFiveToMinusTwo, OBO::NoUnsignedWrap),
752 ConstantRange(APInt(32, 0), APInt(32, 2)));
753 EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
754 Instruction::Add, MinusFiveToMinusTwo,
755 OBO::NoUnsignedWrap | OBO::NoSignedWrap),
756 ConstantRange(APInt(32, 0), APInt(32, 2)));
757
758 ConstantRange MinusOneToOne(APInt(32, -1), APInt(32, 2));
759 EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
760 Instruction::Add, MinusOneToOne, OBO::NoSignedWrap),
761 ConstantRange(APInt::getSignedMinValue(32) + 1,
762 APInt::getSignedMinValue(32) - 1));
763 EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
764 Instruction::Add, MinusOneToOne, OBO::NoUnsignedWrap),
765 ConstantRange(APInt(32, 0), APInt(32, 1)));
766 EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
767 Instruction::Add, MinusOneToOne,
768 OBO::NoUnsignedWrap | OBO::NoSignedWrap),
769 ConstantRange(APInt(32, 0), APInt(32, 1)));
Sanjoy Das6ed05302015-10-22 03:12:57 +0000770}
771
Sanjoy Das590614c2016-05-19 03:53:06 +0000772TEST(ConstantRange, GetEquivalentICmp) {
773 APInt RHS;
774 CmpInst::Predicate Pred;
775
776 EXPECT_TRUE(ConstantRange(APInt::getMinValue(32), APInt(32, 100))
777 .getEquivalentICmp(Pred, RHS));
778 EXPECT_EQ(Pred, CmpInst::ICMP_ULT);
779 EXPECT_EQ(RHS, APInt(32, 100));
780
781 EXPECT_TRUE(ConstantRange(APInt::getSignedMinValue(32), APInt(32, 100))
782 .getEquivalentICmp(Pred, RHS));
783 EXPECT_EQ(Pred, CmpInst::ICMP_SLT);
784 EXPECT_EQ(RHS, APInt(32, 100));
785
786 EXPECT_TRUE(ConstantRange(APInt(32, 100), APInt::getMinValue(32))
787 .getEquivalentICmp(Pred, RHS));
788 EXPECT_EQ(Pred, CmpInst::ICMP_UGE);
789 EXPECT_EQ(RHS, APInt(32, 100));
790
791 EXPECT_TRUE(ConstantRange(APInt(32, 100), APInt::getSignedMinValue(32))
792 .getEquivalentICmp(Pred, RHS));
793 EXPECT_EQ(Pred, CmpInst::ICMP_SGE);
794 EXPECT_EQ(RHS, APInt(32, 100));
795
796 EXPECT_TRUE(
797 ConstantRange(32, /*isFullSet=*/true).getEquivalentICmp(Pred, RHS));
798 EXPECT_EQ(Pred, CmpInst::ICMP_UGE);
799 EXPECT_EQ(RHS, APInt(32, 0));
800
801 EXPECT_TRUE(
802 ConstantRange(32, /*isFullSet=*/false).getEquivalentICmp(Pred, RHS));
803 EXPECT_EQ(Pred, CmpInst::ICMP_ULT);
804 EXPECT_EQ(RHS, APInt(32, 0));
805
806 EXPECT_FALSE(ConstantRange(APInt(32, 100), APInt(32, 200))
807 .getEquivalentICmp(Pred, RHS));
808
809 EXPECT_FALSE(ConstantRange(APInt::getSignedMinValue(32) - APInt(32, 100),
810 APInt::getSignedMinValue(32) + APInt(32, 100))
811 .getEquivalentICmp(Pred, RHS));
812
813 EXPECT_FALSE(ConstantRange(APInt::getMinValue(32) - APInt(32, 100),
814 APInt::getMinValue(32) + APInt(32, 100))
815 .getEquivalentICmp(Pred, RHS));
Sanjoy Dasc7d32912016-10-02 20:59:05 +0000816
817 EXPECT_TRUE(ConstantRange(APInt(32, 100)).getEquivalentICmp(Pred, RHS));
818 EXPECT_EQ(Pred, CmpInst::ICMP_EQ);
819 EXPECT_EQ(RHS, APInt(32, 100));
820
821 EXPECT_TRUE(
822 ConstantRange(APInt(32, 100)).inverse().getEquivalentICmp(Pred, RHS));
823 EXPECT_EQ(Pred, CmpInst::ICMP_NE);
824 EXPECT_EQ(RHS, APInt(32, 100));
825
826 EXPECT_TRUE(
827 ConstantRange(APInt(512, 100)).inverse().getEquivalentICmp(Pred, RHS));
828 EXPECT_EQ(Pred, CmpInst::ICMP_NE);
829 EXPECT_EQ(RHS, APInt(512, 100));
830
831 // NB! It would be correct for the following four calls to getEquivalentICmp
832 // to return ordered predicates like CmpInst::ICMP_ULT or CmpInst::ICMP_UGT.
833 // However, that's not the case today.
834
835 EXPECT_TRUE(ConstantRange(APInt(32, 0)).getEquivalentICmp(Pred, RHS));
836 EXPECT_EQ(Pred, CmpInst::ICMP_EQ);
837 EXPECT_EQ(RHS, APInt(32, 0));
838
839 EXPECT_TRUE(
840 ConstantRange(APInt(32, 0)).inverse().getEquivalentICmp(Pred, RHS));
841 EXPECT_EQ(Pred, CmpInst::ICMP_NE);
842 EXPECT_EQ(RHS, APInt(32, 0));
843
844 EXPECT_TRUE(ConstantRange(APInt(32, -1)).getEquivalentICmp(Pred, RHS));
845 EXPECT_EQ(Pred, CmpInst::ICMP_EQ);
846 EXPECT_EQ(RHS, APInt(32, -1));
847
848 EXPECT_TRUE(
849 ConstantRange(APInt(32, -1)).inverse().getEquivalentICmp(Pred, RHS));
850 EXPECT_EQ(Pred, CmpInst::ICMP_NE);
851 EXPECT_EQ(RHS, APInt(32, -1));
Sanjoy Das590614c2016-05-19 03:53:06 +0000852}
853
Dan Gohman5035fbf2009-07-09 22:07:27 +0000854} // anonymous namespace