1*9880d681SAndroid Build Coastguard Worker //===- ConstantRangeTest.cpp - ConstantRange tests ------------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/ConstantRange.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Instructions.h"
12*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Operator.h"
13*9880d681SAndroid Build Coastguard Worker #include "gtest/gtest.h"
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker using namespace llvm;
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker namespace {
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker class ConstantRangeTest : public ::testing::Test {
20*9880d681SAndroid Build Coastguard Worker protected:
21*9880d681SAndroid Build Coastguard Worker static ConstantRange Full;
22*9880d681SAndroid Build Coastguard Worker static ConstantRange Empty;
23*9880d681SAndroid Build Coastguard Worker static ConstantRange One;
24*9880d681SAndroid Build Coastguard Worker static ConstantRange Some;
25*9880d681SAndroid Build Coastguard Worker static ConstantRange Wrap;
26*9880d681SAndroid Build Coastguard Worker };
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Worker ConstantRange ConstantRangeTest::Full(16);
29*9880d681SAndroid Build Coastguard Worker ConstantRange ConstantRangeTest::Empty(16, false);
30*9880d681SAndroid Build Coastguard Worker ConstantRange ConstantRangeTest::One(APInt(16, 0xa));
31*9880d681SAndroid Build Coastguard Worker ConstantRange ConstantRangeTest::Some(APInt(16, 0xa), APInt(16, 0xaaa));
32*9880d681SAndroid Build Coastguard Worker ConstantRange ConstantRangeTest::Wrap(APInt(16, 0xaaa), APInt(16, 0xa));
33*9880d681SAndroid Build Coastguard Worker
TEST_F(ConstantRangeTest,Basics)34*9880d681SAndroid Build Coastguard Worker TEST_F(ConstantRangeTest, Basics) {
35*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Full.isFullSet());
36*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Full.isEmptySet());
37*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Full.inverse().isEmptySet());
38*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Full.isWrappedSet());
39*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Full.contains(APInt(16, 0x0)));
40*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Full.contains(APInt(16, 0x9)));
41*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Full.contains(APInt(16, 0xa)));
42*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Full.contains(APInt(16, 0xaa9)));
43*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Full.contains(APInt(16, 0xaaa)));
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Empty.isFullSet());
46*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Empty.isEmptySet());
47*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Empty.inverse().isFullSet());
48*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Empty.isWrappedSet());
49*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Empty.contains(APInt(16, 0x0)));
50*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Empty.contains(APInt(16, 0x9)));
51*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Empty.contains(APInt(16, 0xa)));
52*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Empty.contains(APInt(16, 0xaa9)));
53*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Empty.contains(APInt(16, 0xaaa)));
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(One.isFullSet());
56*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(One.isEmptySet());
57*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(One.isWrappedSet());
58*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(One.contains(APInt(16, 0x0)));
59*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(One.contains(APInt(16, 0x9)));
60*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(One.contains(APInt(16, 0xa)));
61*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(One.contains(APInt(16, 0xaa9)));
62*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(One.contains(APInt(16, 0xaaa)));
63*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(One.inverse().contains(APInt(16, 0xa)));
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Some.isFullSet());
66*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Some.isEmptySet());
67*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Some.isWrappedSet());
68*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Some.contains(APInt(16, 0x0)));
69*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Some.contains(APInt(16, 0x9)));
70*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Some.contains(APInt(16, 0xa)));
71*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Some.contains(APInt(16, 0xaa9)));
72*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Some.contains(APInt(16, 0xaaa)));
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Wrap.isFullSet());
75*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Wrap.isEmptySet());
76*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Wrap.isWrappedSet());
77*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Wrap.contains(APInt(16, 0x0)));
78*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Wrap.contains(APInt(16, 0x9)));
79*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Wrap.contains(APInt(16, 0xa)));
80*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Wrap.contains(APInt(16, 0xaa9)));
81*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Wrap.contains(APInt(16, 0xaaa)));
82*9880d681SAndroid Build Coastguard Worker }
83*9880d681SAndroid Build Coastguard Worker
TEST_F(ConstantRangeTest,Equality)84*9880d681SAndroid Build Coastguard Worker TEST_F(ConstantRangeTest, Equality) {
85*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full, Full);
86*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty, Empty);
87*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One, One);
88*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some, Some);
89*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Wrap, Wrap);
90*9880d681SAndroid Build Coastguard Worker EXPECT_NE(Full, Empty);
91*9880d681SAndroid Build Coastguard Worker EXPECT_NE(Full, One);
92*9880d681SAndroid Build Coastguard Worker EXPECT_NE(Full, Some);
93*9880d681SAndroid Build Coastguard Worker EXPECT_NE(Full, Wrap);
94*9880d681SAndroid Build Coastguard Worker EXPECT_NE(Empty, One);
95*9880d681SAndroid Build Coastguard Worker EXPECT_NE(Empty, Some);
96*9880d681SAndroid Build Coastguard Worker EXPECT_NE(Empty, Wrap);
97*9880d681SAndroid Build Coastguard Worker EXPECT_NE(One, Some);
98*9880d681SAndroid Build Coastguard Worker EXPECT_NE(One, Wrap);
99*9880d681SAndroid Build Coastguard Worker EXPECT_NE(Some, Wrap);
100*9880d681SAndroid Build Coastguard Worker }
101*9880d681SAndroid Build Coastguard Worker
TEST_F(ConstantRangeTest,SingleElement)102*9880d681SAndroid Build Coastguard Worker TEST_F(ConstantRangeTest, SingleElement) {
103*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.getSingleElement(), static_cast<APInt *>(nullptr));
104*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.getSingleElement(), static_cast<APInt *>(nullptr));
105*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(*One.getSingleElement(), APInt(16, 0xa));
106*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.getSingleElement(), static_cast<APInt *>(nullptr));
107*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Wrap.getSingleElement(), static_cast<APInt *>(nullptr));
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Full.isSingleElement());
110*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Empty.isSingleElement());
111*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(One.isSingleElement());
112*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Some.isSingleElement());
113*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Wrap.isSingleElement());
114*9880d681SAndroid Build Coastguard Worker }
115*9880d681SAndroid Build Coastguard Worker
TEST_F(ConstantRangeTest,GetSetSize)116*9880d681SAndroid Build Coastguard Worker TEST_F(ConstantRangeTest, GetSetSize) {
117*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.getSetSize(), APInt(17, 65536));
118*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.getSetSize(), APInt(17, 0));
119*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One.getSetSize(), APInt(17, 1));
120*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.getSetSize(), APInt(17, 0xaa0));
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Worker ConstantRange Wrap(APInt(4, 7), APInt(4, 3));
123*9880d681SAndroid Build Coastguard Worker ConstantRange Wrap2(APInt(4, 8), APInt(4, 7));
124*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Wrap.getSetSize(), APInt(5, 12));
125*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Wrap2.getSetSize(), APInt(5, 15));
126*9880d681SAndroid Build Coastguard Worker }
127*9880d681SAndroid Build Coastguard Worker
TEST_F(ConstantRangeTest,GetMinsAndMaxes)128*9880d681SAndroid Build Coastguard Worker TEST_F(ConstantRangeTest, GetMinsAndMaxes) {
129*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.getUnsignedMax(), APInt(16, UINT16_MAX));
130*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One.getUnsignedMax(), APInt(16, 0xa));
131*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.getUnsignedMax(), APInt(16, 0xaa9));
132*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Wrap.getUnsignedMax(), APInt(16, UINT16_MAX));
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.getUnsignedMin(), APInt(16, 0));
135*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One.getUnsignedMin(), APInt(16, 0xa));
136*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.getUnsignedMin(), APInt(16, 0xa));
137*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Wrap.getUnsignedMin(), APInt(16, 0));
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.getSignedMax(), APInt(16, INT16_MAX));
140*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One.getSignedMax(), APInt(16, 0xa));
141*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.getSignedMax(), APInt(16, 0xaa9));
142*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Wrap.getSignedMax(), APInt(16, INT16_MAX));
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.getSignedMin(), APInt(16, (uint64_t)INT16_MIN));
145*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One.getSignedMin(), APInt(16, 0xa));
146*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.getSignedMin(), APInt(16, 0xa));
147*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Wrap.getSignedMin(), APInt(16, (uint64_t)INT16_MIN));
148*9880d681SAndroid Build Coastguard Worker
149*9880d681SAndroid Build Coastguard Worker // Found by Klee
150*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ConstantRange(APInt(4, 7), APInt(4, 0)).getSignedMax(),
151*9880d681SAndroid Build Coastguard Worker APInt(4, 7));
152*9880d681SAndroid Build Coastguard Worker }
153*9880d681SAndroid Build Coastguard Worker
TEST_F(ConstantRangeTest,SignWrapped)154*9880d681SAndroid Build Coastguard Worker TEST_F(ConstantRangeTest, SignWrapped) {
155*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Full.isSignWrappedSet());
156*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Empty.isSignWrappedSet());
157*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(One.isSignWrappedSet());
158*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Some.isSignWrappedSet());
159*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(Wrap.isSignWrappedSet());
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(ConstantRange(APInt(8, 127), APInt(8, 128)).isSignWrappedSet());
162*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(ConstantRange(APInt(8, 127), APInt(8, 129)).isSignWrappedSet());
163*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(ConstantRange(APInt(8, 128), APInt(8, 129)).isSignWrappedSet());
164*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(ConstantRange(APInt(8, 10), APInt(8, 9)).isSignWrappedSet());
165*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(ConstantRange(APInt(8, 10), APInt(8, 250)).isSignWrappedSet());
166*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(ConstantRange(APInt(8, 250), APInt(8, 10)).isSignWrappedSet());
167*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(ConstantRange(APInt(8, 250), APInt(8, 251)).isSignWrappedSet());
168*9880d681SAndroid Build Coastguard Worker }
169*9880d681SAndroid Build Coastguard Worker
TEST_F(ConstantRangeTest,Trunc)170*9880d681SAndroid Build Coastguard Worker TEST_F(ConstantRangeTest, Trunc) {
171*9880d681SAndroid Build Coastguard Worker ConstantRange TFull = Full.truncate(10);
172*9880d681SAndroid Build Coastguard Worker ConstantRange TEmpty = Empty.truncate(10);
173*9880d681SAndroid Build Coastguard Worker ConstantRange TOne = One.truncate(10);
174*9880d681SAndroid Build Coastguard Worker ConstantRange TSome = Some.truncate(10);
175*9880d681SAndroid Build Coastguard Worker ConstantRange TWrap = Wrap.truncate(10);
176*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(TFull.isFullSet());
177*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(TEmpty.isEmptySet());
178*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(TOne, ConstantRange(One.getLower().trunc(10),
179*9880d681SAndroid Build Coastguard Worker One.getUpper().trunc(10)));
180*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(TSome.isFullSet());
181*9880d681SAndroid Build Coastguard Worker }
182*9880d681SAndroid Build Coastguard Worker
TEST_F(ConstantRangeTest,ZExt)183*9880d681SAndroid Build Coastguard Worker TEST_F(ConstantRangeTest, ZExt) {
184*9880d681SAndroid Build Coastguard Worker ConstantRange ZFull = Full.zeroExtend(20);
185*9880d681SAndroid Build Coastguard Worker ConstantRange ZEmpty = Empty.zeroExtend(20);
186*9880d681SAndroid Build Coastguard Worker ConstantRange ZOne = One.zeroExtend(20);
187*9880d681SAndroid Build Coastguard Worker ConstantRange ZSome = Some.zeroExtend(20);
188*9880d681SAndroid Build Coastguard Worker ConstantRange ZWrap = Wrap.zeroExtend(20);
189*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ZFull, ConstantRange(APInt(20, 0), APInt(20, 0x10000)));
190*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(ZEmpty.isEmptySet());
191*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ZOne, ConstantRange(One.getLower().zext(20),
192*9880d681SAndroid Build Coastguard Worker One.getUpper().zext(20)));
193*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ZSome, ConstantRange(Some.getLower().zext(20),
194*9880d681SAndroid Build Coastguard Worker Some.getUpper().zext(20)));
195*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ZWrap, ConstantRange(APInt(20, 0), APInt(20, 0x10000)));
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Worker // zext([5, 0), 3->7) = [5, 8)
198*9880d681SAndroid Build Coastguard Worker ConstantRange FiveZero(APInt(3, 5), APInt(3, 0));
199*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(FiveZero.zeroExtend(7), ConstantRange(APInt(7, 5), APInt(7, 8)));
200*9880d681SAndroid Build Coastguard Worker }
201*9880d681SAndroid Build Coastguard Worker
TEST_F(ConstantRangeTest,SExt)202*9880d681SAndroid Build Coastguard Worker TEST_F(ConstantRangeTest, SExt) {
203*9880d681SAndroid Build Coastguard Worker ConstantRange SFull = Full.signExtend(20);
204*9880d681SAndroid Build Coastguard Worker ConstantRange SEmpty = Empty.signExtend(20);
205*9880d681SAndroid Build Coastguard Worker ConstantRange SOne = One.signExtend(20);
206*9880d681SAndroid Build Coastguard Worker ConstantRange SSome = Some.signExtend(20);
207*9880d681SAndroid Build Coastguard Worker ConstantRange SWrap = Wrap.signExtend(20);
208*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(SFull, ConstantRange(APInt(20, (uint64_t)INT16_MIN, true),
209*9880d681SAndroid Build Coastguard Worker APInt(20, INT16_MAX + 1, true)));
210*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(SEmpty.isEmptySet());
211*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(SOne, ConstantRange(One.getLower().sext(20),
212*9880d681SAndroid Build Coastguard Worker One.getUpper().sext(20)));
213*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(SSome, ConstantRange(Some.getLower().sext(20),
214*9880d681SAndroid Build Coastguard Worker Some.getUpper().sext(20)));
215*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(SWrap, ConstantRange(APInt(20, (uint64_t)INT16_MIN, true),
216*9880d681SAndroid Build Coastguard Worker APInt(20, INT16_MAX + 1, true)));
217*9880d681SAndroid Build Coastguard Worker
218*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, 140)).signExtend(16),
219*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(16, -128), APInt(16, 128)));
220*9880d681SAndroid Build Coastguard Worker
221*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ConstantRange(APInt(16, 0x0200), APInt(16, 0x8000)).signExtend(19),
222*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(19, 0x0200), APInt(19, 0x8000)));
223*9880d681SAndroid Build Coastguard Worker }
224*9880d681SAndroid Build Coastguard Worker
TEST_F(ConstantRangeTest,IntersectWith)225*9880d681SAndroid Build Coastguard Worker TEST_F(ConstantRangeTest, IntersectWith) {
226*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.intersectWith(Full), Empty);
227*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.intersectWith(Empty), Empty);
228*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.intersectWith(One), Empty);
229*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.intersectWith(Some), Empty);
230*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.intersectWith(Wrap), Empty);
231*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.intersectWith(Full), Full);
232*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.intersectWith(Some), Some);
233*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.intersectWith(One), One);
234*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.intersectWith(One), One);
235*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.intersectWith(Some), Some);
236*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.intersectWith(Wrap), Empty);
237*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One.intersectWith(Wrap), Empty);
238*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One.intersectWith(Wrap), Wrap.intersectWith(One));
239*9880d681SAndroid Build Coastguard Worker
240*9880d681SAndroid Build Coastguard Worker // Klee generated testcase from PR4545.
241*9880d681SAndroid Build Coastguard Worker // The intersection of i16 [4, 2) and [6, 5) is disjoint, looking like
242*9880d681SAndroid Build Coastguard Worker // 01..4.6789ABCDEF where the dots represent values not in the intersection.
243*9880d681SAndroid Build Coastguard Worker ConstantRange LHS(APInt(16, 4), APInt(16, 2));
244*9880d681SAndroid Build Coastguard Worker ConstantRange RHS(APInt(16, 6), APInt(16, 5));
245*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(LHS.intersectWith(RHS) == LHS);
246*9880d681SAndroid Build Coastguard Worker
247*9880d681SAndroid Build Coastguard Worker // previous bug: intersection of [min, 3) and [2, max) should be 2
248*9880d681SAndroid Build Coastguard Worker LHS = ConstantRange(APInt(32, -2147483646), APInt(32, 3));
249*9880d681SAndroid Build Coastguard Worker RHS = ConstantRange(APInt(32, 2), APInt(32, 2147483646));
250*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 2)));
251*9880d681SAndroid Build Coastguard Worker
252*9880d681SAndroid Build Coastguard Worker // [2, 0) /\ [4, 3) = [2, 0)
253*9880d681SAndroid Build Coastguard Worker LHS = ConstantRange(APInt(32, 2), APInt(32, 0));
254*9880d681SAndroid Build Coastguard Worker RHS = ConstantRange(APInt(32, 4), APInt(32, 3));
255*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 2), APInt(32, 0)));
256*9880d681SAndroid Build Coastguard Worker
257*9880d681SAndroid Build Coastguard Worker // [2, 0) /\ [4, 2) = [4, 0)
258*9880d681SAndroid Build Coastguard Worker LHS = ConstantRange(APInt(32, 2), APInt(32, 0));
259*9880d681SAndroid Build Coastguard Worker RHS = ConstantRange(APInt(32, 4), APInt(32, 2));
260*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 4), APInt(32, 0)));
261*9880d681SAndroid Build Coastguard Worker
262*9880d681SAndroid Build Coastguard Worker // [4, 2) /\ [5, 1) = [5, 1)
263*9880d681SAndroid Build Coastguard Worker LHS = ConstantRange(APInt(32, 4), APInt(32, 2));
264*9880d681SAndroid Build Coastguard Worker RHS = ConstantRange(APInt(32, 5), APInt(32, 1));
265*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 5), APInt(32, 1)));
266*9880d681SAndroid Build Coastguard Worker
267*9880d681SAndroid Build Coastguard Worker // [2, 0) /\ [7, 4) = [7, 4)
268*9880d681SAndroid Build Coastguard Worker LHS = ConstantRange(APInt(32, 2), APInt(32, 0));
269*9880d681SAndroid Build Coastguard Worker RHS = ConstantRange(APInt(32, 7), APInt(32, 4));
270*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 7), APInt(32, 4)));
271*9880d681SAndroid Build Coastguard Worker
272*9880d681SAndroid Build Coastguard Worker // [4, 2) /\ [1, 0) = [1, 0)
273*9880d681SAndroid Build Coastguard Worker LHS = ConstantRange(APInt(32, 4), APInt(32, 2));
274*9880d681SAndroid Build Coastguard Worker RHS = ConstantRange(APInt(32, 1), APInt(32, 0));
275*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 4), APInt(32, 2)));
276*9880d681SAndroid Build Coastguard Worker
277*9880d681SAndroid Build Coastguard Worker // [15, 0) /\ [7, 6) = [15, 0)
278*9880d681SAndroid Build Coastguard Worker LHS = ConstantRange(APInt(32, 15), APInt(32, 0));
279*9880d681SAndroid Build Coastguard Worker RHS = ConstantRange(APInt(32, 7), APInt(32, 6));
280*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 15), APInt(32, 0)));
281*9880d681SAndroid Build Coastguard Worker }
282*9880d681SAndroid Build Coastguard Worker
TEST_F(ConstantRangeTest,UnionWith)283*9880d681SAndroid Build Coastguard Worker TEST_F(ConstantRangeTest, UnionWith) {
284*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Wrap.unionWith(One),
285*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(16, 0xaaa), APInt(16, 0xb)));
286*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One.unionWith(Wrap), Wrap.unionWith(One));
287*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.unionWith(Empty), Empty);
288*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.unionWith(Full), Full);
289*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.unionWith(Wrap), Full);
290*9880d681SAndroid Build Coastguard Worker
291*9880d681SAndroid Build Coastguard Worker // PR4545
292*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ConstantRange(APInt(16, 14), APInt(16, 1)).unionWith(
293*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(16, 0), APInt(16, 8))),
294*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(16, 14), APInt(16, 8)));
295*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ConstantRange(APInt(16, 6), APInt(16, 4)).unionWith(
296*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(16, 4), APInt(16, 0))),
297*9880d681SAndroid Build Coastguard Worker ConstantRange(16));
298*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ConstantRange(APInt(16, 1), APInt(16, 0)).unionWith(
299*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(16, 2), APInt(16, 1))),
300*9880d681SAndroid Build Coastguard Worker ConstantRange(16));
301*9880d681SAndroid Build Coastguard Worker }
302*9880d681SAndroid Build Coastguard Worker
TEST_F(ConstantRangeTest,SetDifference)303*9880d681SAndroid Build Coastguard Worker TEST_F(ConstantRangeTest, SetDifference) {
304*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.difference(Empty), Full);
305*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.difference(Full), Empty);
306*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.difference(Empty), Empty);
307*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.difference(Full), Empty);
308*9880d681SAndroid Build Coastguard Worker
309*9880d681SAndroid Build Coastguard Worker ConstantRange A(APInt(16, 3), APInt(16, 7));
310*9880d681SAndroid Build Coastguard Worker ConstantRange B(APInt(16, 5), APInt(16, 9));
311*9880d681SAndroid Build Coastguard Worker ConstantRange C(APInt(16, 3), APInt(16, 5));
312*9880d681SAndroid Build Coastguard Worker ConstantRange D(APInt(16, 7), APInt(16, 9));
313*9880d681SAndroid Build Coastguard Worker ConstantRange E(APInt(16, 5), APInt(16, 4));
314*9880d681SAndroid Build Coastguard Worker ConstantRange F(APInt(16, 7), APInt(16, 3));
315*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(A.difference(B), C);
316*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(B.difference(A), D);
317*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(E.difference(A), F);
318*9880d681SAndroid Build Coastguard Worker }
319*9880d681SAndroid Build Coastguard Worker
TEST_F(ConstantRangeTest,SubtractAPInt)320*9880d681SAndroid Build Coastguard Worker TEST_F(ConstantRangeTest, SubtractAPInt) {
321*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.subtract(APInt(16, 4)), Full);
322*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.subtract(APInt(16, 4)), Empty);
323*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.subtract(APInt(16, 4)),
324*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(16, 0x6), APInt(16, 0xaa6)));
325*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Wrap.subtract(APInt(16, 4)),
326*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(16, 0xaa6), APInt(16, 0x6)));
327*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One.subtract(APInt(16, 4)),
328*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(16, 0x6)));
329*9880d681SAndroid Build Coastguard Worker }
330*9880d681SAndroid Build Coastguard Worker
TEST_F(ConstantRangeTest,Add)331*9880d681SAndroid Build Coastguard Worker TEST_F(ConstantRangeTest, Add) {
332*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.add(APInt(16, 4)), Full);
333*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.add(Full), Full);
334*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.add(Empty), Empty);
335*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.add(One), Full);
336*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.add(Some), Full);
337*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.add(Wrap), Full);
338*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.add(Empty), Empty);
339*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.add(One), Empty);
340*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.add(Some), Empty);
341*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.add(Wrap), Empty);
342*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.add(APInt(16, 4)), Empty);
343*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.add(APInt(16, 4)),
344*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(16, 0xe), APInt(16, 0xaae)));
345*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Wrap.add(APInt(16, 4)),
346*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(16, 0xaae), APInt(16, 0xe)));
347*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One.add(APInt(16, 4)),
348*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(16, 0xe)));
349*9880d681SAndroid Build Coastguard Worker }
350*9880d681SAndroid Build Coastguard Worker
TEST_F(ConstantRangeTest,Sub)351*9880d681SAndroid Build Coastguard Worker TEST_F(ConstantRangeTest, Sub) {
352*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.sub(APInt(16, 4)), Full);
353*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.sub(Full), Full);
354*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.sub(Empty), Empty);
355*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.sub(One), Full);
356*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.sub(Some), Full);
357*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.sub(Wrap), Full);
358*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.sub(Empty), Empty);
359*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.sub(One), Empty);
360*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.sub(Some), Empty);
361*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.sub(Wrap), Empty);
362*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.sub(APInt(16, 4)), Empty);
363*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.sub(APInt(16, 4)),
364*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(16, 0x6), APInt(16, 0xaa6)));
365*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.sub(Some),
366*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(16, 0xf561), APInt(16, 0xaa0)));
367*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Wrap.sub(APInt(16, 4)),
368*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(16, 0xaa6), APInt(16, 0x6)));
369*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One.sub(APInt(16, 4)),
370*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(16, 0x6)));
371*9880d681SAndroid Build Coastguard Worker }
372*9880d681SAndroid Build Coastguard Worker
TEST_F(ConstantRangeTest,Multiply)373*9880d681SAndroid Build Coastguard Worker TEST_F(ConstantRangeTest, Multiply) {
374*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.multiply(Full), Full);
375*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.multiply(Empty), Empty);
376*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.multiply(One), Full);
377*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.multiply(Some), Full);
378*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.multiply(Wrap), Full);
379*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.multiply(Empty), Empty);
380*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.multiply(One), Empty);
381*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.multiply(Some), Empty);
382*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.multiply(Wrap), Empty);
383*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One.multiply(One), ConstantRange(APInt(16, 0xa*0xa),
384*9880d681SAndroid Build Coastguard Worker APInt(16, 0xa*0xa + 1)));
385*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One.multiply(Some), ConstantRange(APInt(16, 0xa*0xa),
386*9880d681SAndroid Build Coastguard Worker APInt(16, 0xa*0xaa9 + 1)));
387*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One.multiply(Wrap), Full);
388*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.multiply(Some), Full);
389*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.multiply(Wrap), Full);
390*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Wrap.multiply(Wrap), Full);
391*9880d681SAndroid Build Coastguard Worker
392*9880d681SAndroid Build Coastguard Worker ConstantRange Zero(APInt(16, 0));
393*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Zero.multiply(Full), Zero);
394*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Zero.multiply(Some), Zero);
395*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Zero.multiply(Wrap), Zero);
396*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.multiply(Zero), Zero);
397*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.multiply(Zero), Zero);
398*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Wrap.multiply(Zero), Zero);
399*9880d681SAndroid Build Coastguard Worker
400*9880d681SAndroid Build Coastguard Worker // http://llvm.org/PR4545
401*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ConstantRange(APInt(4, 1), APInt(4, 6)).multiply(
402*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(4, 6), APInt(4, 2))),
403*9880d681SAndroid Build Coastguard Worker ConstantRange(4, /*isFullSet=*/true));
404*9880d681SAndroid Build Coastguard Worker
405*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ConstantRange(APInt(8, 254), APInt(8, 0)).multiply(
406*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(8, 252), APInt(8, 4))),
407*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(8, 250), APInt(8, 9)));
408*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ConstantRange(APInt(8, 254), APInt(8, 255)).multiply(
409*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(8, 2), APInt(8, 4))),
410*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(8, 250), APInt(8, 253)));
411*9880d681SAndroid Build Coastguard Worker }
412*9880d681SAndroid Build Coastguard Worker
TEST_F(ConstantRangeTest,UMax)413*9880d681SAndroid Build Coastguard Worker TEST_F(ConstantRangeTest, UMax) {
414*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.umax(Full), Full);
415*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.umax(Empty), Empty);
416*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.umax(Some), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
417*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.umax(Wrap), Full);
418*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.umax(Some), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
419*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.umax(Empty), Empty);
420*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.umax(Some), Empty);
421*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.umax(Wrap), Empty);
422*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.umax(One), Empty);
423*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.umax(Some), Some);
424*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.umax(Wrap), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
425*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.umax(One), Some);
426*9880d681SAndroid Build Coastguard Worker // TODO: ConstantRange is currently over-conservative here.
427*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Wrap.umax(Wrap), Full);
428*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Wrap.umax(One), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
429*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One.umax(One), One);
430*9880d681SAndroid Build Coastguard Worker }
431*9880d681SAndroid Build Coastguard Worker
TEST_F(ConstantRangeTest,SMax)432*9880d681SAndroid Build Coastguard Worker TEST_F(ConstantRangeTest, SMax) {
433*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.smax(Full), Full);
434*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.smax(Empty), Empty);
435*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.smax(Some), ConstantRange(APInt(16, 0xa),
436*9880d681SAndroid Build Coastguard Worker APInt::getSignedMinValue(16)));
437*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.smax(Wrap), Full);
438*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.smax(One), ConstantRange(APInt(16, 0xa),
439*9880d681SAndroid Build Coastguard Worker APInt::getSignedMinValue(16)));
440*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.smax(Empty), Empty);
441*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.smax(Some), Empty);
442*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.smax(Wrap), Empty);
443*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.smax(One), Empty);
444*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.smax(Some), Some);
445*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.smax(Wrap), ConstantRange(APInt(16, 0xa),
446*9880d681SAndroid Build Coastguard Worker APInt(16, (uint64_t)INT16_MIN)));
447*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.smax(One), Some);
448*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Wrap.smax(One), ConstantRange(APInt(16, 0xa),
449*9880d681SAndroid Build Coastguard Worker APInt(16, (uint64_t)INT16_MIN)));
450*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One.smax(One), One);
451*9880d681SAndroid Build Coastguard Worker }
452*9880d681SAndroid Build Coastguard Worker
TEST_F(ConstantRangeTest,UMin)453*9880d681SAndroid Build Coastguard Worker TEST_F(ConstantRangeTest, UMin) {
454*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.umin(Full), Full);
455*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.umin(Empty), Empty);
456*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.umin(Some), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
457*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.umin(Wrap), Full);
458*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.umin(Empty), Empty);
459*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.umin(Some), Empty);
460*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.umin(Wrap), Empty);
461*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.umin(One), Empty);
462*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.umin(Some), Some);
463*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.umin(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
464*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.umin(One), One);
465*9880d681SAndroid Build Coastguard Worker // TODO: ConstantRange is currently over-conservative here.
466*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Wrap.umin(Wrap), Full);
467*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Wrap.umin(One), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
468*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One.umin(One), One);
469*9880d681SAndroid Build Coastguard Worker }
470*9880d681SAndroid Build Coastguard Worker
TEST_F(ConstantRangeTest,SMin)471*9880d681SAndroid Build Coastguard Worker TEST_F(ConstantRangeTest, SMin) {
472*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.smin(Full), Full);
473*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.smin(Empty), Empty);
474*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.smin(Some), ConstantRange(APInt(16, (uint64_t)INT16_MIN),
475*9880d681SAndroid Build Coastguard Worker APInt(16, 0xaaa)));
476*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.smin(Wrap), Full);
477*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.smin(Empty), Empty);
478*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.smin(Some), Empty);
479*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.smin(Wrap), Empty);
480*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.smin(One), Empty);
481*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.smin(Some), Some);
482*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.smin(Wrap), ConstantRange(APInt(16, (uint64_t)INT16_MIN),
483*9880d681SAndroid Build Coastguard Worker APInt(16, 0xaaa)));
484*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.smin(One), One);
485*9880d681SAndroid Build Coastguard Worker // TODO: ConstantRange is currently over-conservative here.
486*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Wrap.smin(Wrap), Full);
487*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Wrap.smin(One), ConstantRange(APInt(16, (uint64_t)INT16_MIN),
488*9880d681SAndroid Build Coastguard Worker APInt(16, 0xb)));
489*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One.smin(One), One);
490*9880d681SAndroid Build Coastguard Worker }
491*9880d681SAndroid Build Coastguard Worker
TEST_F(ConstantRangeTest,UDiv)492*9880d681SAndroid Build Coastguard Worker TEST_F(ConstantRangeTest, UDiv) {
493*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.udiv(Full), Full);
494*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.udiv(Empty), Empty);
495*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.udiv(One), ConstantRange(APInt(16, 0),
496*9880d681SAndroid Build Coastguard Worker APInt(16, 0xffff / 0xa + 1)));
497*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.udiv(Some), ConstantRange(APInt(16, 0),
498*9880d681SAndroid Build Coastguard Worker APInt(16, 0xffff / 0xa + 1)));
499*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.udiv(Wrap), Full);
500*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.udiv(Empty), Empty);
501*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.udiv(One), Empty);
502*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.udiv(Some), Empty);
503*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.udiv(Wrap), Empty);
504*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One.udiv(One), ConstantRange(APInt(16, 1)));
505*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One.udiv(Some), ConstantRange(APInt(16, 0), APInt(16, 2)));
506*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One.udiv(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
507*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.udiv(Some), ConstantRange(APInt(16, 0), APInt(16, 0x111)));
508*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.udiv(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
509*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Wrap.udiv(Wrap), Full);
510*9880d681SAndroid Build Coastguard Worker }
511*9880d681SAndroid Build Coastguard Worker
TEST_F(ConstantRangeTest,Shl)512*9880d681SAndroid Build Coastguard Worker TEST_F(ConstantRangeTest, Shl) {
513*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.shl(Full), Full);
514*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.shl(Empty), Empty);
515*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.shl(One), Full); // TODO: [0, (-1 << 0xa) + 1)
516*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.shl(Some), Full); // TODO: [0, (-1 << 0xa) + 1)
517*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.shl(Wrap), Full);
518*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.shl(Empty), Empty);
519*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.shl(One), Empty);
520*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.shl(Some), Empty);
521*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.shl(Wrap), Empty);
522*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One.shl(One), ConstantRange(APInt(16, 0xa << 0xa),
523*9880d681SAndroid Build Coastguard Worker APInt(16, (0xa << 0xa) + 1)));
524*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One.shl(Some), Full); // TODO: [0xa << 0xa, 0)
525*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One.shl(Wrap), Full); // TODO: [0xa, 0xa << 14 + 1)
526*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.shl(Some), Full); // TODO: [0xa << 0xa, 0xfc01)
527*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.shl(Wrap), Full); // TODO: [0xa, 0x7ff << 0x5 + 1)
528*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Wrap.shl(Wrap), Full);
529*9880d681SAndroid Build Coastguard Worker }
530*9880d681SAndroid Build Coastguard Worker
TEST_F(ConstantRangeTest,Lshr)531*9880d681SAndroid Build Coastguard Worker TEST_F(ConstantRangeTest, Lshr) {
532*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.lshr(Full), Full);
533*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.lshr(Empty), Empty);
534*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.lshr(One), ConstantRange(APInt(16, 0),
535*9880d681SAndroid Build Coastguard Worker APInt(16, (0xffff >> 0xa) + 1)));
536*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.lshr(Some), ConstantRange(APInt(16, 0),
537*9880d681SAndroid Build Coastguard Worker APInt(16, (0xffff >> 0xa) + 1)));
538*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Full.lshr(Wrap), Full);
539*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.lshr(Empty), Empty);
540*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.lshr(One), Empty);
541*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.lshr(Some), Empty);
542*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Empty.lshr(Wrap), Empty);
543*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One.lshr(One), ConstantRange(APInt(16, 0)));
544*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One.lshr(Some), ConstantRange(APInt(16, 0)));
545*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(One.lshr(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
546*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.lshr(Some), ConstantRange(APInt(16, 0),
547*9880d681SAndroid Build Coastguard Worker APInt(16, (0xaaa >> 0xa) + 1)));
548*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Some.lshr(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
549*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Wrap.lshr(Wrap), Full);
550*9880d681SAndroid Build Coastguard Worker }
551*9880d681SAndroid Build Coastguard Worker
TEST(ConstantRange,MakeAllowedICmpRegion)552*9880d681SAndroid Build Coastguard Worker TEST(ConstantRange, MakeAllowedICmpRegion) {
553*9880d681SAndroid Build Coastguard Worker // PR8250
554*9880d681SAndroid Build Coastguard Worker ConstantRange SMax = ConstantRange(APInt::getSignedMaxValue(32));
555*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(ConstantRange::makeAllowedICmpRegion(ICmpInst::ICMP_SGT, SMax)
556*9880d681SAndroid Build Coastguard Worker .isEmptySet());
557*9880d681SAndroid Build Coastguard Worker }
558*9880d681SAndroid Build Coastguard Worker
TEST(ConstantRange,MakeSatisfyingICmpRegion)559*9880d681SAndroid Build Coastguard Worker TEST(ConstantRange, MakeSatisfyingICmpRegion) {
560*9880d681SAndroid Build Coastguard Worker ConstantRange LowHalf(APInt(8, 0), APInt(8, 128));
561*9880d681SAndroid Build Coastguard Worker ConstantRange HighHalf(APInt(8, 128), APInt(8, 0));
562*9880d681SAndroid Build Coastguard Worker ConstantRange EmptySet(8, /* isFullSet = */ false);
563*9880d681SAndroid Build Coastguard Worker
564*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_NE, LowHalf),
565*9880d681SAndroid Build Coastguard Worker HighHalf);
566*9880d681SAndroid Build Coastguard Worker
567*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(
568*9880d681SAndroid Build Coastguard Worker ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_NE, HighHalf),
569*9880d681SAndroid Build Coastguard Worker LowHalf);
570*9880d681SAndroid Build Coastguard Worker
571*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_EQ,
572*9880d681SAndroid Build Coastguard Worker HighHalf).isEmptySet());
573*9880d681SAndroid Build Coastguard Worker
574*9880d681SAndroid Build Coastguard Worker ConstantRange UnsignedSample(APInt(8, 5), APInt(8, 200));
575*9880d681SAndroid Build Coastguard Worker
576*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_ULT,
577*9880d681SAndroid Build Coastguard Worker UnsignedSample),
578*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(8, 0), APInt(8, 5)));
579*9880d681SAndroid Build Coastguard Worker
580*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_ULE,
581*9880d681SAndroid Build Coastguard Worker UnsignedSample),
582*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(8, 0), APInt(8, 6)));
583*9880d681SAndroid Build Coastguard Worker
584*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_UGT,
585*9880d681SAndroid Build Coastguard Worker UnsignedSample),
586*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(8, 200), APInt(8, 0)));
587*9880d681SAndroid Build Coastguard Worker
588*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_UGE,
589*9880d681SAndroid Build Coastguard Worker UnsignedSample),
590*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(8, 199), APInt(8, 0)));
591*9880d681SAndroid Build Coastguard Worker
592*9880d681SAndroid Build Coastguard Worker ConstantRange SignedSample(APInt(8, -5), APInt(8, 5));
593*9880d681SAndroid Build Coastguard Worker
594*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(
595*9880d681SAndroid Build Coastguard Worker ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SLT, SignedSample),
596*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(8, -128), APInt(8, -5)));
597*9880d681SAndroid Build Coastguard Worker
598*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(
599*9880d681SAndroid Build Coastguard Worker ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SLE, SignedSample),
600*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(8, -128), APInt(8, -4)));
601*9880d681SAndroid Build Coastguard Worker
602*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(
603*9880d681SAndroid Build Coastguard Worker ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SGT, SignedSample),
604*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(8, 5), APInt(8, -128)));
605*9880d681SAndroid Build Coastguard Worker
606*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(
607*9880d681SAndroid Build Coastguard Worker ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SGE, SignedSample),
608*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(8, 4), APInt(8, -128)));
609*9880d681SAndroid Build Coastguard Worker }
610*9880d681SAndroid Build Coastguard Worker
TEST(ConstantRange,MakeGuaranteedNoWrapRegion)611*9880d681SAndroid Build Coastguard Worker TEST(ConstantRange, MakeGuaranteedNoWrapRegion) {
612*9880d681SAndroid Build Coastguard Worker const int IntMin4Bits = 8;
613*9880d681SAndroid Build Coastguard Worker const int IntMax4Bits = 7;
614*9880d681SAndroid Build Coastguard Worker typedef OverflowingBinaryOperator OBO;
615*9880d681SAndroid Build Coastguard Worker
616*9880d681SAndroid Build Coastguard Worker for (int Const : {0, -1, -2, 1, 2, IntMin4Bits, IntMax4Bits}) {
617*9880d681SAndroid Build Coastguard Worker APInt C(4, Const, true /* = isSigned */);
618*9880d681SAndroid Build Coastguard Worker
619*9880d681SAndroid Build Coastguard Worker auto NUWRegion = ConstantRange::makeGuaranteedNoWrapRegion(
620*9880d681SAndroid Build Coastguard Worker Instruction::Add, C, OBO::NoUnsignedWrap);
621*9880d681SAndroid Build Coastguard Worker
622*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(NUWRegion.isEmptySet());
623*9880d681SAndroid Build Coastguard Worker
624*9880d681SAndroid Build Coastguard Worker auto NSWRegion = ConstantRange::makeGuaranteedNoWrapRegion(
625*9880d681SAndroid Build Coastguard Worker Instruction::Add, C, OBO::NoSignedWrap);
626*9880d681SAndroid Build Coastguard Worker
627*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(NSWRegion.isEmptySet());
628*9880d681SAndroid Build Coastguard Worker
629*9880d681SAndroid Build Coastguard Worker auto NoWrapRegion = ConstantRange::makeGuaranteedNoWrapRegion(
630*9880d681SAndroid Build Coastguard Worker Instruction::Add, C, OBO::NoSignedWrap | OBO::NoUnsignedWrap);
631*9880d681SAndroid Build Coastguard Worker
632*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(NoWrapRegion.isEmptySet());
633*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(NUWRegion.intersectWith(NSWRegion).contains(NoWrapRegion));
634*9880d681SAndroid Build Coastguard Worker
635*9880d681SAndroid Build Coastguard Worker for (APInt I = NUWRegion.getLower(), E = NUWRegion.getUpper(); I != E;
636*9880d681SAndroid Build Coastguard Worker ++I) {
637*9880d681SAndroid Build Coastguard Worker bool Overflow = false;
638*9880d681SAndroid Build Coastguard Worker I.uadd_ov(C, Overflow);
639*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Overflow);
640*9880d681SAndroid Build Coastguard Worker }
641*9880d681SAndroid Build Coastguard Worker
642*9880d681SAndroid Build Coastguard Worker for (APInt I = NSWRegion.getLower(), E = NSWRegion.getUpper(); I != E;
643*9880d681SAndroid Build Coastguard Worker ++I) {
644*9880d681SAndroid Build Coastguard Worker bool Overflow = false;
645*9880d681SAndroid Build Coastguard Worker I.sadd_ov(C, Overflow);
646*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Overflow);
647*9880d681SAndroid Build Coastguard Worker }
648*9880d681SAndroid Build Coastguard Worker
649*9880d681SAndroid Build Coastguard Worker for (APInt I = NoWrapRegion.getLower(), E = NoWrapRegion.getUpper(); I != E;
650*9880d681SAndroid Build Coastguard Worker ++I) {
651*9880d681SAndroid Build Coastguard Worker bool Overflow = false;
652*9880d681SAndroid Build Coastguard Worker
653*9880d681SAndroid Build Coastguard Worker I.sadd_ov(C, Overflow);
654*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Overflow);
655*9880d681SAndroid Build Coastguard Worker
656*9880d681SAndroid Build Coastguard Worker I.uadd_ov(C, Overflow);
657*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(Overflow);
658*9880d681SAndroid Build Coastguard Worker }
659*9880d681SAndroid Build Coastguard Worker }
660*9880d681SAndroid Build Coastguard Worker
661*9880d681SAndroid Build Coastguard Worker auto NSWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion(
662*9880d681SAndroid Build Coastguard Worker Instruction::Add, ConstantRange(32, /* isFullSet = */ true),
663*9880d681SAndroid Build Coastguard Worker OBO::NoSignedWrap);
664*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(NSWForAllValues.isSingleElement() &&
665*9880d681SAndroid Build Coastguard Worker NSWForAllValues.getSingleElement()->isMinValue());
666*9880d681SAndroid Build Coastguard Worker
667*9880d681SAndroid Build Coastguard Worker auto NUWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion(
668*9880d681SAndroid Build Coastguard Worker Instruction::Add, ConstantRange(32, /* isFullSet = */ true),
669*9880d681SAndroid Build Coastguard Worker OBO::NoUnsignedWrap);
670*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(NUWForAllValues.isSingleElement() &&
671*9880d681SAndroid Build Coastguard Worker NSWForAllValues.getSingleElement()->isMinValue());
672*9880d681SAndroid Build Coastguard Worker
673*9880d681SAndroid Build Coastguard Worker auto NUWAndNSWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion(
674*9880d681SAndroid Build Coastguard Worker Instruction::Add, ConstantRange(32, /* isFullSet = */ true),
675*9880d681SAndroid Build Coastguard Worker OBO::NoUnsignedWrap | OBO::NoSignedWrap);
676*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(NUWAndNSWForAllValues.isSingleElement() &&
677*9880d681SAndroid Build Coastguard Worker NSWForAllValues.getSingleElement()->isMinValue());
678*9880d681SAndroid Build Coastguard Worker
679*9880d681SAndroid Build Coastguard Worker ConstantRange OneToFive(APInt(32, 1), APInt(32, 6));
680*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
681*9880d681SAndroid Build Coastguard Worker Instruction::Add, OneToFive, OBO::NoSignedWrap),
682*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt::getSignedMinValue(32),
683*9880d681SAndroid Build Coastguard Worker APInt::getSignedMaxValue(32) - 4));
684*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
685*9880d681SAndroid Build Coastguard Worker Instruction::Add, OneToFive, OBO::NoUnsignedWrap),
686*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt::getMinValue(32), APInt::getMinValue(32) - 5));
687*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(
688*9880d681SAndroid Build Coastguard Worker ConstantRange::makeGuaranteedNoWrapRegion(
689*9880d681SAndroid Build Coastguard Worker Instruction::Add, OneToFive, OBO::NoUnsignedWrap | OBO::NoSignedWrap),
690*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt::getMinValue(32), APInt::getSignedMaxValue(32) - 4));
691*9880d681SAndroid Build Coastguard Worker
692*9880d681SAndroid Build Coastguard Worker ConstantRange MinusFiveToMinusTwo(APInt(32, -5), APInt(32, -1));
693*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
694*9880d681SAndroid Build Coastguard Worker Instruction::Add, MinusFiveToMinusTwo, OBO::NoSignedWrap),
695*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt::getSignedMinValue(32) + 5,
696*9880d681SAndroid Build Coastguard Worker APInt::getSignedMinValue(32)));
697*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
698*9880d681SAndroid Build Coastguard Worker Instruction::Add, MinusFiveToMinusTwo, OBO::NoUnsignedWrap),
699*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(32, 0), APInt(32, 2)));
700*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
701*9880d681SAndroid Build Coastguard Worker Instruction::Add, MinusFiveToMinusTwo,
702*9880d681SAndroid Build Coastguard Worker OBO::NoUnsignedWrap | OBO::NoSignedWrap),
703*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(32, 0), APInt(32, 2)));
704*9880d681SAndroid Build Coastguard Worker
705*9880d681SAndroid Build Coastguard Worker ConstantRange MinusOneToOne(APInt(32, -1), APInt(32, 2));
706*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
707*9880d681SAndroid Build Coastguard Worker Instruction::Add, MinusOneToOne, OBO::NoSignedWrap),
708*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt::getSignedMinValue(32) + 1,
709*9880d681SAndroid Build Coastguard Worker APInt::getSignedMinValue(32) - 1));
710*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
711*9880d681SAndroid Build Coastguard Worker Instruction::Add, MinusOneToOne, OBO::NoUnsignedWrap),
712*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(32, 0), APInt(32, 1)));
713*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
714*9880d681SAndroid Build Coastguard Worker Instruction::Add, MinusOneToOne,
715*9880d681SAndroid Build Coastguard Worker OBO::NoUnsignedWrap | OBO::NoSignedWrap),
716*9880d681SAndroid Build Coastguard Worker ConstantRange(APInt(32, 0), APInt(32, 1)));
717*9880d681SAndroid Build Coastguard Worker }
718*9880d681SAndroid Build Coastguard Worker
TEST(ConstantRange,GetEquivalentICmp)719*9880d681SAndroid Build Coastguard Worker TEST(ConstantRange, GetEquivalentICmp) {
720*9880d681SAndroid Build Coastguard Worker APInt RHS;
721*9880d681SAndroid Build Coastguard Worker CmpInst::Predicate Pred;
722*9880d681SAndroid Build Coastguard Worker
723*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(ConstantRange(APInt::getMinValue(32), APInt(32, 100))
724*9880d681SAndroid Build Coastguard Worker .getEquivalentICmp(Pred, RHS));
725*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Pred, CmpInst::ICMP_ULT);
726*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(RHS, APInt(32, 100));
727*9880d681SAndroid Build Coastguard Worker
728*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(ConstantRange(APInt::getSignedMinValue(32), APInt(32, 100))
729*9880d681SAndroid Build Coastguard Worker .getEquivalentICmp(Pred, RHS));
730*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Pred, CmpInst::ICMP_SLT);
731*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(RHS, APInt(32, 100));
732*9880d681SAndroid Build Coastguard Worker
733*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(ConstantRange(APInt(32, 100), APInt::getMinValue(32))
734*9880d681SAndroid Build Coastguard Worker .getEquivalentICmp(Pred, RHS));
735*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Pred, CmpInst::ICMP_UGE);
736*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(RHS, APInt(32, 100));
737*9880d681SAndroid Build Coastguard Worker
738*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(ConstantRange(APInt(32, 100), APInt::getSignedMinValue(32))
739*9880d681SAndroid Build Coastguard Worker .getEquivalentICmp(Pred, RHS));
740*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Pred, CmpInst::ICMP_SGE);
741*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(RHS, APInt(32, 100));
742*9880d681SAndroid Build Coastguard Worker
743*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(
744*9880d681SAndroid Build Coastguard Worker ConstantRange(32, /*isFullSet=*/true).getEquivalentICmp(Pred, RHS));
745*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Pred, CmpInst::ICMP_UGE);
746*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(RHS, APInt(32, 0));
747*9880d681SAndroid Build Coastguard Worker
748*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(
749*9880d681SAndroid Build Coastguard Worker ConstantRange(32, /*isFullSet=*/false).getEquivalentICmp(Pred, RHS));
750*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(Pred, CmpInst::ICMP_ULT);
751*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(RHS, APInt(32, 0));
752*9880d681SAndroid Build Coastguard Worker
753*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(ConstantRange(APInt(32, 100), APInt(32, 200))
754*9880d681SAndroid Build Coastguard Worker .getEquivalentICmp(Pred, RHS));
755*9880d681SAndroid Build Coastguard Worker
756*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(ConstantRange(APInt::getSignedMinValue(32) - APInt(32, 100),
757*9880d681SAndroid Build Coastguard Worker APInt::getSignedMinValue(32) + APInt(32, 100))
758*9880d681SAndroid Build Coastguard Worker .getEquivalentICmp(Pred, RHS));
759*9880d681SAndroid Build Coastguard Worker
760*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(ConstantRange(APInt::getMinValue(32) - APInt(32, 100),
761*9880d681SAndroid Build Coastguard Worker APInt::getMinValue(32) + APInt(32, 100))
762*9880d681SAndroid Build Coastguard Worker .getEquivalentICmp(Pred, RHS));
763*9880d681SAndroid Build Coastguard Worker }
764*9880d681SAndroid Build Coastguard Worker
765*9880d681SAndroid Build Coastguard Worker } // anonymous namespace
766