ConstantRangeTest.cpp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509
  1. //===- llvm/unittest/Support/ConstantRangeTest.cpp - ConstantRange tests --===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. #include "llvm/Support/ConstantRange.h"
  10. #include "llvm/Instructions.h"
  11. #include "gtest/gtest.h"
  12. using namespace llvm;
  13. namespace {
  14. class ConstantRangeTest : public ::testing::Test {
  15. protected:
  16. static ConstantRange Full;
  17. static ConstantRange Empty;
  18. static ConstantRange One;
  19. static ConstantRange Some;
  20. static ConstantRange Wrap;
  21. };
  22. ConstantRange ConstantRangeTest::Full(16);
  23. ConstantRange ConstantRangeTest::Empty(16, false);
  24. ConstantRange ConstantRangeTest::One(APInt(16, 0xa));
  25. ConstantRange ConstantRangeTest::Some(APInt(16, 0xa), APInt(16, 0xaaa));
  26. ConstantRange ConstantRangeTest::Wrap(APInt(16, 0xaaa), APInt(16, 0xa));
  27. TEST_F(ConstantRangeTest, Basics) {
  28. EXPECT_TRUE(Full.isFullSet());
  29. EXPECT_FALSE(Full.isEmptySet());
  30. EXPECT_TRUE(Full.inverse().isEmptySet());
  31. EXPECT_FALSE(Full.isWrappedSet());
  32. EXPECT_TRUE(Full.contains(APInt(16, 0x0)));
  33. EXPECT_TRUE(Full.contains(APInt(16, 0x9)));
  34. EXPECT_TRUE(Full.contains(APInt(16, 0xa)));
  35. EXPECT_TRUE(Full.contains(APInt(16, 0xaa9)));
  36. EXPECT_TRUE(Full.contains(APInt(16, 0xaaa)));
  37. EXPECT_FALSE(Empty.isFullSet());
  38. EXPECT_TRUE(Empty.isEmptySet());
  39. EXPECT_TRUE(Empty.inverse().isFullSet());
  40. EXPECT_FALSE(Empty.isWrappedSet());
  41. EXPECT_FALSE(Empty.contains(APInt(16, 0x0)));
  42. EXPECT_FALSE(Empty.contains(APInt(16, 0x9)));
  43. EXPECT_FALSE(Empty.contains(APInt(16, 0xa)));
  44. EXPECT_FALSE(Empty.contains(APInt(16, 0xaa9)));
  45. EXPECT_FALSE(Empty.contains(APInt(16, 0xaaa)));
  46. EXPECT_FALSE(One.isFullSet());
  47. EXPECT_FALSE(One.isEmptySet());
  48. EXPECT_FALSE(One.isWrappedSet());
  49. EXPECT_FALSE(One.contains(APInt(16, 0x0)));
  50. EXPECT_FALSE(One.contains(APInt(16, 0x9)));
  51. EXPECT_TRUE(One.contains(APInt(16, 0xa)));
  52. EXPECT_FALSE(One.contains(APInt(16, 0xaa9)));
  53. EXPECT_FALSE(One.contains(APInt(16, 0xaaa)));
  54. EXPECT_FALSE(One.inverse().contains(APInt(16, 0xa)));
  55. EXPECT_FALSE(Some.isFullSet());
  56. EXPECT_FALSE(Some.isEmptySet());
  57. EXPECT_FALSE(Some.isWrappedSet());
  58. EXPECT_FALSE(Some.contains(APInt(16, 0x0)));
  59. EXPECT_FALSE(Some.contains(APInt(16, 0x9)));
  60. EXPECT_TRUE(Some.contains(APInt(16, 0xa)));
  61. EXPECT_TRUE(Some.contains(APInt(16, 0xaa9)));
  62. EXPECT_FALSE(Some.contains(APInt(16, 0xaaa)));
  63. EXPECT_FALSE(Wrap.isFullSet());
  64. EXPECT_FALSE(Wrap.isEmptySet());
  65. EXPECT_TRUE(Wrap.isWrappedSet());
  66. EXPECT_TRUE(Wrap.contains(APInt(16, 0x0)));
  67. EXPECT_TRUE(Wrap.contains(APInt(16, 0x9)));
  68. EXPECT_FALSE(Wrap.contains(APInt(16, 0xa)));
  69. EXPECT_FALSE(Wrap.contains(APInt(16, 0xaa9)));
  70. EXPECT_TRUE(Wrap.contains(APInt(16, 0xaaa)));
  71. }
  72. TEST_F(ConstantRangeTest, Equality) {
  73. EXPECT_EQ(Full, Full);
  74. EXPECT_EQ(Empty, Empty);
  75. EXPECT_EQ(One, One);
  76. EXPECT_EQ(Some, Some);
  77. EXPECT_EQ(Wrap, Wrap);
  78. EXPECT_NE(Full, Empty);
  79. EXPECT_NE(Full, One);
  80. EXPECT_NE(Full, Some);
  81. EXPECT_NE(Full, Wrap);
  82. EXPECT_NE(Empty, One);
  83. EXPECT_NE(Empty, Some);
  84. EXPECT_NE(Empty, Wrap);
  85. EXPECT_NE(One, Some);
  86. EXPECT_NE(One, Wrap);
  87. EXPECT_NE(Some, Wrap);
  88. }
  89. TEST_F(ConstantRangeTest, SingleElement) {
  90. EXPECT_EQ(Full.getSingleElement(), static_cast<APInt *>(NULL));
  91. EXPECT_EQ(Empty.getSingleElement(), static_cast<APInt *>(NULL));
  92. EXPECT_EQ(*One.getSingleElement(), APInt(16, 0xa));
  93. EXPECT_EQ(Some.getSingleElement(), static_cast<APInt *>(NULL));
  94. EXPECT_EQ(Wrap.getSingleElement(), static_cast<APInt *>(NULL));
  95. EXPECT_FALSE(Full.isSingleElement());
  96. EXPECT_FALSE(Empty.isSingleElement());
  97. EXPECT_TRUE(One.isSingleElement());
  98. EXPECT_FALSE(Some.isSingleElement());
  99. EXPECT_FALSE(Wrap.isSingleElement());
  100. }
  101. TEST_F(ConstantRangeTest, GetSetSize) {
  102. EXPECT_EQ(Full.getSetSize(), APInt(17, 65536));
  103. EXPECT_EQ(Empty.getSetSize(), APInt(17, 0));
  104. EXPECT_EQ(One.getSetSize(), APInt(17, 1));
  105. EXPECT_EQ(Some.getSetSize(), APInt(17, 0xaa0));
  106. ConstantRange Wrap(APInt(4, 7), APInt(4, 3));
  107. ConstantRange Wrap2(APInt(4, 8), APInt(4, 7));
  108. EXPECT_EQ(Wrap.getSetSize(), APInt(5, 12));
  109. EXPECT_EQ(Wrap2.getSetSize(), APInt(5, 15));
  110. }
  111. TEST_F(ConstantRangeTest, GetMinsAndMaxes) {
  112. EXPECT_EQ(Full.getUnsignedMax(), APInt(16, UINT16_MAX));
  113. EXPECT_EQ(One.getUnsignedMax(), APInt(16, 0xa));
  114. EXPECT_EQ(Some.getUnsignedMax(), APInt(16, 0xaa9));
  115. EXPECT_EQ(Wrap.getUnsignedMax(), APInt(16, UINT16_MAX));
  116. EXPECT_EQ(Full.getUnsignedMin(), APInt(16, 0));
  117. EXPECT_EQ(One.getUnsignedMin(), APInt(16, 0xa));
  118. EXPECT_EQ(Some.getUnsignedMin(), APInt(16, 0xa));
  119. EXPECT_EQ(Wrap.getUnsignedMin(), APInt(16, 0));
  120. EXPECT_EQ(Full.getSignedMax(), APInt(16, INT16_MAX));
  121. EXPECT_EQ(One.getSignedMax(), APInt(16, 0xa));
  122. EXPECT_EQ(Some.getSignedMax(), APInt(16, 0xaa9));
  123. EXPECT_EQ(Wrap.getSignedMax(), APInt(16, INT16_MAX));
  124. EXPECT_EQ(Full.getSignedMin(), APInt(16, (uint64_t)INT16_MIN));
  125. EXPECT_EQ(One.getSignedMin(), APInt(16, 0xa));
  126. EXPECT_EQ(Some.getSignedMin(), APInt(16, 0xa));
  127. EXPECT_EQ(Wrap.getSignedMin(), APInt(16, (uint64_t)INT16_MIN));
  128. // Found by Klee
  129. EXPECT_EQ(ConstantRange(APInt(4, 7), APInt(4, 0)).getSignedMax(),
  130. APInt(4, 7));
  131. }
  132. TEST_F(ConstantRangeTest, SignWrapped) {
  133. EXPECT_TRUE(Full.isSignWrappedSet());
  134. EXPECT_FALSE(Empty.isSignWrappedSet());
  135. EXPECT_FALSE(One.isSignWrappedSet());
  136. EXPECT_FALSE(Some.isSignWrappedSet());
  137. EXPECT_TRUE(Wrap.isSignWrappedSet());
  138. EXPECT_FALSE(ConstantRange(APInt(8, 127), APInt(8, 128)).isSignWrappedSet());
  139. EXPECT_TRUE(ConstantRange(APInt(8, 127), APInt(8, 129)).isSignWrappedSet());
  140. EXPECT_FALSE(ConstantRange(APInt(8, 128), APInt(8, 129)).isSignWrappedSet());
  141. EXPECT_TRUE(ConstantRange(APInt(8, 10), APInt(8, 9)).isSignWrappedSet());
  142. EXPECT_TRUE(ConstantRange(APInt(8, 10), APInt(8, 250)).isSignWrappedSet());
  143. EXPECT_FALSE(ConstantRange(APInt(8, 250), APInt(8, 10)).isSignWrappedSet());
  144. EXPECT_FALSE(ConstantRange(APInt(8, 250), APInt(8, 251)).isSignWrappedSet());
  145. }
  146. TEST_F(ConstantRangeTest, Trunc) {
  147. ConstantRange TFull = Full.truncate(10);
  148. ConstantRange TEmpty = Empty.truncate(10);
  149. ConstantRange TOne = One.truncate(10);
  150. ConstantRange TSome = Some.truncate(10);
  151. ConstantRange TWrap = Wrap.truncate(10);
  152. EXPECT_TRUE(TFull.isFullSet());
  153. EXPECT_TRUE(TEmpty.isEmptySet());
  154. EXPECT_EQ(TOne, ConstantRange(One.getLower().trunc(10),
  155. One.getUpper().trunc(10)));
  156. EXPECT_TRUE(TSome.isFullSet());
  157. }
  158. TEST_F(ConstantRangeTest, ZExt) {
  159. ConstantRange ZFull = Full.zeroExtend(20);
  160. ConstantRange ZEmpty = Empty.zeroExtend(20);
  161. ConstantRange ZOne = One.zeroExtend(20);
  162. ConstantRange ZSome = Some.zeroExtend(20);
  163. ConstantRange ZWrap = Wrap.zeroExtend(20);
  164. EXPECT_EQ(ZFull, ConstantRange(APInt(20, 0), APInt(20, 0x10000)));
  165. EXPECT_TRUE(ZEmpty.isEmptySet());
  166. EXPECT_EQ(ZOne, ConstantRange(One.getLower().zext(20),
  167. One.getUpper().zext(20)));
  168. EXPECT_EQ(ZSome, ConstantRange(Some.getLower().zext(20),
  169. Some.getUpper().zext(20)));
  170. EXPECT_EQ(ZWrap, ConstantRange(APInt(20, 0), APInt(20, 0x10000)));
  171. // zext([5, 0), 3->7) = [5, 8)
  172. ConstantRange FiveZero(APInt(3, 5), APInt(3, 0));
  173. EXPECT_EQ(FiveZero.zeroExtend(7), ConstantRange(APInt(7, 5), APInt(7, 8)));
  174. }
  175. TEST_F(ConstantRangeTest, SExt) {
  176. ConstantRange SFull = Full.signExtend(20);
  177. ConstantRange SEmpty = Empty.signExtend(20);
  178. ConstantRange SOne = One.signExtend(20);
  179. ConstantRange SSome = Some.signExtend(20);
  180. ConstantRange SWrap = Wrap.signExtend(20);
  181. EXPECT_EQ(SFull, ConstantRange(APInt(20, (uint64_t)INT16_MIN, true),
  182. APInt(20, INT16_MAX + 1, true)));
  183. EXPECT_TRUE(SEmpty.isEmptySet());
  184. EXPECT_EQ(SOne, ConstantRange(One.getLower().sext(20),
  185. One.getUpper().sext(20)));
  186. EXPECT_EQ(SSome, ConstantRange(Some.getLower().sext(20),
  187. Some.getUpper().sext(20)));
  188. EXPECT_EQ(SWrap, ConstantRange(APInt(20, (uint64_t)INT16_MIN, true),
  189. APInt(20, INT16_MAX + 1, true)));
  190. EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, 140)).signExtend(16),
  191. ConstantRange(APInt(16, -128), APInt(16, 128)));
  192. }
  193. TEST_F(ConstantRangeTest, IntersectWith) {
  194. EXPECT_EQ(Empty.intersectWith(Full), Empty);
  195. EXPECT_EQ(Empty.intersectWith(Empty), Empty);
  196. EXPECT_EQ(Empty.intersectWith(One), Empty);
  197. EXPECT_EQ(Empty.intersectWith(Some), Empty);
  198. EXPECT_EQ(Empty.intersectWith(Wrap), Empty);
  199. EXPECT_EQ(Full.intersectWith(Full), Full);
  200. EXPECT_EQ(Some.intersectWith(Some), Some);
  201. EXPECT_EQ(Some.intersectWith(One), One);
  202. EXPECT_EQ(Full.intersectWith(One), One);
  203. EXPECT_EQ(Full.intersectWith(Some), Some);
  204. EXPECT_EQ(Some.intersectWith(Wrap), Empty);
  205. EXPECT_EQ(One.intersectWith(Wrap), Empty);
  206. EXPECT_EQ(One.intersectWith(Wrap), Wrap.intersectWith(One));
  207. // Klee generated testcase from PR4545.
  208. // The intersection of i16 [4, 2) and [6, 5) is disjoint, looking like
  209. // 01..4.6789ABCDEF where the dots represent values not in the intersection.
  210. ConstantRange LHS(APInt(16, 4), APInt(16, 2));
  211. ConstantRange RHS(APInt(16, 6), APInt(16, 5));
  212. EXPECT_TRUE(LHS.intersectWith(RHS) == LHS);
  213. // previous bug: intersection of [min, 3) and [2, max) should be 2
  214. LHS = ConstantRange(APInt(32, -2147483646), APInt(32, 3));
  215. RHS = ConstantRange(APInt(32, 2), APInt(32, 2147483646));
  216. EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 2)));
  217. // [2, 0) /\ [4, 3) = [2, 0)
  218. LHS = ConstantRange(APInt(32, 2), APInt(32, 0));
  219. RHS = ConstantRange(APInt(32, 4), APInt(32, 3));
  220. EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 2), APInt(32, 0)));
  221. // [2, 0) /\ [4, 2) = [4, 0)
  222. LHS = ConstantRange(APInt(32, 2), APInt(32, 0));
  223. RHS = ConstantRange(APInt(32, 4), APInt(32, 2));
  224. EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 4), APInt(32, 0)));
  225. // [4, 2) /\ [5, 1) = [5, 1)
  226. LHS = ConstantRange(APInt(32, 4), APInt(32, 2));
  227. RHS = ConstantRange(APInt(32, 5), APInt(32, 1));
  228. EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 5), APInt(32, 1)));
  229. // [2, 0) /\ [7, 4) = [7, 4)
  230. LHS = ConstantRange(APInt(32, 2), APInt(32, 0));
  231. RHS = ConstantRange(APInt(32, 7), APInt(32, 4));
  232. EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 7), APInt(32, 4)));
  233. // [4, 2) /\ [1, 0) = [1, 0)
  234. LHS = ConstantRange(APInt(32, 4), APInt(32, 2));
  235. RHS = ConstantRange(APInt(32, 1), APInt(32, 0));
  236. EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 4), APInt(32, 2)));
  237. // [15, 0) /\ [7, 6) = [15, 0)
  238. LHS = ConstantRange(APInt(32, 15), APInt(32, 0));
  239. RHS = ConstantRange(APInt(32, 7), APInt(32, 6));
  240. EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 15), APInt(32, 0)));
  241. }
  242. TEST_F(ConstantRangeTest, UnionWith) {
  243. EXPECT_EQ(Wrap.unionWith(One),
  244. ConstantRange(APInt(16, 0xaaa), APInt(16, 0xb)));
  245. EXPECT_EQ(One.unionWith(Wrap), Wrap.unionWith(One));
  246. EXPECT_EQ(Empty.unionWith(Empty), Empty);
  247. EXPECT_EQ(Full.unionWith(Full), Full);
  248. EXPECT_EQ(Some.unionWith(Wrap), Full);
  249. // PR4545
  250. EXPECT_EQ(ConstantRange(APInt(16, 14), APInt(16, 1)).unionWith(
  251. ConstantRange(APInt(16, 0), APInt(16, 8))),
  252. ConstantRange(APInt(16, 14), APInt(16, 8)));
  253. EXPECT_EQ(ConstantRange(APInt(16, 6), APInt(16, 4)).unionWith(
  254. ConstantRange(APInt(16, 4), APInt(16, 0))),
  255. ConstantRange(16));
  256. EXPECT_EQ(ConstantRange(APInt(16, 1), APInt(16, 0)).unionWith(
  257. ConstantRange(APInt(16, 2), APInt(16, 1))),
  258. ConstantRange(16));
  259. }
  260. TEST_F(ConstantRangeTest, SetDifference) {
  261. EXPECT_EQ(Full.difference(Empty), Full);
  262. EXPECT_EQ(Full.difference(Full), Empty);
  263. EXPECT_EQ(Empty.difference(Empty), Empty);
  264. EXPECT_EQ(Empty.difference(Full), Empty);
  265. ConstantRange A(APInt(16, 3), APInt(16, 7));
  266. ConstantRange B(APInt(16, 5), APInt(16, 9));
  267. ConstantRange C(APInt(16, 3), APInt(16, 5));
  268. ConstantRange D(APInt(16, 7), APInt(16, 9));
  269. ConstantRange E(APInt(16, 5), APInt(16, 4));
  270. ConstantRange F(APInt(16, 7), APInt(16, 3));
  271. EXPECT_EQ(A.difference(B), C);
  272. EXPECT_EQ(B.difference(A), D);
  273. EXPECT_EQ(E.difference(A), F);
  274. }
  275. TEST_F(ConstantRangeTest, SubtractAPInt) {
  276. EXPECT_EQ(Full.subtract(APInt(16, 4)), Full);
  277. EXPECT_EQ(Empty.subtract(APInt(16, 4)), Empty);
  278. EXPECT_EQ(Some.subtract(APInt(16, 4)),
  279. ConstantRange(APInt(16, 0x6), APInt(16, 0xaa6)));
  280. EXPECT_EQ(Wrap.subtract(APInt(16, 4)),
  281. ConstantRange(APInt(16, 0xaa6), APInt(16, 0x6)));
  282. EXPECT_EQ(One.subtract(APInt(16, 4)),
  283. ConstantRange(APInt(16, 0x6)));
  284. }
  285. TEST_F(ConstantRangeTest, Add) {
  286. EXPECT_EQ(Full.add(APInt(16, 4)), Full);
  287. EXPECT_EQ(Full.add(Full), Full);
  288. EXPECT_EQ(Full.add(Empty), Empty);
  289. EXPECT_EQ(Full.add(One), Full);
  290. EXPECT_EQ(Full.add(Some), Full);
  291. EXPECT_EQ(Full.add(Wrap), Full);
  292. EXPECT_EQ(Empty.add(Empty), Empty);
  293. EXPECT_EQ(Empty.add(One), Empty);
  294. EXPECT_EQ(Empty.add(Some), Empty);
  295. EXPECT_EQ(Empty.add(Wrap), Empty);
  296. EXPECT_EQ(Empty.add(APInt(16, 4)), Empty);
  297. EXPECT_EQ(Some.add(APInt(16, 4)),
  298. ConstantRange(APInt(16, 0xe), APInt(16, 0xaae)));
  299. EXPECT_EQ(Wrap.add(APInt(16, 4)),
  300. ConstantRange(APInt(16, 0xaae), APInt(16, 0xe)));
  301. EXPECT_EQ(One.add(APInt(16, 4)),
  302. ConstantRange(APInt(16, 0xe)));
  303. }
  304. TEST_F(ConstantRangeTest, Sub) {
  305. EXPECT_EQ(Full.sub(APInt(16, 4)), Full);
  306. EXPECT_EQ(Full.sub(Full), Full);
  307. EXPECT_EQ(Full.sub(Empty), Empty);
  308. EXPECT_EQ(Full.sub(One), Full);
  309. EXPECT_EQ(Full.sub(Some), Full);
  310. EXPECT_EQ(Full.sub(Wrap), Full);
  311. EXPECT_EQ(Empty.sub(Empty), Empty);
  312. EXPECT_EQ(Empty.sub(One), Empty);
  313. EXPECT_EQ(Empty.sub(Some), Empty);
  314. EXPECT_EQ(Empty.sub(Wrap), Empty);
  315. EXPECT_EQ(Empty.sub(APInt(16, 4)), Empty);
  316. EXPECT_EQ(Some.sub(APInt(16, 4)),
  317. ConstantRange(APInt(16, 0x6), APInt(16, 0xaa6)));
  318. EXPECT_EQ(Some.sub(Some),
  319. ConstantRange(APInt(16, 0xf561), APInt(16, 0xaa0)));
  320. EXPECT_EQ(Wrap.sub(APInt(16, 4)),
  321. ConstantRange(APInt(16, 0xaa6), APInt(16, 0x6)));
  322. EXPECT_EQ(One.sub(APInt(16, 4)),
  323. ConstantRange(APInt(16, 0x6)));
  324. }
  325. TEST_F(ConstantRangeTest, Multiply) {
  326. EXPECT_EQ(Full.multiply(Full), Full);
  327. EXPECT_EQ(Full.multiply(Empty), Empty);
  328. EXPECT_EQ(Full.multiply(One), Full);
  329. EXPECT_EQ(Full.multiply(Some), Full);
  330. EXPECT_EQ(Full.multiply(Wrap), Full);
  331. EXPECT_EQ(Empty.multiply(Empty), Empty);
  332. EXPECT_EQ(Empty.multiply(One), Empty);
  333. EXPECT_EQ(Empty.multiply(Some), Empty);
  334. EXPECT_EQ(Empty.multiply(Wrap), Empty);
  335. EXPECT_EQ(One.multiply(One), ConstantRange(APInt(16, 0xa*0xa),
  336. APInt(16, 0xa*0xa + 1)));
  337. EXPECT_EQ(One.multiply(Some), ConstantRange(APInt(16, 0xa*0xa),
  338. APInt(16, 0xa*0xaa9 + 1)));
  339. EXPECT_EQ(One.multiply(Wrap), Full);
  340. EXPECT_EQ(Some.multiply(Some), Full);
  341. EXPECT_EQ(Some.multiply(Wrap), Full);
  342. EXPECT_EQ(Wrap.multiply(Wrap), Full);
  343. ConstantRange Zero(APInt(16, 0));
  344. EXPECT_EQ(Zero.multiply(Full), Zero);
  345. EXPECT_EQ(Zero.multiply(Some), Zero);
  346. EXPECT_EQ(Zero.multiply(Wrap), Zero);
  347. EXPECT_EQ(Full.multiply(Zero), Zero);
  348. EXPECT_EQ(Some.multiply(Zero), Zero);
  349. EXPECT_EQ(Wrap.multiply(Zero), Zero);
  350. // http://llvm.org/PR4545
  351. EXPECT_EQ(ConstantRange(APInt(4, 1), APInt(4, 6)).multiply(
  352. ConstantRange(APInt(4, 6), APInt(4, 2))),
  353. ConstantRange(4, /*isFullSet=*/true));
  354. }
  355. TEST_F(ConstantRangeTest, UMax) {
  356. EXPECT_EQ(Full.umax(Full), Full);
  357. EXPECT_EQ(Full.umax(Empty), Empty);
  358. EXPECT_EQ(Full.umax(Some), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
  359. EXPECT_EQ(Full.umax(Wrap), Full);
  360. EXPECT_EQ(Full.umax(Some), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
  361. EXPECT_EQ(Empty.umax(Empty), Empty);
  362. EXPECT_EQ(Empty.umax(Some), Empty);
  363. EXPECT_EQ(Empty.umax(Wrap), Empty);
  364. EXPECT_EQ(Empty.umax(One), Empty);
  365. EXPECT_EQ(Some.umax(Some), Some);
  366. EXPECT_EQ(Some.umax(Wrap), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
  367. EXPECT_EQ(Some.umax(One), Some);
  368. // TODO: ConstantRange is currently over-conservative here.
  369. EXPECT_EQ(Wrap.umax(Wrap), Full);
  370. EXPECT_EQ(Wrap.umax(One), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
  371. EXPECT_EQ(One.umax(One), One);
  372. }
  373. TEST_F(ConstantRangeTest, SMax) {
  374. EXPECT_EQ(Full.smax(Full), Full);
  375. EXPECT_EQ(Full.smax(Empty), Empty);
  376. EXPECT_EQ(Full.smax(Some), ConstantRange(APInt(16, 0xa),
  377. APInt::getSignedMinValue(16)));
  378. EXPECT_EQ(Full.smax(Wrap), Full);
  379. EXPECT_EQ(Full.smax(One), ConstantRange(APInt(16, 0xa),
  380. APInt::getSignedMinValue(16)));
  381. EXPECT_EQ(Empty.smax(Empty), Empty);
  382. EXPECT_EQ(Empty.smax(Some), Empty);
  383. EXPECT_EQ(Empty.smax(Wrap), Empty);
  384. EXPECT_EQ(Empty.smax(One), Empty);
  385. EXPECT_EQ(Some.smax(Some), Some);
  386. EXPECT_EQ(Some.smax(Wrap), ConstantRange(APInt(16, 0xa),
  387. APInt(16, (uint64_t)INT16_MIN)));
  388. EXPECT_EQ(Some.smax(One), Some);
  389. EXPECT_EQ(Wrap.smax(One), ConstantRange(APInt(16, 0xa),
  390. APInt(16, (uint64_t)INT16_MIN)));
  391. EXPECT_EQ(One.smax(One), One);
  392. }
  393. TEST_F(ConstantRangeTest, UDiv) {
  394. EXPECT_EQ(Full.udiv(Full), Full);
  395. EXPECT_EQ(Full.udiv(Empty), Empty);
  396. EXPECT_EQ(Full.udiv(One), ConstantRange(APInt(16, 0),
  397. APInt(16, 0xffff / 0xa + 1)));
  398. EXPECT_EQ(Full.udiv(Some), ConstantRange(APInt(16, 0),
  399. APInt(16, 0xffff / 0xa + 1)));
  400. EXPECT_EQ(Full.udiv(Wrap), Full);
  401. EXPECT_EQ(Empty.udiv(Empty), Empty);
  402. EXPECT_EQ(Empty.udiv(One), Empty);
  403. EXPECT_EQ(Empty.udiv(Some), Empty);
  404. EXPECT_EQ(Empty.udiv(Wrap), Empty);
  405. EXPECT_EQ(One.udiv(One), ConstantRange(APInt(16, 1)));
  406. EXPECT_EQ(One.udiv(Some), ConstantRange(APInt(16, 0), APInt(16, 2)));
  407. EXPECT_EQ(One.udiv(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
  408. EXPECT_EQ(Some.udiv(Some), ConstantRange(APInt(16, 0), APInt(16, 0x111)));
  409. EXPECT_EQ(Some.udiv(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
  410. EXPECT_EQ(Wrap.udiv(Wrap), Full);
  411. }
  412. TEST_F(ConstantRangeTest, Shl) {
  413. EXPECT_EQ(Full.shl(Full), Full);
  414. EXPECT_EQ(Full.shl(Empty), Empty);
  415. EXPECT_EQ(Full.shl(One), Full); // TODO: [0, (-1 << 0xa) + 1)
  416. EXPECT_EQ(Full.shl(Some), Full); // TODO: [0, (-1 << 0xa) + 1)
  417. EXPECT_EQ(Full.shl(Wrap), Full);
  418. EXPECT_EQ(Empty.shl(Empty), Empty);
  419. EXPECT_EQ(Empty.shl(One), Empty);
  420. EXPECT_EQ(Empty.shl(Some), Empty);
  421. EXPECT_EQ(Empty.shl(Wrap), Empty);
  422. EXPECT_EQ(One.shl(One), ConstantRange(APInt(16, 0xa << 0xa),
  423. APInt(16, (0xa << 0xa) + 1)));
  424. EXPECT_EQ(One.shl(Some), Full); // TODO: [0xa << 0xa, 0)
  425. EXPECT_EQ(One.shl(Wrap), Full); // TODO: [0xa, 0xa << 14 + 1)
  426. EXPECT_EQ(Some.shl(Some), Full); // TODO: [0xa << 0xa, 0xfc01)
  427. EXPECT_EQ(Some.shl(Wrap), Full); // TODO: [0xa, 0x7ff << 0x5 + 1)
  428. EXPECT_EQ(Wrap.shl(Wrap), Full);
  429. }
  430. TEST_F(ConstantRangeTest, Lshr) {
  431. EXPECT_EQ(Full.lshr(Full), Full);
  432. EXPECT_EQ(Full.lshr(Empty), Empty);
  433. EXPECT_EQ(Full.lshr(One), ConstantRange(APInt(16, 0),
  434. APInt(16, (0xffff >> 0xa) + 1)));
  435. EXPECT_EQ(Full.lshr(Some), ConstantRange(APInt(16, 0),
  436. APInt(16, (0xffff >> 0xa) + 1)));
  437. EXPECT_EQ(Full.lshr(Wrap), Full);
  438. EXPECT_EQ(Empty.lshr(Empty), Empty);
  439. EXPECT_EQ(Empty.lshr(One), Empty);
  440. EXPECT_EQ(Empty.lshr(Some), Empty);
  441. EXPECT_EQ(Empty.lshr(Wrap), Empty);
  442. EXPECT_EQ(One.lshr(One), ConstantRange(APInt(16, 0)));
  443. EXPECT_EQ(One.lshr(Some), ConstantRange(APInt(16, 0)));
  444. EXPECT_EQ(One.lshr(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
  445. EXPECT_EQ(Some.lshr(Some), ConstantRange(APInt(16, 0),
  446. APInt(16, (0xaaa >> 0xa) + 1)));
  447. EXPECT_EQ(Some.lshr(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
  448. EXPECT_EQ(Wrap.lshr(Wrap), Full);
  449. }
  450. TEST(ConstantRange, MakeICmpRegion) {
  451. // PR8250
  452. ConstantRange SMax = ConstantRange(APInt::getSignedMaxValue(32));
  453. EXPECT_TRUE(ConstantRange::makeICmpRegion(ICmpInst::ICMP_SGT,
  454. SMax).isEmptySet());
  455. }
  456. } // anonymous namespace