ConstantRangeTest.cpp 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571
  1. //===- 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/IR/ConstantRange.h"
  10. #include "llvm/IR/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 *>(nullptr));
  91. EXPECT_EQ(Empty.getSingleElement(), static_cast<APInt *>(nullptr));
  92. EXPECT_EQ(*One.getSingleElement(), APInt(16, 0xa));
  93. EXPECT_EQ(Some.getSingleElement(), static_cast<APInt *>(nullptr));
  94. EXPECT_EQ(Wrap.getSingleElement(), static_cast<APInt *>(nullptr));
  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. EXPECT_EQ(ConstantRange(APInt(16, 0x0200), APInt(16, 0x8000)).signExtend(19),
  193. ConstantRange(APInt(19, 0x0200), APInt(19, 0x8000)));
  194. }
  195. TEST_F(ConstantRangeTest, IntersectWith) {
  196. EXPECT_EQ(Empty.intersectWith(Full), Empty);
  197. EXPECT_EQ(Empty.intersectWith(Empty), Empty);
  198. EXPECT_EQ(Empty.intersectWith(One), Empty);
  199. EXPECT_EQ(Empty.intersectWith(Some), Empty);
  200. EXPECT_EQ(Empty.intersectWith(Wrap), Empty);
  201. EXPECT_EQ(Full.intersectWith(Full), Full);
  202. EXPECT_EQ(Some.intersectWith(Some), Some);
  203. EXPECT_EQ(Some.intersectWith(One), One);
  204. EXPECT_EQ(Full.intersectWith(One), One);
  205. EXPECT_EQ(Full.intersectWith(Some), Some);
  206. EXPECT_EQ(Some.intersectWith(Wrap), Empty);
  207. EXPECT_EQ(One.intersectWith(Wrap), Empty);
  208. EXPECT_EQ(One.intersectWith(Wrap), Wrap.intersectWith(One));
  209. // Klee generated testcase from PR4545.
  210. // The intersection of i16 [4, 2) and [6, 5) is disjoint, looking like
  211. // 01..4.6789ABCDEF where the dots represent values not in the intersection.
  212. ConstantRange LHS(APInt(16, 4), APInt(16, 2));
  213. ConstantRange RHS(APInt(16, 6), APInt(16, 5));
  214. EXPECT_TRUE(LHS.intersectWith(RHS) == LHS);
  215. // previous bug: intersection of [min, 3) and [2, max) should be 2
  216. LHS = ConstantRange(APInt(32, -2147483646), APInt(32, 3));
  217. RHS = ConstantRange(APInt(32, 2), APInt(32, 2147483646));
  218. EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 2)));
  219. // [2, 0) /\ [4, 3) = [2, 0)
  220. LHS = ConstantRange(APInt(32, 2), APInt(32, 0));
  221. RHS = ConstantRange(APInt(32, 4), APInt(32, 3));
  222. EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 2), APInt(32, 0)));
  223. // [2, 0) /\ [4, 2) = [4, 0)
  224. LHS = ConstantRange(APInt(32, 2), APInt(32, 0));
  225. RHS = ConstantRange(APInt(32, 4), APInt(32, 2));
  226. EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 4), APInt(32, 0)));
  227. // [4, 2) /\ [5, 1) = [5, 1)
  228. LHS = ConstantRange(APInt(32, 4), APInt(32, 2));
  229. RHS = ConstantRange(APInt(32, 5), APInt(32, 1));
  230. EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 5), APInt(32, 1)));
  231. // [2, 0) /\ [7, 4) = [7, 4)
  232. LHS = ConstantRange(APInt(32, 2), APInt(32, 0));
  233. RHS = ConstantRange(APInt(32, 7), APInt(32, 4));
  234. EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 7), APInt(32, 4)));
  235. // [4, 2) /\ [1, 0) = [1, 0)
  236. LHS = ConstantRange(APInt(32, 4), APInt(32, 2));
  237. RHS = ConstantRange(APInt(32, 1), APInt(32, 0));
  238. EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 4), APInt(32, 2)));
  239. // [15, 0) /\ [7, 6) = [15, 0)
  240. LHS = ConstantRange(APInt(32, 15), APInt(32, 0));
  241. RHS = ConstantRange(APInt(32, 7), APInt(32, 6));
  242. EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 15), APInt(32, 0)));
  243. }
  244. TEST_F(ConstantRangeTest, UnionWith) {
  245. EXPECT_EQ(Wrap.unionWith(One),
  246. ConstantRange(APInt(16, 0xaaa), APInt(16, 0xb)));
  247. EXPECT_EQ(One.unionWith(Wrap), Wrap.unionWith(One));
  248. EXPECT_EQ(Empty.unionWith(Empty), Empty);
  249. EXPECT_EQ(Full.unionWith(Full), Full);
  250. EXPECT_EQ(Some.unionWith(Wrap), Full);
  251. // PR4545
  252. EXPECT_EQ(ConstantRange(APInt(16, 14), APInt(16, 1)).unionWith(
  253. ConstantRange(APInt(16, 0), APInt(16, 8))),
  254. ConstantRange(APInt(16, 14), APInt(16, 8)));
  255. EXPECT_EQ(ConstantRange(APInt(16, 6), APInt(16, 4)).unionWith(
  256. ConstantRange(APInt(16, 4), APInt(16, 0))),
  257. ConstantRange(16));
  258. EXPECT_EQ(ConstantRange(APInt(16, 1), APInt(16, 0)).unionWith(
  259. ConstantRange(APInt(16, 2), APInt(16, 1))),
  260. ConstantRange(16));
  261. }
  262. TEST_F(ConstantRangeTest, SetDifference) {
  263. EXPECT_EQ(Full.difference(Empty), Full);
  264. EXPECT_EQ(Full.difference(Full), Empty);
  265. EXPECT_EQ(Empty.difference(Empty), Empty);
  266. EXPECT_EQ(Empty.difference(Full), Empty);
  267. ConstantRange A(APInt(16, 3), APInt(16, 7));
  268. ConstantRange B(APInt(16, 5), APInt(16, 9));
  269. ConstantRange C(APInt(16, 3), APInt(16, 5));
  270. ConstantRange D(APInt(16, 7), APInt(16, 9));
  271. ConstantRange E(APInt(16, 5), APInt(16, 4));
  272. ConstantRange F(APInt(16, 7), APInt(16, 3));
  273. EXPECT_EQ(A.difference(B), C);
  274. EXPECT_EQ(B.difference(A), D);
  275. EXPECT_EQ(E.difference(A), F);
  276. }
  277. TEST_F(ConstantRangeTest, SubtractAPInt) {
  278. EXPECT_EQ(Full.subtract(APInt(16, 4)), Full);
  279. EXPECT_EQ(Empty.subtract(APInt(16, 4)), Empty);
  280. EXPECT_EQ(Some.subtract(APInt(16, 4)),
  281. ConstantRange(APInt(16, 0x6), APInt(16, 0xaa6)));
  282. EXPECT_EQ(Wrap.subtract(APInt(16, 4)),
  283. ConstantRange(APInt(16, 0xaa6), APInt(16, 0x6)));
  284. EXPECT_EQ(One.subtract(APInt(16, 4)),
  285. ConstantRange(APInt(16, 0x6)));
  286. }
  287. TEST_F(ConstantRangeTest, Add) {
  288. EXPECT_EQ(Full.add(APInt(16, 4)), Full);
  289. EXPECT_EQ(Full.add(Full), Full);
  290. EXPECT_EQ(Full.add(Empty), Empty);
  291. EXPECT_EQ(Full.add(One), Full);
  292. EXPECT_EQ(Full.add(Some), Full);
  293. EXPECT_EQ(Full.add(Wrap), Full);
  294. EXPECT_EQ(Empty.add(Empty), Empty);
  295. EXPECT_EQ(Empty.add(One), Empty);
  296. EXPECT_EQ(Empty.add(Some), Empty);
  297. EXPECT_EQ(Empty.add(Wrap), Empty);
  298. EXPECT_EQ(Empty.add(APInt(16, 4)), Empty);
  299. EXPECT_EQ(Some.add(APInt(16, 4)),
  300. ConstantRange(APInt(16, 0xe), APInt(16, 0xaae)));
  301. EXPECT_EQ(Wrap.add(APInt(16, 4)),
  302. ConstantRange(APInt(16, 0xaae), APInt(16, 0xe)));
  303. EXPECT_EQ(One.add(APInt(16, 4)),
  304. ConstantRange(APInt(16, 0xe)));
  305. }
  306. TEST_F(ConstantRangeTest, Sub) {
  307. EXPECT_EQ(Full.sub(APInt(16, 4)), Full);
  308. EXPECT_EQ(Full.sub(Full), Full);
  309. EXPECT_EQ(Full.sub(Empty), Empty);
  310. EXPECT_EQ(Full.sub(One), Full);
  311. EXPECT_EQ(Full.sub(Some), Full);
  312. EXPECT_EQ(Full.sub(Wrap), Full);
  313. EXPECT_EQ(Empty.sub(Empty), Empty);
  314. EXPECT_EQ(Empty.sub(One), Empty);
  315. EXPECT_EQ(Empty.sub(Some), Empty);
  316. EXPECT_EQ(Empty.sub(Wrap), Empty);
  317. EXPECT_EQ(Empty.sub(APInt(16, 4)), Empty);
  318. EXPECT_EQ(Some.sub(APInt(16, 4)),
  319. ConstantRange(APInt(16, 0x6), APInt(16, 0xaa6)));
  320. EXPECT_EQ(Some.sub(Some),
  321. ConstantRange(APInt(16, 0xf561), APInt(16, 0xaa0)));
  322. EXPECT_EQ(Wrap.sub(APInt(16, 4)),
  323. ConstantRange(APInt(16, 0xaa6), APInt(16, 0x6)));
  324. EXPECT_EQ(One.sub(APInt(16, 4)),
  325. ConstantRange(APInt(16, 0x6)));
  326. }
  327. TEST_F(ConstantRangeTest, Multiply) {
  328. EXPECT_EQ(Full.multiply(Full), Full);
  329. EXPECT_EQ(Full.multiply(Empty), Empty);
  330. EXPECT_EQ(Full.multiply(One), Full);
  331. EXPECT_EQ(Full.multiply(Some), Full);
  332. EXPECT_EQ(Full.multiply(Wrap), Full);
  333. EXPECT_EQ(Empty.multiply(Empty), Empty);
  334. EXPECT_EQ(Empty.multiply(One), Empty);
  335. EXPECT_EQ(Empty.multiply(Some), Empty);
  336. EXPECT_EQ(Empty.multiply(Wrap), Empty);
  337. EXPECT_EQ(One.multiply(One), ConstantRange(APInt(16, 0xa*0xa),
  338. APInt(16, 0xa*0xa + 1)));
  339. EXPECT_EQ(One.multiply(Some), ConstantRange(APInt(16, 0xa*0xa),
  340. APInt(16, 0xa*0xaa9 + 1)));
  341. EXPECT_EQ(One.multiply(Wrap), Full);
  342. EXPECT_EQ(Some.multiply(Some), Full);
  343. EXPECT_EQ(Some.multiply(Wrap), Full);
  344. EXPECT_EQ(Wrap.multiply(Wrap), Full);
  345. ConstantRange Zero(APInt(16, 0));
  346. EXPECT_EQ(Zero.multiply(Full), Zero);
  347. EXPECT_EQ(Zero.multiply(Some), Zero);
  348. EXPECT_EQ(Zero.multiply(Wrap), Zero);
  349. EXPECT_EQ(Full.multiply(Zero), Zero);
  350. EXPECT_EQ(Some.multiply(Zero), Zero);
  351. EXPECT_EQ(Wrap.multiply(Zero), Zero);
  352. // http://llvm.org/PR4545
  353. EXPECT_EQ(ConstantRange(APInt(4, 1), APInt(4, 6)).multiply(
  354. ConstantRange(APInt(4, 6), APInt(4, 2))),
  355. ConstantRange(4, /*isFullSet=*/true));
  356. EXPECT_EQ(ConstantRange(APInt(8, 254), APInt(8, 0)).multiply(
  357. ConstantRange(APInt(8, 252), APInt(8, 4))),
  358. ConstantRange(APInt(8, 250), APInt(8, 9)));
  359. EXPECT_EQ(ConstantRange(APInt(8, 254), APInt(8, 255)).multiply(
  360. ConstantRange(APInt(8, 2), APInt(8, 4))),
  361. ConstantRange(APInt(8, 250), APInt(8, 253)));
  362. }
  363. TEST_F(ConstantRangeTest, UMax) {
  364. EXPECT_EQ(Full.umax(Full), Full);
  365. EXPECT_EQ(Full.umax(Empty), Empty);
  366. EXPECT_EQ(Full.umax(Some), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
  367. EXPECT_EQ(Full.umax(Wrap), Full);
  368. EXPECT_EQ(Full.umax(Some), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
  369. EXPECT_EQ(Empty.umax(Empty), Empty);
  370. EXPECT_EQ(Empty.umax(Some), Empty);
  371. EXPECT_EQ(Empty.umax(Wrap), Empty);
  372. EXPECT_EQ(Empty.umax(One), Empty);
  373. EXPECT_EQ(Some.umax(Some), Some);
  374. EXPECT_EQ(Some.umax(Wrap), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
  375. EXPECT_EQ(Some.umax(One), Some);
  376. // TODO: ConstantRange is currently over-conservative here.
  377. EXPECT_EQ(Wrap.umax(Wrap), Full);
  378. EXPECT_EQ(Wrap.umax(One), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
  379. EXPECT_EQ(One.umax(One), One);
  380. }
  381. TEST_F(ConstantRangeTest, SMax) {
  382. EXPECT_EQ(Full.smax(Full), Full);
  383. EXPECT_EQ(Full.smax(Empty), Empty);
  384. EXPECT_EQ(Full.smax(Some), ConstantRange(APInt(16, 0xa),
  385. APInt::getSignedMinValue(16)));
  386. EXPECT_EQ(Full.smax(Wrap), Full);
  387. EXPECT_EQ(Full.smax(One), ConstantRange(APInt(16, 0xa),
  388. APInt::getSignedMinValue(16)));
  389. EXPECT_EQ(Empty.smax(Empty), Empty);
  390. EXPECT_EQ(Empty.smax(Some), Empty);
  391. EXPECT_EQ(Empty.smax(Wrap), Empty);
  392. EXPECT_EQ(Empty.smax(One), Empty);
  393. EXPECT_EQ(Some.smax(Some), Some);
  394. EXPECT_EQ(Some.smax(Wrap), ConstantRange(APInt(16, 0xa),
  395. APInt(16, (uint64_t)INT16_MIN)));
  396. EXPECT_EQ(Some.smax(One), Some);
  397. EXPECT_EQ(Wrap.smax(One), ConstantRange(APInt(16, 0xa),
  398. APInt(16, (uint64_t)INT16_MIN)));
  399. EXPECT_EQ(One.smax(One), One);
  400. }
  401. TEST_F(ConstantRangeTest, UDiv) {
  402. EXPECT_EQ(Full.udiv(Full), Full);
  403. EXPECT_EQ(Full.udiv(Empty), Empty);
  404. EXPECT_EQ(Full.udiv(One), ConstantRange(APInt(16, 0),
  405. APInt(16, 0xffff / 0xa + 1)));
  406. EXPECT_EQ(Full.udiv(Some), ConstantRange(APInt(16, 0),
  407. APInt(16, 0xffff / 0xa + 1)));
  408. EXPECT_EQ(Full.udiv(Wrap), Full);
  409. EXPECT_EQ(Empty.udiv(Empty), Empty);
  410. EXPECT_EQ(Empty.udiv(One), Empty);
  411. EXPECT_EQ(Empty.udiv(Some), Empty);
  412. EXPECT_EQ(Empty.udiv(Wrap), Empty);
  413. EXPECT_EQ(One.udiv(One), ConstantRange(APInt(16, 1)));
  414. EXPECT_EQ(One.udiv(Some), ConstantRange(APInt(16, 0), APInt(16, 2)));
  415. EXPECT_EQ(One.udiv(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
  416. EXPECT_EQ(Some.udiv(Some), ConstantRange(APInt(16, 0), APInt(16, 0x111)));
  417. EXPECT_EQ(Some.udiv(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
  418. EXPECT_EQ(Wrap.udiv(Wrap), Full);
  419. }
  420. TEST_F(ConstantRangeTest, Shl) {
  421. EXPECT_EQ(Full.shl(Full), Full);
  422. EXPECT_EQ(Full.shl(Empty), Empty);
  423. EXPECT_EQ(Full.shl(One), Full); // TODO: [0, (-1 << 0xa) + 1)
  424. EXPECT_EQ(Full.shl(Some), Full); // TODO: [0, (-1 << 0xa) + 1)
  425. EXPECT_EQ(Full.shl(Wrap), Full);
  426. EXPECT_EQ(Empty.shl(Empty), Empty);
  427. EXPECT_EQ(Empty.shl(One), Empty);
  428. EXPECT_EQ(Empty.shl(Some), Empty);
  429. EXPECT_EQ(Empty.shl(Wrap), Empty);
  430. EXPECT_EQ(One.shl(One), ConstantRange(APInt(16, 0xa << 0xa),
  431. APInt(16, (0xa << 0xa) + 1)));
  432. EXPECT_EQ(One.shl(Some), Full); // TODO: [0xa << 0xa, 0)
  433. EXPECT_EQ(One.shl(Wrap), Full); // TODO: [0xa, 0xa << 14 + 1)
  434. EXPECT_EQ(Some.shl(Some), Full); // TODO: [0xa << 0xa, 0xfc01)
  435. EXPECT_EQ(Some.shl(Wrap), Full); // TODO: [0xa, 0x7ff << 0x5 + 1)
  436. EXPECT_EQ(Wrap.shl(Wrap), Full);
  437. }
  438. TEST_F(ConstantRangeTest, Lshr) {
  439. EXPECT_EQ(Full.lshr(Full), Full);
  440. EXPECT_EQ(Full.lshr(Empty), Empty);
  441. EXPECT_EQ(Full.lshr(One), ConstantRange(APInt(16, 0),
  442. APInt(16, (0xffff >> 0xa) + 1)));
  443. EXPECT_EQ(Full.lshr(Some), ConstantRange(APInt(16, 0),
  444. APInt(16, (0xffff >> 0xa) + 1)));
  445. EXPECT_EQ(Full.lshr(Wrap), Full);
  446. EXPECT_EQ(Empty.lshr(Empty), Empty);
  447. EXPECT_EQ(Empty.lshr(One), Empty);
  448. EXPECT_EQ(Empty.lshr(Some), Empty);
  449. EXPECT_EQ(Empty.lshr(Wrap), Empty);
  450. EXPECT_EQ(One.lshr(One), ConstantRange(APInt(16, 0)));
  451. EXPECT_EQ(One.lshr(Some), ConstantRange(APInt(16, 0)));
  452. EXPECT_EQ(One.lshr(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
  453. EXPECT_EQ(Some.lshr(Some), ConstantRange(APInt(16, 0),
  454. APInt(16, (0xaaa >> 0xa) + 1)));
  455. EXPECT_EQ(Some.lshr(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
  456. EXPECT_EQ(Wrap.lshr(Wrap), Full);
  457. }
  458. TEST(ConstantRange, MakeAllowedICmpRegion) {
  459. // PR8250
  460. ConstantRange SMax = ConstantRange(APInt::getSignedMaxValue(32));
  461. EXPECT_TRUE(ConstantRange::makeAllowedICmpRegion(ICmpInst::ICMP_SGT, SMax)
  462. .isEmptySet());
  463. }
  464. TEST(ConstantRange, MakeSatisfyingICmpRegion) {
  465. ConstantRange LowHalf(APInt(8, 0), APInt(8, 128));
  466. ConstantRange HighHalf(APInt(8, 128), APInt(8, 0));
  467. ConstantRange EmptySet(8, /* isFullSet = */ false);
  468. EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_NE, LowHalf),
  469. HighHalf);
  470. EXPECT_EQ(
  471. ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_NE, HighHalf),
  472. LowHalf);
  473. EXPECT_TRUE(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_EQ,
  474. HighHalf).isEmptySet());
  475. ConstantRange UnsignedSample(APInt(8, 5), APInt(8, 200));
  476. EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_ULT,
  477. UnsignedSample),
  478. ConstantRange(APInt(8, 0), APInt(8, 5)));
  479. EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_ULE,
  480. UnsignedSample),
  481. ConstantRange(APInt(8, 0), APInt(8, 6)));
  482. EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_UGT,
  483. UnsignedSample),
  484. ConstantRange(APInt(8, 200), APInt(8, 0)));
  485. EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_UGE,
  486. UnsignedSample),
  487. ConstantRange(APInt(8, 199), APInt(8, 0)));
  488. ConstantRange SignedSample(APInt(8, -5), APInt(8, 5));
  489. EXPECT_EQ(
  490. ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SLT, SignedSample),
  491. ConstantRange(APInt(8, -128), APInt(8, -5)));
  492. EXPECT_EQ(
  493. ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SLE, SignedSample),
  494. ConstantRange(APInt(8, -128), APInt(8, -4)));
  495. EXPECT_EQ(
  496. ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SGT, SignedSample),
  497. ConstantRange(APInt(8, 5), APInt(8, -128)));
  498. EXPECT_EQ(
  499. ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SGE, SignedSample),
  500. ConstantRange(APInt(8, 4), APInt(8, -128)));
  501. }
  502. } // anonymous namespace