ConstantRangeTest.cpp 71 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835
  1. //===- ConstantRangeTest.cpp - ConstantRange tests ------------------------===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. #include "llvm/IR/ConstantRange.h"
  9. #include "llvm/IR/Instructions.h"
  10. #include "llvm/IR/Operator.h"
  11. #include "llvm/Support/KnownBits.h"
  12. #include "gtest/gtest.h"
  13. using namespace llvm;
  14. namespace {
  15. class ConstantRangeTest : public ::testing::Test {
  16. protected:
  17. static ConstantRange Full;
  18. static ConstantRange Empty;
  19. static ConstantRange One;
  20. static ConstantRange Some;
  21. static ConstantRange Wrap;
  22. };
  23. template<typename Fn>
  24. static void EnumerateConstantRanges(unsigned Bits, Fn TestFn) {
  25. unsigned Max = 1 << Bits;
  26. for (unsigned Lo = 0; Lo < Max; Lo++) {
  27. for (unsigned Hi = 0; Hi < Max; Hi++) {
  28. // Enforce ConstantRange invariant.
  29. if (Lo == Hi && Lo != 0 && Lo != Max - 1)
  30. continue;
  31. ConstantRange CR(APInt(Bits, Lo), APInt(Bits, Hi));
  32. TestFn(CR);
  33. }
  34. }
  35. }
  36. template<typename Fn>
  37. static void EnumerateTwoConstantRanges(unsigned Bits, Fn TestFn) {
  38. EnumerateConstantRanges(Bits, [&](const ConstantRange &CR1) {
  39. EnumerateConstantRanges(Bits, [&](const ConstantRange &CR2) {
  40. TestFn(CR1, CR2);
  41. });
  42. });
  43. }
  44. template<typename Fn>
  45. static void ForeachNumInConstantRange(const ConstantRange &CR, Fn TestFn) {
  46. if (!CR.isEmptySet()) {
  47. APInt N = CR.getLower();
  48. do TestFn(N);
  49. while (++N != CR.getUpper());
  50. }
  51. }
  52. template<typename Fn1, typename Fn2>
  53. static void TestUnsignedBinOpExhaustive(
  54. Fn1 RangeFn, Fn2 IntFn,
  55. bool SkipZeroRHS = false, bool CorrectnessOnly = false) {
  56. unsigned Bits = 4;
  57. EnumerateTwoConstantRanges(Bits, [&](const ConstantRange &CR1,
  58. const ConstantRange &CR2) {
  59. APInt Min = APInt::getMaxValue(Bits);
  60. APInt Max = APInt::getMinValue(Bits);
  61. ForeachNumInConstantRange(CR1, [&](const APInt &N1) {
  62. ForeachNumInConstantRange(CR2, [&](const APInt &N2) {
  63. if (SkipZeroRHS && N2 == 0)
  64. return;
  65. APInt N = IntFn(N1, N2);
  66. if (N.ult(Min))
  67. Min = N;
  68. if (N.ugt(Max))
  69. Max = N;
  70. });
  71. });
  72. ConstantRange CR = RangeFn(CR1, CR2);
  73. if (Min.ugt(Max)) {
  74. EXPECT_TRUE(CR.isEmptySet());
  75. return;
  76. }
  77. ConstantRange Exact = ConstantRange::getNonEmpty(Min, Max + 1);
  78. if (CorrectnessOnly) {
  79. EXPECT_TRUE(CR.contains(Exact));
  80. } else {
  81. EXPECT_EQ(Exact, CR);
  82. }
  83. });
  84. }
  85. template<typename Fn1, typename Fn2>
  86. static void TestSignedBinOpExhaustive(Fn1 RangeFn, Fn2 IntFn) {
  87. unsigned Bits = 4;
  88. EnumerateTwoConstantRanges(Bits, [&](const ConstantRange &CR1,
  89. const ConstantRange &CR2) {
  90. ConstantRange CR = RangeFn(CR1, CR2);
  91. if (CR1.isEmptySet() || CR2.isEmptySet()) {
  92. EXPECT_TRUE(CR.isEmptySet());
  93. return;
  94. }
  95. APInt Min = APInt::getSignedMaxValue(Bits);
  96. APInt Max = APInt::getSignedMinValue(Bits);
  97. ForeachNumInConstantRange(CR1, [&](const APInt &N1) {
  98. ForeachNumInConstantRange(CR2, [&](const APInt &N2) {
  99. APInt N = IntFn(N1, N2);
  100. if (N.slt(Min))
  101. Min = N;
  102. if (N.sgt(Max))
  103. Max = N;
  104. });
  105. });
  106. EXPECT_EQ(ConstantRange::getNonEmpty(Min, Max + 1), CR);
  107. });
  108. }
  109. ConstantRange ConstantRangeTest::Full(16, true);
  110. ConstantRange ConstantRangeTest::Empty(16, false);
  111. ConstantRange ConstantRangeTest::One(APInt(16, 0xa));
  112. ConstantRange ConstantRangeTest::Some(APInt(16, 0xa), APInt(16, 0xaaa));
  113. ConstantRange ConstantRangeTest::Wrap(APInt(16, 0xaaa), APInt(16, 0xa));
  114. TEST_F(ConstantRangeTest, Basics) {
  115. EXPECT_TRUE(Full.isFullSet());
  116. EXPECT_FALSE(Full.isEmptySet());
  117. EXPECT_TRUE(Full.inverse().isEmptySet());
  118. EXPECT_FALSE(Full.isWrappedSet());
  119. EXPECT_TRUE(Full.contains(APInt(16, 0x0)));
  120. EXPECT_TRUE(Full.contains(APInt(16, 0x9)));
  121. EXPECT_TRUE(Full.contains(APInt(16, 0xa)));
  122. EXPECT_TRUE(Full.contains(APInt(16, 0xaa9)));
  123. EXPECT_TRUE(Full.contains(APInt(16, 0xaaa)));
  124. EXPECT_FALSE(Empty.isFullSet());
  125. EXPECT_TRUE(Empty.isEmptySet());
  126. EXPECT_TRUE(Empty.inverse().isFullSet());
  127. EXPECT_FALSE(Empty.isWrappedSet());
  128. EXPECT_FALSE(Empty.contains(APInt(16, 0x0)));
  129. EXPECT_FALSE(Empty.contains(APInt(16, 0x9)));
  130. EXPECT_FALSE(Empty.contains(APInt(16, 0xa)));
  131. EXPECT_FALSE(Empty.contains(APInt(16, 0xaa9)));
  132. EXPECT_FALSE(Empty.contains(APInt(16, 0xaaa)));
  133. EXPECT_FALSE(One.isFullSet());
  134. EXPECT_FALSE(One.isEmptySet());
  135. EXPECT_FALSE(One.isWrappedSet());
  136. EXPECT_FALSE(One.contains(APInt(16, 0x0)));
  137. EXPECT_FALSE(One.contains(APInt(16, 0x9)));
  138. EXPECT_TRUE(One.contains(APInt(16, 0xa)));
  139. EXPECT_FALSE(One.contains(APInt(16, 0xaa9)));
  140. EXPECT_FALSE(One.contains(APInt(16, 0xaaa)));
  141. EXPECT_FALSE(One.inverse().contains(APInt(16, 0xa)));
  142. EXPECT_FALSE(Some.isFullSet());
  143. EXPECT_FALSE(Some.isEmptySet());
  144. EXPECT_FALSE(Some.isWrappedSet());
  145. EXPECT_FALSE(Some.contains(APInt(16, 0x0)));
  146. EXPECT_FALSE(Some.contains(APInt(16, 0x9)));
  147. EXPECT_TRUE(Some.contains(APInt(16, 0xa)));
  148. EXPECT_TRUE(Some.contains(APInt(16, 0xaa9)));
  149. EXPECT_FALSE(Some.contains(APInt(16, 0xaaa)));
  150. EXPECT_FALSE(Wrap.isFullSet());
  151. EXPECT_FALSE(Wrap.isEmptySet());
  152. EXPECT_TRUE(Wrap.isWrappedSet());
  153. EXPECT_TRUE(Wrap.contains(APInt(16, 0x0)));
  154. EXPECT_TRUE(Wrap.contains(APInt(16, 0x9)));
  155. EXPECT_FALSE(Wrap.contains(APInt(16, 0xa)));
  156. EXPECT_FALSE(Wrap.contains(APInt(16, 0xaa9)));
  157. EXPECT_TRUE(Wrap.contains(APInt(16, 0xaaa)));
  158. }
  159. TEST_F(ConstantRangeTest, Equality) {
  160. EXPECT_EQ(Full, Full);
  161. EXPECT_EQ(Empty, Empty);
  162. EXPECT_EQ(One, One);
  163. EXPECT_EQ(Some, Some);
  164. EXPECT_EQ(Wrap, Wrap);
  165. EXPECT_NE(Full, Empty);
  166. EXPECT_NE(Full, One);
  167. EXPECT_NE(Full, Some);
  168. EXPECT_NE(Full, Wrap);
  169. EXPECT_NE(Empty, One);
  170. EXPECT_NE(Empty, Some);
  171. EXPECT_NE(Empty, Wrap);
  172. EXPECT_NE(One, Some);
  173. EXPECT_NE(One, Wrap);
  174. EXPECT_NE(Some, Wrap);
  175. }
  176. TEST_F(ConstantRangeTest, SingleElement) {
  177. EXPECT_EQ(Full.getSingleElement(), static_cast<APInt *>(nullptr));
  178. EXPECT_EQ(Empty.getSingleElement(), static_cast<APInt *>(nullptr));
  179. EXPECT_EQ(Full.getSingleMissingElement(), static_cast<APInt *>(nullptr));
  180. EXPECT_EQ(Empty.getSingleMissingElement(), static_cast<APInt *>(nullptr));
  181. EXPECT_EQ(*One.getSingleElement(), APInt(16, 0xa));
  182. EXPECT_EQ(Some.getSingleElement(), static_cast<APInt *>(nullptr));
  183. EXPECT_EQ(Wrap.getSingleElement(), static_cast<APInt *>(nullptr));
  184. EXPECT_EQ(One.getSingleMissingElement(), static_cast<APInt *>(nullptr));
  185. EXPECT_EQ(Some.getSingleMissingElement(), static_cast<APInt *>(nullptr));
  186. ConstantRange OneInverse = One.inverse();
  187. EXPECT_EQ(*OneInverse.getSingleMissingElement(), *One.getSingleElement());
  188. EXPECT_FALSE(Full.isSingleElement());
  189. EXPECT_FALSE(Empty.isSingleElement());
  190. EXPECT_TRUE(One.isSingleElement());
  191. EXPECT_FALSE(Some.isSingleElement());
  192. EXPECT_FALSE(Wrap.isSingleElement());
  193. }
  194. TEST_F(ConstantRangeTest, GetMinsAndMaxes) {
  195. EXPECT_EQ(Full.getUnsignedMax(), APInt(16, UINT16_MAX));
  196. EXPECT_EQ(One.getUnsignedMax(), APInt(16, 0xa));
  197. EXPECT_EQ(Some.getUnsignedMax(), APInt(16, 0xaa9));
  198. EXPECT_EQ(Wrap.getUnsignedMax(), APInt(16, UINT16_MAX));
  199. EXPECT_EQ(Full.getUnsignedMin(), APInt(16, 0));
  200. EXPECT_EQ(One.getUnsignedMin(), APInt(16, 0xa));
  201. EXPECT_EQ(Some.getUnsignedMin(), APInt(16, 0xa));
  202. EXPECT_EQ(Wrap.getUnsignedMin(), APInt(16, 0));
  203. EXPECT_EQ(Full.getSignedMax(), APInt(16, INT16_MAX));
  204. EXPECT_EQ(One.getSignedMax(), APInt(16, 0xa));
  205. EXPECT_EQ(Some.getSignedMax(), APInt(16, 0xaa9));
  206. EXPECT_EQ(Wrap.getSignedMax(), APInt(16, INT16_MAX));
  207. EXPECT_EQ(Full.getSignedMin(), APInt(16, (uint64_t)INT16_MIN));
  208. EXPECT_EQ(One.getSignedMin(), APInt(16, 0xa));
  209. EXPECT_EQ(Some.getSignedMin(), APInt(16, 0xa));
  210. EXPECT_EQ(Wrap.getSignedMin(), APInt(16, (uint64_t)INT16_MIN));
  211. // Found by Klee
  212. EXPECT_EQ(ConstantRange(APInt(4, 7), APInt(4, 0)).getSignedMax(),
  213. APInt(4, 7));
  214. }
  215. TEST_F(ConstantRangeTest, SignWrapped) {
  216. EXPECT_FALSE(Full.isSignWrappedSet());
  217. EXPECT_FALSE(Empty.isSignWrappedSet());
  218. EXPECT_FALSE(One.isSignWrappedSet());
  219. EXPECT_FALSE(Some.isSignWrappedSet());
  220. EXPECT_TRUE(Wrap.isSignWrappedSet());
  221. EXPECT_FALSE(ConstantRange(APInt(8, 127), APInt(8, 128)).isSignWrappedSet());
  222. EXPECT_TRUE(ConstantRange(APInt(8, 127), APInt(8, 129)).isSignWrappedSet());
  223. EXPECT_FALSE(ConstantRange(APInt(8, 128), APInt(8, 129)).isSignWrappedSet());
  224. EXPECT_TRUE(ConstantRange(APInt(8, 10), APInt(8, 9)).isSignWrappedSet());
  225. EXPECT_TRUE(ConstantRange(APInt(8, 10), APInt(8, 250)).isSignWrappedSet());
  226. EXPECT_FALSE(ConstantRange(APInt(8, 250), APInt(8, 10)).isSignWrappedSet());
  227. EXPECT_FALSE(ConstantRange(APInt(8, 250), APInt(8, 251)).isSignWrappedSet());
  228. }
  229. TEST_F(ConstantRangeTest, UpperWrapped) {
  230. // The behavior here is the same as for isWrappedSet() / isSignWrappedSet().
  231. EXPECT_FALSE(Full.isUpperWrapped());
  232. EXPECT_FALSE(Empty.isUpperWrapped());
  233. EXPECT_FALSE(One.isUpperWrapped());
  234. EXPECT_FALSE(Some.isUpperWrapped());
  235. EXPECT_TRUE(Wrap.isUpperWrapped());
  236. EXPECT_FALSE(Full.isUpperSignWrapped());
  237. EXPECT_FALSE(Empty.isUpperSignWrapped());
  238. EXPECT_FALSE(One.isUpperSignWrapped());
  239. EXPECT_FALSE(Some.isUpperSignWrapped());
  240. EXPECT_TRUE(Wrap.isUpperSignWrapped());
  241. // The behavior differs if Upper is the Min/SignedMin value.
  242. ConstantRange CR1(APInt(8, 42), APInt::getMinValue(8));
  243. EXPECT_FALSE(CR1.isWrappedSet());
  244. EXPECT_TRUE(CR1.isUpperWrapped());
  245. ConstantRange CR2(APInt(8, 42), APInt::getSignedMinValue(8));
  246. EXPECT_FALSE(CR2.isSignWrappedSet());
  247. EXPECT_TRUE(CR2.isUpperSignWrapped());
  248. }
  249. TEST_F(ConstantRangeTest, Trunc) {
  250. ConstantRange TFull = Full.truncate(10);
  251. ConstantRange TEmpty = Empty.truncate(10);
  252. ConstantRange TOne = One.truncate(10);
  253. ConstantRange TSome = Some.truncate(10);
  254. ConstantRange TWrap = Wrap.truncate(10);
  255. EXPECT_TRUE(TFull.isFullSet());
  256. EXPECT_TRUE(TEmpty.isEmptySet());
  257. EXPECT_EQ(TOne, ConstantRange(One.getLower().trunc(10),
  258. One.getUpper().trunc(10)));
  259. EXPECT_TRUE(TSome.isFullSet());
  260. EXPECT_TRUE(TWrap.isFullSet());
  261. // trunc([2, 5), 3->2) = [2, 1)
  262. ConstantRange TwoFive(APInt(3, 2), APInt(3, 5));
  263. EXPECT_EQ(TwoFive.truncate(2), ConstantRange(APInt(2, 2), APInt(2, 1)));
  264. // trunc([2, 6), 3->2) = full
  265. ConstantRange TwoSix(APInt(3, 2), APInt(3, 6));
  266. EXPECT_TRUE(TwoSix.truncate(2).isFullSet());
  267. // trunc([5, 7), 3->2) = [1, 3)
  268. ConstantRange FiveSeven(APInt(3, 5), APInt(3, 7));
  269. EXPECT_EQ(FiveSeven.truncate(2), ConstantRange(APInt(2, 1), APInt(2, 3)));
  270. // trunc([7, 1), 3->2) = [3, 1)
  271. ConstantRange SevenOne(APInt(3, 7), APInt(3, 1));
  272. EXPECT_EQ(SevenOne.truncate(2), ConstantRange(APInt(2, 3), APInt(2, 1)));
  273. }
  274. TEST_F(ConstantRangeTest, ZExt) {
  275. ConstantRange ZFull = Full.zeroExtend(20);
  276. ConstantRange ZEmpty = Empty.zeroExtend(20);
  277. ConstantRange ZOne = One.zeroExtend(20);
  278. ConstantRange ZSome = Some.zeroExtend(20);
  279. ConstantRange ZWrap = Wrap.zeroExtend(20);
  280. EXPECT_EQ(ZFull, ConstantRange(APInt(20, 0), APInt(20, 0x10000)));
  281. EXPECT_TRUE(ZEmpty.isEmptySet());
  282. EXPECT_EQ(ZOne, ConstantRange(One.getLower().zext(20),
  283. One.getUpper().zext(20)));
  284. EXPECT_EQ(ZSome, ConstantRange(Some.getLower().zext(20),
  285. Some.getUpper().zext(20)));
  286. EXPECT_EQ(ZWrap, ConstantRange(APInt(20, 0), APInt(20, 0x10000)));
  287. // zext([5, 0), 3->7) = [5, 8)
  288. ConstantRange FiveZero(APInt(3, 5), APInt(3, 0));
  289. EXPECT_EQ(FiveZero.zeroExtend(7), ConstantRange(APInt(7, 5), APInt(7, 8)));
  290. }
  291. TEST_F(ConstantRangeTest, SExt) {
  292. ConstantRange SFull = Full.signExtend(20);
  293. ConstantRange SEmpty = Empty.signExtend(20);
  294. ConstantRange SOne = One.signExtend(20);
  295. ConstantRange SSome = Some.signExtend(20);
  296. ConstantRange SWrap = Wrap.signExtend(20);
  297. EXPECT_EQ(SFull, ConstantRange(APInt(20, (uint64_t)INT16_MIN, true),
  298. APInt(20, INT16_MAX + 1, true)));
  299. EXPECT_TRUE(SEmpty.isEmptySet());
  300. EXPECT_EQ(SOne, ConstantRange(One.getLower().sext(20),
  301. One.getUpper().sext(20)));
  302. EXPECT_EQ(SSome, ConstantRange(Some.getLower().sext(20),
  303. Some.getUpper().sext(20)));
  304. EXPECT_EQ(SWrap, ConstantRange(APInt(20, (uint64_t)INT16_MIN, true),
  305. APInt(20, INT16_MAX + 1, true)));
  306. EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, 140)).signExtend(16),
  307. ConstantRange(APInt(16, -128), APInt(16, 128)));
  308. EXPECT_EQ(ConstantRange(APInt(16, 0x0200), APInt(16, 0x8000)).signExtend(19),
  309. ConstantRange(APInt(19, 0x0200), APInt(19, 0x8000)));
  310. }
  311. TEST_F(ConstantRangeTest, IntersectWith) {
  312. EXPECT_EQ(Empty.intersectWith(Full), Empty);
  313. EXPECT_EQ(Empty.intersectWith(Empty), Empty);
  314. EXPECT_EQ(Empty.intersectWith(One), Empty);
  315. EXPECT_EQ(Empty.intersectWith(Some), Empty);
  316. EXPECT_EQ(Empty.intersectWith(Wrap), Empty);
  317. EXPECT_EQ(Full.intersectWith(Full), Full);
  318. EXPECT_EQ(Some.intersectWith(Some), Some);
  319. EXPECT_EQ(Some.intersectWith(One), One);
  320. EXPECT_EQ(Full.intersectWith(One), One);
  321. EXPECT_EQ(Full.intersectWith(Some), Some);
  322. EXPECT_EQ(Some.intersectWith(Wrap), Empty);
  323. EXPECT_EQ(One.intersectWith(Wrap), Empty);
  324. EXPECT_EQ(One.intersectWith(Wrap), Wrap.intersectWith(One));
  325. // Klee generated testcase from PR4545.
  326. // The intersection of i16 [4, 2) and [6, 5) is disjoint, looking like
  327. // 01..4.6789ABCDEF where the dots represent values not in the intersection.
  328. ConstantRange LHS(APInt(16, 4), APInt(16, 2));
  329. ConstantRange RHS(APInt(16, 6), APInt(16, 5));
  330. EXPECT_TRUE(LHS.intersectWith(RHS) == LHS);
  331. // previous bug: intersection of [min, 3) and [2, max) should be 2
  332. LHS = ConstantRange(APInt(32, -2147483646), APInt(32, 3));
  333. RHS = ConstantRange(APInt(32, 2), APInt(32, 2147483646));
  334. EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 2)));
  335. // [2, 0) /\ [4, 3) = [2, 0)
  336. LHS = ConstantRange(APInt(32, 2), APInt(32, 0));
  337. RHS = ConstantRange(APInt(32, 4), APInt(32, 3));
  338. EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 2), APInt(32, 0)));
  339. // [2, 0) /\ [4, 2) = [4, 0)
  340. LHS = ConstantRange(APInt(32, 2), APInt(32, 0));
  341. RHS = ConstantRange(APInt(32, 4), APInt(32, 2));
  342. EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 4), APInt(32, 0)));
  343. // [4, 2) /\ [5, 1) = [5, 1)
  344. LHS = ConstantRange(APInt(32, 4), APInt(32, 2));
  345. RHS = ConstantRange(APInt(32, 5), APInt(32, 1));
  346. EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 5), APInt(32, 1)));
  347. // [2, 0) /\ [7, 4) = [7, 4)
  348. LHS = ConstantRange(APInt(32, 2), APInt(32, 0));
  349. RHS = ConstantRange(APInt(32, 7), APInt(32, 4));
  350. EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 7), APInt(32, 4)));
  351. // [4, 2) /\ [1, 0) = [1, 0)
  352. LHS = ConstantRange(APInt(32, 4), APInt(32, 2));
  353. RHS = ConstantRange(APInt(32, 1), APInt(32, 0));
  354. EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 4), APInt(32, 2)));
  355. // [15, 0) /\ [7, 6) = [15, 0)
  356. LHS = ConstantRange(APInt(32, 15), APInt(32, 0));
  357. RHS = ConstantRange(APInt(32, 7), APInt(32, 6));
  358. EXPECT_EQ(LHS.intersectWith(RHS), ConstantRange(APInt(32, 15), APInt(32, 0)));
  359. }
  360. template<typename Fn1, typename Fn2>
  361. void testBinarySetOperationExhaustive(Fn1 OpFn, Fn2 InResultFn) {
  362. unsigned Bits = 4;
  363. EnumerateTwoConstantRanges(Bits,
  364. [=](const ConstantRange &CR1, const ConstantRange &CR2) {
  365. // Collect up to three contiguous unsigned ranges. The HaveInterrupt
  366. // variables are used determine when we have to switch to the next
  367. // range because the previous one ended.
  368. APInt Lower1(Bits, 0), Upper1(Bits, 0);
  369. APInt Lower2(Bits, 0), Upper2(Bits, 0);
  370. APInt Lower3(Bits, 0), Upper3(Bits, 0);
  371. bool HaveRange1 = false, HaveInterrupt1 = false;
  372. bool HaveRange2 = false, HaveInterrupt2 = false;
  373. bool HaveRange3 = false, HaveInterrupt3 = false;
  374. APInt Num(Bits, 0);
  375. for (unsigned I = 0, Limit = 1 << Bits; I < Limit; ++I, ++Num) {
  376. if (!InResultFn(CR1, CR2, Num)) {
  377. if (HaveRange3)
  378. HaveInterrupt3 = true;
  379. else if (HaveRange2)
  380. HaveInterrupt2 = true;
  381. else if (HaveRange1)
  382. HaveInterrupt1 = true;
  383. continue;
  384. }
  385. if (HaveRange3) {
  386. Upper3 = Num;
  387. } else if (HaveInterrupt2) {
  388. HaveRange3 = true;
  389. Lower3 = Upper3 = Num;
  390. } else if (HaveRange2) {
  391. Upper2 = Num;
  392. } else if (HaveInterrupt1) {
  393. HaveRange2 = true;
  394. Lower2 = Upper2 = Num;
  395. } else if (HaveRange1) {
  396. Upper1 = Num;
  397. } else {
  398. HaveRange1 = true;
  399. Lower1 = Upper1 = Num;
  400. }
  401. }
  402. (void)HaveInterrupt3;
  403. assert(!HaveInterrupt3 && "Should have at most three ranges");
  404. ConstantRange SmallestCR = OpFn(CR1, CR2, ConstantRange::Smallest);
  405. ConstantRange UnsignedCR = OpFn(CR1, CR2, ConstantRange::Unsigned);
  406. ConstantRange SignedCR = OpFn(CR1, CR2, ConstantRange::Signed);
  407. if (!HaveRange1) {
  408. EXPECT_TRUE(SmallestCR.isEmptySet());
  409. EXPECT_TRUE(UnsignedCR.isEmptySet());
  410. EXPECT_TRUE(SignedCR.isEmptySet());
  411. return;
  412. }
  413. if (!HaveRange2) {
  414. if (Lower1 == Upper1 + 1) {
  415. EXPECT_TRUE(SmallestCR.isFullSet());
  416. EXPECT_TRUE(UnsignedCR.isFullSet());
  417. EXPECT_TRUE(SignedCR.isFullSet());
  418. } else {
  419. ConstantRange Expected(Lower1, Upper1 + 1);
  420. EXPECT_EQ(Expected, SmallestCR);
  421. EXPECT_EQ(Expected, UnsignedCR);
  422. EXPECT_EQ(Expected, SignedCR);
  423. }
  424. return;
  425. }
  426. ConstantRange Variant1(Bits, /*full*/ true);
  427. ConstantRange Variant2(Bits, /*full*/ true);
  428. if (!HaveRange3) {
  429. // Compute the two possible ways to cover two disjoint ranges.
  430. if (Lower1 != Upper2 + 1)
  431. Variant1 = ConstantRange(Lower1, Upper2 + 1);
  432. if (Lower2 != Upper1 + 1)
  433. Variant2 = ConstantRange(Lower2, Upper1 + 1);
  434. } else {
  435. // If we have three ranges, the first and last one have to be adjacent
  436. // to the unsigned domain. It's better to think of this as having two
  437. // holes, and we can construct one range using each hole.
  438. assert(Lower1.isNullValue() && Upper3.isMaxValue());
  439. Variant1 = ConstantRange(Lower2, Upper1 + 1);
  440. Variant2 = ConstantRange(Lower3, Upper2 + 1);
  441. }
  442. // Smallest: Smaller set, then any set.
  443. if (Variant1.isSizeStrictlySmallerThan(Variant2))
  444. EXPECT_EQ(Variant1, SmallestCR);
  445. else if (Variant2.isSizeStrictlySmallerThan(Variant1))
  446. EXPECT_EQ(Variant2, SmallestCR);
  447. else
  448. EXPECT_TRUE(Variant1 == SmallestCR || Variant2 == SmallestCR);
  449. // Unsigned: Non-wrapped set, then smaller set, then any set.
  450. bool Variant1Full = Variant1.isFullSet() || Variant1.isWrappedSet();
  451. bool Variant2Full = Variant2.isFullSet() || Variant2.isWrappedSet();
  452. if (!Variant1Full && Variant2Full)
  453. EXPECT_EQ(Variant1, UnsignedCR);
  454. else if (Variant1Full && !Variant2Full)
  455. EXPECT_EQ(Variant2, UnsignedCR);
  456. else if (Variant1.isSizeStrictlySmallerThan(Variant2))
  457. EXPECT_EQ(Variant1, UnsignedCR);
  458. else if (Variant2.isSizeStrictlySmallerThan(Variant1))
  459. EXPECT_EQ(Variant2, UnsignedCR);
  460. else
  461. EXPECT_TRUE(Variant1 == UnsignedCR || Variant2 == UnsignedCR);
  462. // Signed: Signed non-wrapped set, then smaller set, then any set.
  463. Variant1Full = Variant1.isFullSet() || Variant1.isSignWrappedSet();
  464. Variant2Full = Variant2.isFullSet() || Variant2.isSignWrappedSet();
  465. if (!Variant1Full && Variant2Full)
  466. EXPECT_EQ(Variant1, SignedCR);
  467. else if (Variant1Full && !Variant2Full)
  468. EXPECT_EQ(Variant2, SignedCR);
  469. else if (Variant1.isSizeStrictlySmallerThan(Variant2))
  470. EXPECT_EQ(Variant1, SignedCR);
  471. else if (Variant2.isSizeStrictlySmallerThan(Variant1))
  472. EXPECT_EQ(Variant2, SignedCR);
  473. else
  474. EXPECT_TRUE(Variant1 == SignedCR || Variant2 == SignedCR);
  475. });
  476. }
  477. TEST_F(ConstantRangeTest, IntersectWithExhaustive) {
  478. testBinarySetOperationExhaustive(
  479. [](const ConstantRange &CR1, const ConstantRange &CR2,
  480. ConstantRange::PreferredRangeType Type) {
  481. return CR1.intersectWith(CR2, Type);
  482. },
  483. [](const ConstantRange &CR1, const ConstantRange &CR2, const APInt &N) {
  484. return CR1.contains(N) && CR2.contains(N);
  485. });
  486. }
  487. TEST_F(ConstantRangeTest, UnionWithExhaustive) {
  488. testBinarySetOperationExhaustive(
  489. [](const ConstantRange &CR1, const ConstantRange &CR2,
  490. ConstantRange::PreferredRangeType Type) {
  491. return CR1.unionWith(CR2, Type);
  492. },
  493. [](const ConstantRange &CR1, const ConstantRange &CR2, const APInt &N) {
  494. return CR1.contains(N) || CR2.contains(N);
  495. });
  496. }
  497. TEST_F(ConstantRangeTest, UnionWith) {
  498. EXPECT_EQ(Wrap.unionWith(One),
  499. ConstantRange(APInt(16, 0xaaa), APInt(16, 0xb)));
  500. EXPECT_EQ(One.unionWith(Wrap), Wrap.unionWith(One));
  501. EXPECT_EQ(Empty.unionWith(Empty), Empty);
  502. EXPECT_EQ(Full.unionWith(Full), Full);
  503. EXPECT_EQ(Some.unionWith(Wrap), Full);
  504. // PR4545
  505. EXPECT_EQ(ConstantRange(APInt(16, 14), APInt(16, 1)).unionWith(
  506. ConstantRange(APInt(16, 0), APInt(16, 8))),
  507. ConstantRange(APInt(16, 14), APInt(16, 8)));
  508. EXPECT_EQ(ConstantRange(APInt(16, 6), APInt(16, 4)).unionWith(
  509. ConstantRange(APInt(16, 4), APInt(16, 0))),
  510. ConstantRange::getFull(16));
  511. EXPECT_EQ(ConstantRange(APInt(16, 1), APInt(16, 0)).unionWith(
  512. ConstantRange(APInt(16, 2), APInt(16, 1))),
  513. ConstantRange::getFull(16));
  514. }
  515. TEST_F(ConstantRangeTest, SetDifference) {
  516. EXPECT_EQ(Full.difference(Empty), Full);
  517. EXPECT_EQ(Full.difference(Full), Empty);
  518. EXPECT_EQ(Empty.difference(Empty), Empty);
  519. EXPECT_EQ(Empty.difference(Full), Empty);
  520. ConstantRange A(APInt(16, 3), APInt(16, 7));
  521. ConstantRange B(APInt(16, 5), APInt(16, 9));
  522. ConstantRange C(APInt(16, 3), APInt(16, 5));
  523. ConstantRange D(APInt(16, 7), APInt(16, 9));
  524. ConstantRange E(APInt(16, 5), APInt(16, 4));
  525. ConstantRange F(APInt(16, 7), APInt(16, 3));
  526. EXPECT_EQ(A.difference(B), C);
  527. EXPECT_EQ(B.difference(A), D);
  528. EXPECT_EQ(E.difference(A), F);
  529. }
  530. TEST_F(ConstantRangeTest, SubtractAPInt) {
  531. EXPECT_EQ(Full.subtract(APInt(16, 4)), Full);
  532. EXPECT_EQ(Empty.subtract(APInt(16, 4)), Empty);
  533. EXPECT_EQ(Some.subtract(APInt(16, 4)),
  534. ConstantRange(APInt(16, 0x6), APInt(16, 0xaa6)));
  535. EXPECT_EQ(Wrap.subtract(APInt(16, 4)),
  536. ConstantRange(APInt(16, 0xaa6), APInt(16, 0x6)));
  537. EXPECT_EQ(One.subtract(APInt(16, 4)),
  538. ConstantRange(APInt(16, 0x6)));
  539. }
  540. TEST_F(ConstantRangeTest, Add) {
  541. EXPECT_EQ(Full.add(APInt(16, 4)), Full);
  542. EXPECT_EQ(Full.add(Full), Full);
  543. EXPECT_EQ(Full.add(Empty), Empty);
  544. EXPECT_EQ(Full.add(One), Full);
  545. EXPECT_EQ(Full.add(Some), Full);
  546. EXPECT_EQ(Full.add(Wrap), Full);
  547. EXPECT_EQ(Empty.add(Empty), Empty);
  548. EXPECT_EQ(Empty.add(One), Empty);
  549. EXPECT_EQ(Empty.add(Some), Empty);
  550. EXPECT_EQ(Empty.add(Wrap), Empty);
  551. EXPECT_EQ(Empty.add(APInt(16, 4)), Empty);
  552. EXPECT_EQ(Some.add(APInt(16, 4)),
  553. ConstantRange(APInt(16, 0xe), APInt(16, 0xaae)));
  554. EXPECT_EQ(Wrap.add(APInt(16, 4)),
  555. ConstantRange(APInt(16, 0xaae), APInt(16, 0xe)));
  556. EXPECT_EQ(One.add(APInt(16, 4)),
  557. ConstantRange(APInt(16, 0xe)));
  558. }
  559. TEST_F(ConstantRangeTest, AddWithNoSignedWrap) {
  560. EXPECT_EQ(Empty.addWithNoSignedWrap(APInt(16, 1)), Empty);
  561. EXPECT_EQ(Full.addWithNoSignedWrap(APInt(16, 1)),
  562. ConstantRange(APInt(16, INT16_MIN+1), APInt(16, INT16_MIN)));
  563. EXPECT_EQ(ConstantRange(APInt(8, -50), APInt(8, 50)).addWithNoSignedWrap(APInt(8, 10)),
  564. ConstantRange(APInt(8, -40), APInt(8, 60)));
  565. EXPECT_EQ(ConstantRange(APInt(8, -50), APInt(8, 120)).addWithNoSignedWrap(APInt(8, 10)),
  566. ConstantRange(APInt(8, -40), APInt(8, INT8_MIN)));
  567. EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, -10)).addWithNoSignedWrap(APInt(8, 5)),
  568. ConstantRange(APInt(8, 125), APInt(8, -5)));
  569. EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, -120)).addWithNoSignedWrap(APInt(8, 10)),
  570. ConstantRange(APInt(8, INT8_MIN+10), APInt(8, -110)));
  571. EXPECT_EQ(Empty.addWithNoSignedWrap(APInt(16, -1)), Empty);
  572. EXPECT_EQ(Full.addWithNoSignedWrap(APInt(16, -1)),
  573. ConstantRange(APInt(16, INT16_MIN), APInt(16, INT16_MAX)));
  574. EXPECT_EQ(ConstantRange(APInt(8, -50), APInt(8, 50)).addWithNoSignedWrap(APInt(8, -10)),
  575. ConstantRange(APInt(8, -60), APInt(8, 40)));
  576. EXPECT_EQ(ConstantRange(APInt(8, -120), APInt(8, 50)).addWithNoSignedWrap(APInt(8, -10)),
  577. ConstantRange(APInt(8, INT8_MIN), APInt(8, 40)));
  578. EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, -120)).addWithNoSignedWrap(APInt(8, -5)),
  579. ConstantRange(APInt(8, 115), APInt(8, -125)));
  580. EXPECT_EQ(ConstantRange(APInt(8, 120), APInt(8, -120)).addWithNoSignedWrap(APInt(8, -10)),
  581. ConstantRange(APInt(8, 110), APInt(8, INT8_MIN-10)));
  582. }
  583. TEST_F(ConstantRangeTest, Sub) {
  584. EXPECT_EQ(Full.sub(APInt(16, 4)), Full);
  585. EXPECT_EQ(Full.sub(Full), Full);
  586. EXPECT_EQ(Full.sub(Empty), Empty);
  587. EXPECT_EQ(Full.sub(One), Full);
  588. EXPECT_EQ(Full.sub(Some), Full);
  589. EXPECT_EQ(Full.sub(Wrap), Full);
  590. EXPECT_EQ(Empty.sub(Empty), Empty);
  591. EXPECT_EQ(Empty.sub(One), Empty);
  592. EXPECT_EQ(Empty.sub(Some), Empty);
  593. EXPECT_EQ(Empty.sub(Wrap), Empty);
  594. EXPECT_EQ(Empty.sub(APInt(16, 4)), Empty);
  595. EXPECT_EQ(Some.sub(APInt(16, 4)),
  596. ConstantRange(APInt(16, 0x6), APInt(16, 0xaa6)));
  597. EXPECT_EQ(Some.sub(Some),
  598. ConstantRange(APInt(16, 0xf561), APInt(16, 0xaa0)));
  599. EXPECT_EQ(Wrap.sub(APInt(16, 4)),
  600. ConstantRange(APInt(16, 0xaa6), APInt(16, 0x6)));
  601. EXPECT_EQ(One.sub(APInt(16, 4)),
  602. ConstantRange(APInt(16, 0x6)));
  603. }
  604. TEST_F(ConstantRangeTest, Multiply) {
  605. EXPECT_EQ(Full.multiply(Full), Full);
  606. EXPECT_EQ(Full.multiply(Empty), Empty);
  607. EXPECT_EQ(Full.multiply(One), Full);
  608. EXPECT_EQ(Full.multiply(Some), Full);
  609. EXPECT_EQ(Full.multiply(Wrap), Full);
  610. EXPECT_EQ(Empty.multiply(Empty), Empty);
  611. EXPECT_EQ(Empty.multiply(One), Empty);
  612. EXPECT_EQ(Empty.multiply(Some), Empty);
  613. EXPECT_EQ(Empty.multiply(Wrap), Empty);
  614. EXPECT_EQ(One.multiply(One), ConstantRange(APInt(16, 0xa*0xa),
  615. APInt(16, 0xa*0xa + 1)));
  616. EXPECT_EQ(One.multiply(Some), ConstantRange(APInt(16, 0xa*0xa),
  617. APInt(16, 0xa*0xaa9 + 1)));
  618. EXPECT_EQ(One.multiply(Wrap), Full);
  619. EXPECT_EQ(Some.multiply(Some), Full);
  620. EXPECT_EQ(Some.multiply(Wrap), Full);
  621. EXPECT_EQ(Wrap.multiply(Wrap), Full);
  622. ConstantRange Zero(APInt(16, 0));
  623. EXPECT_EQ(Zero.multiply(Full), Zero);
  624. EXPECT_EQ(Zero.multiply(Some), Zero);
  625. EXPECT_EQ(Zero.multiply(Wrap), Zero);
  626. EXPECT_EQ(Full.multiply(Zero), Zero);
  627. EXPECT_EQ(Some.multiply(Zero), Zero);
  628. EXPECT_EQ(Wrap.multiply(Zero), Zero);
  629. // http://llvm.org/PR4545
  630. EXPECT_EQ(ConstantRange(APInt(4, 1), APInt(4, 6)).multiply(
  631. ConstantRange(APInt(4, 6), APInt(4, 2))),
  632. ConstantRange(4, /*isFullSet=*/true));
  633. EXPECT_EQ(ConstantRange(APInt(8, 254), APInt(8, 0)).multiply(
  634. ConstantRange(APInt(8, 252), APInt(8, 4))),
  635. ConstantRange(APInt(8, 250), APInt(8, 9)));
  636. EXPECT_EQ(ConstantRange(APInt(8, 254), APInt(8, 255)).multiply(
  637. ConstantRange(APInt(8, 2), APInt(8, 4))),
  638. ConstantRange(APInt(8, 250), APInt(8, 253)));
  639. // TODO: This should be return [-2, 0]
  640. EXPECT_EQ(ConstantRange(APInt(8, -2)).multiply(
  641. ConstantRange(APInt(8, 0), APInt(8, 2))),
  642. ConstantRange(APInt(8, -2), APInt(8, 1)));
  643. }
  644. TEST_F(ConstantRangeTest, UMax) {
  645. EXPECT_EQ(Full.umax(Full), Full);
  646. EXPECT_EQ(Full.umax(Empty), Empty);
  647. EXPECT_EQ(Full.umax(Some), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
  648. EXPECT_EQ(Full.umax(Wrap), Full);
  649. EXPECT_EQ(Full.umax(Some), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
  650. EXPECT_EQ(Empty.umax(Empty), Empty);
  651. EXPECT_EQ(Empty.umax(Some), Empty);
  652. EXPECT_EQ(Empty.umax(Wrap), Empty);
  653. EXPECT_EQ(Empty.umax(One), Empty);
  654. EXPECT_EQ(Some.umax(Some), Some);
  655. EXPECT_EQ(Some.umax(Wrap), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
  656. EXPECT_EQ(Some.umax(One), Some);
  657. // TODO: ConstantRange is currently over-conservative here.
  658. EXPECT_EQ(Wrap.umax(Wrap), Full);
  659. EXPECT_EQ(Wrap.umax(One), ConstantRange(APInt(16, 0xa), APInt(16, 0)));
  660. EXPECT_EQ(One.umax(One), One);
  661. }
  662. TEST_F(ConstantRangeTest, SMax) {
  663. EXPECT_EQ(Full.smax(Full), Full);
  664. EXPECT_EQ(Full.smax(Empty), Empty);
  665. EXPECT_EQ(Full.smax(Some), ConstantRange(APInt(16, 0xa),
  666. APInt::getSignedMinValue(16)));
  667. EXPECT_EQ(Full.smax(Wrap), Full);
  668. EXPECT_EQ(Full.smax(One), ConstantRange(APInt(16, 0xa),
  669. APInt::getSignedMinValue(16)));
  670. EXPECT_EQ(Empty.smax(Empty), Empty);
  671. EXPECT_EQ(Empty.smax(Some), Empty);
  672. EXPECT_EQ(Empty.smax(Wrap), Empty);
  673. EXPECT_EQ(Empty.smax(One), Empty);
  674. EXPECT_EQ(Some.smax(Some), Some);
  675. EXPECT_EQ(Some.smax(Wrap), ConstantRange(APInt(16, 0xa),
  676. APInt(16, (uint64_t)INT16_MIN)));
  677. EXPECT_EQ(Some.smax(One), Some);
  678. EXPECT_EQ(Wrap.smax(One), ConstantRange(APInt(16, 0xa),
  679. APInt(16, (uint64_t)INT16_MIN)));
  680. EXPECT_EQ(One.smax(One), One);
  681. }
  682. TEST_F(ConstantRangeTest, UMin) {
  683. EXPECT_EQ(Full.umin(Full), Full);
  684. EXPECT_EQ(Full.umin(Empty), Empty);
  685. EXPECT_EQ(Full.umin(Some), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
  686. EXPECT_EQ(Full.umin(Wrap), Full);
  687. EXPECT_EQ(Empty.umin(Empty), Empty);
  688. EXPECT_EQ(Empty.umin(Some), Empty);
  689. EXPECT_EQ(Empty.umin(Wrap), Empty);
  690. EXPECT_EQ(Empty.umin(One), Empty);
  691. EXPECT_EQ(Some.umin(Some), Some);
  692. EXPECT_EQ(Some.umin(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
  693. EXPECT_EQ(Some.umin(One), One);
  694. // TODO: ConstantRange is currently over-conservative here.
  695. EXPECT_EQ(Wrap.umin(Wrap), Full);
  696. EXPECT_EQ(Wrap.umin(One), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
  697. EXPECT_EQ(One.umin(One), One);
  698. }
  699. TEST_F(ConstantRangeTest, SMin) {
  700. EXPECT_EQ(Full.smin(Full), Full);
  701. EXPECT_EQ(Full.smin(Empty), Empty);
  702. EXPECT_EQ(Full.smin(Some), ConstantRange(APInt(16, (uint64_t)INT16_MIN),
  703. APInt(16, 0xaaa)));
  704. EXPECT_EQ(Full.smin(Wrap), Full);
  705. EXPECT_EQ(Empty.smin(Empty), Empty);
  706. EXPECT_EQ(Empty.smin(Some), Empty);
  707. EXPECT_EQ(Empty.smin(Wrap), Empty);
  708. EXPECT_EQ(Empty.smin(One), Empty);
  709. EXPECT_EQ(Some.smin(Some), Some);
  710. EXPECT_EQ(Some.smin(Wrap), ConstantRange(APInt(16, (uint64_t)INT16_MIN),
  711. APInt(16, 0xaaa)));
  712. EXPECT_EQ(Some.smin(One), One);
  713. // TODO: ConstantRange is currently over-conservative here.
  714. EXPECT_EQ(Wrap.smin(Wrap), Full);
  715. EXPECT_EQ(Wrap.smin(One), ConstantRange(APInt(16, (uint64_t)INT16_MIN),
  716. APInt(16, 0xb)));
  717. EXPECT_EQ(One.smin(One), One);
  718. }
  719. TEST_F(ConstantRangeTest, UDiv) {
  720. EXPECT_EQ(Full.udiv(Full), Full);
  721. EXPECT_EQ(Full.udiv(Empty), Empty);
  722. EXPECT_EQ(Full.udiv(One), ConstantRange(APInt(16, 0),
  723. APInt(16, 0xffff / 0xa + 1)));
  724. EXPECT_EQ(Full.udiv(Some), ConstantRange(APInt(16, 0),
  725. APInt(16, 0xffff / 0xa + 1)));
  726. EXPECT_EQ(Full.udiv(Wrap), Full);
  727. EXPECT_EQ(Empty.udiv(Empty), Empty);
  728. EXPECT_EQ(Empty.udiv(One), Empty);
  729. EXPECT_EQ(Empty.udiv(Some), Empty);
  730. EXPECT_EQ(Empty.udiv(Wrap), Empty);
  731. EXPECT_EQ(One.udiv(One), ConstantRange(APInt(16, 1)));
  732. EXPECT_EQ(One.udiv(Some), ConstantRange(APInt(16, 0), APInt(16, 2)));
  733. EXPECT_EQ(One.udiv(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
  734. EXPECT_EQ(Some.udiv(Some), ConstantRange(APInt(16, 0), APInt(16, 0x111)));
  735. EXPECT_EQ(Some.udiv(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
  736. EXPECT_EQ(Wrap.udiv(Wrap), Full);
  737. ConstantRange Zero(APInt(16, 0));
  738. EXPECT_EQ(Zero.udiv(One), Zero);
  739. EXPECT_EQ(Zero.udiv(Full), Zero);
  740. EXPECT_EQ(ConstantRange(APInt(16, 0), APInt(16, 99)).udiv(Full),
  741. ConstantRange(APInt(16, 0), APInt(16, 99)));
  742. EXPECT_EQ(ConstantRange(APInt(16, 10), APInt(16, 99)).udiv(Full),
  743. ConstantRange(APInt(16, 0), APInt(16, 99)));
  744. }
  745. TEST_F(ConstantRangeTest, URem) {
  746. EXPECT_EQ(Full.urem(Empty), Empty);
  747. EXPECT_EQ(Empty.urem(Full), Empty);
  748. // urem by zero is poison.
  749. EXPECT_EQ(Full.urem(ConstantRange(APInt(16, 0))), Empty);
  750. // urem by full range doesn't contain MaxValue.
  751. EXPECT_EQ(Full.urem(Full), ConstantRange(APInt(16, 0), APInt(16, 0xffff)));
  752. // urem is upper bounded by maximum RHS minus one.
  753. EXPECT_EQ(Full.urem(ConstantRange(APInt(16, 0), APInt(16, 123))),
  754. ConstantRange(APInt(16, 0), APInt(16, 122)));
  755. // urem is upper bounded by maximum LHS.
  756. EXPECT_EQ(ConstantRange(APInt(16, 0), APInt(16, 123)).urem(Full),
  757. ConstantRange(APInt(16, 0), APInt(16, 123)));
  758. // If the LHS is always lower than the RHS, the result is the LHS.
  759. EXPECT_EQ(ConstantRange(APInt(16, 10), APInt(16, 20))
  760. .urem(ConstantRange(APInt(16, 20), APInt(16, 30))),
  761. ConstantRange(APInt(16, 10), APInt(16, 20)));
  762. // It has to be strictly lower, otherwise the top value may wrap to zero.
  763. EXPECT_EQ(ConstantRange(APInt(16, 10), APInt(16, 20))
  764. .urem(ConstantRange(APInt(16, 19), APInt(16, 30))),
  765. ConstantRange(APInt(16, 0), APInt(16, 20)));
  766. // [12, 14] % 10 is [2, 4], but we conservatively compute [0, 9].
  767. EXPECT_EQ(ConstantRange(APInt(16, 12), APInt(16, 15))
  768. .urem(ConstantRange(APInt(16, 10))),
  769. ConstantRange(APInt(16, 0), APInt(16, 10)));
  770. TestUnsignedBinOpExhaustive(
  771. [](const ConstantRange &CR1, const ConstantRange &CR2) {
  772. return CR1.urem(CR2);
  773. },
  774. [](const APInt &N1, const APInt &N2) {
  775. return N1.urem(N2);
  776. },
  777. /* SkipZeroRHS */ true, /* CorrectnessOnly */ true);
  778. }
  779. TEST_F(ConstantRangeTest, Shl) {
  780. ConstantRange Some2(APInt(16, 0xfff), APInt(16, 0x8000));
  781. ConstantRange WrapNullMax(APInt(16, 0x1), APInt(16, 0x0));
  782. EXPECT_EQ(Full.shl(Full), Full);
  783. EXPECT_EQ(Full.shl(Empty), Empty);
  784. EXPECT_EQ(Full.shl(One), Full); // TODO: [0, (-1 << 0xa) + 1)
  785. EXPECT_EQ(Full.shl(Some), Full); // TODO: [0, (-1 << 0xa) + 1)
  786. EXPECT_EQ(Full.shl(Wrap), Full);
  787. EXPECT_EQ(Empty.shl(Empty), Empty);
  788. EXPECT_EQ(Empty.shl(One), Empty);
  789. EXPECT_EQ(Empty.shl(Some), Empty);
  790. EXPECT_EQ(Empty.shl(Wrap), Empty);
  791. EXPECT_EQ(One.shl(One), ConstantRange(APInt(16, 0xa << 0xa),
  792. APInt(16, (0xa << 0xa) + 1)));
  793. EXPECT_EQ(One.shl(Some), Full); // TODO: [0xa << 0xa, 0)
  794. EXPECT_EQ(One.shl(Wrap), Full); // TODO: [0xa, 0xa << 14 + 1)
  795. EXPECT_EQ(Some.shl(Some), Full); // TODO: [0xa << 0xa, 0xfc01)
  796. EXPECT_EQ(Some.shl(Wrap), Full); // TODO: [0xa, 0x7ff << 0x5 + 1)
  797. EXPECT_EQ(Wrap.shl(Wrap), Full);
  798. EXPECT_EQ(
  799. Some2.shl(ConstantRange(APInt(16, 0x1))),
  800. ConstantRange(APInt(16, 0xfff << 0x1), APInt(16, 0x7fff << 0x1) + 1));
  801. EXPECT_EQ(One.shl(WrapNullMax), Full);
  802. }
  803. TEST_F(ConstantRangeTest, Lshr) {
  804. EXPECT_EQ(Full.lshr(Full), Full);
  805. EXPECT_EQ(Full.lshr(Empty), Empty);
  806. EXPECT_EQ(Full.lshr(One), ConstantRange(APInt(16, 0),
  807. APInt(16, (0xffff >> 0xa) + 1)));
  808. EXPECT_EQ(Full.lshr(Some), ConstantRange(APInt(16, 0),
  809. APInt(16, (0xffff >> 0xa) + 1)));
  810. EXPECT_EQ(Full.lshr(Wrap), Full);
  811. EXPECT_EQ(Empty.lshr(Empty), Empty);
  812. EXPECT_EQ(Empty.lshr(One), Empty);
  813. EXPECT_EQ(Empty.lshr(Some), Empty);
  814. EXPECT_EQ(Empty.lshr(Wrap), Empty);
  815. EXPECT_EQ(One.lshr(One), ConstantRange(APInt(16, 0)));
  816. EXPECT_EQ(One.lshr(Some), ConstantRange(APInt(16, 0)));
  817. EXPECT_EQ(One.lshr(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
  818. EXPECT_EQ(Some.lshr(Some), ConstantRange(APInt(16, 0),
  819. APInt(16, (0xaaa >> 0xa) + 1)));
  820. EXPECT_EQ(Some.lshr(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
  821. EXPECT_EQ(Wrap.lshr(Wrap), Full);
  822. }
  823. TEST_F(ConstantRangeTest, Ashr) {
  824. EXPECT_EQ(Full.ashr(Full), Full);
  825. EXPECT_EQ(Full.ashr(Empty), Empty);
  826. EXPECT_EQ(Full.ashr(One), ConstantRange(APInt(16, 0xffe0),
  827. APInt(16, (0x7fff >> 0xa) + 1 )));
  828. ConstantRange Small(APInt(16, 0xa), APInt(16, 0xb));
  829. EXPECT_EQ(Full.ashr(Small), ConstantRange(APInt(16, 0xffe0),
  830. APInt(16, (0x7fff >> 0xa) + 1 )));
  831. EXPECT_EQ(Full.ashr(Some), ConstantRange(APInt(16, 0xffe0),
  832. APInt(16, (0x7fff >> 0xa) + 1 )));
  833. EXPECT_EQ(Full.ashr(Wrap), Full);
  834. EXPECT_EQ(Empty.ashr(Empty), Empty);
  835. EXPECT_EQ(Empty.ashr(One), Empty);
  836. EXPECT_EQ(Empty.ashr(Some), Empty);
  837. EXPECT_EQ(Empty.ashr(Wrap), Empty);
  838. EXPECT_EQ(One.ashr(One), ConstantRange(APInt(16, 0)));
  839. EXPECT_EQ(One.ashr(Some), ConstantRange(APInt(16, 0)));
  840. EXPECT_EQ(One.ashr(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xb)));
  841. EXPECT_EQ(Some.ashr(Some), ConstantRange(APInt(16, 0),
  842. APInt(16, (0xaaa >> 0xa) + 1)));
  843. EXPECT_EQ(Some.ashr(Wrap), ConstantRange(APInt(16, 0), APInt(16, 0xaaa)));
  844. EXPECT_EQ(Wrap.ashr(Wrap), Full);
  845. ConstantRange Neg(APInt(16, 0xf3f0, true), APInt(16, 0xf7f8, true));
  846. EXPECT_EQ(Neg.ashr(Small), ConstantRange(APInt(16, 0xfffc, true),
  847. APInt(16, 0xfffe, true)));
  848. }
  849. TEST(ConstantRange, MakeAllowedICmpRegion) {
  850. // PR8250
  851. ConstantRange SMax = ConstantRange(APInt::getSignedMaxValue(32));
  852. EXPECT_TRUE(ConstantRange::makeAllowedICmpRegion(ICmpInst::ICMP_SGT, SMax)
  853. .isEmptySet());
  854. }
  855. TEST(ConstantRange, MakeSatisfyingICmpRegion) {
  856. ConstantRange LowHalf(APInt(8, 0), APInt(8, 128));
  857. ConstantRange HighHalf(APInt(8, 128), APInt(8, 0));
  858. ConstantRange EmptySet(8, /* isFullSet = */ false);
  859. EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_NE, LowHalf),
  860. HighHalf);
  861. EXPECT_EQ(
  862. ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_NE, HighHalf),
  863. LowHalf);
  864. EXPECT_TRUE(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_EQ,
  865. HighHalf).isEmptySet());
  866. ConstantRange UnsignedSample(APInt(8, 5), APInt(8, 200));
  867. EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_ULT,
  868. UnsignedSample),
  869. ConstantRange(APInt(8, 0), APInt(8, 5)));
  870. EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_ULE,
  871. UnsignedSample),
  872. ConstantRange(APInt(8, 0), APInt(8, 6)));
  873. EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_UGT,
  874. UnsignedSample),
  875. ConstantRange(APInt(8, 200), APInt(8, 0)));
  876. EXPECT_EQ(ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_UGE,
  877. UnsignedSample),
  878. ConstantRange(APInt(8, 199), APInt(8, 0)));
  879. ConstantRange SignedSample(APInt(8, -5), APInt(8, 5));
  880. EXPECT_EQ(
  881. ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SLT, SignedSample),
  882. ConstantRange(APInt(8, -128), APInt(8, -5)));
  883. EXPECT_EQ(
  884. ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SLE, SignedSample),
  885. ConstantRange(APInt(8, -128), APInt(8, -4)));
  886. EXPECT_EQ(
  887. ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SGT, SignedSample),
  888. ConstantRange(APInt(8, 5), APInt(8, -128)));
  889. EXPECT_EQ(
  890. ConstantRange::makeSatisfyingICmpRegion(ICmpInst::ICMP_SGE, SignedSample),
  891. ConstantRange(APInt(8, 4), APInt(8, -128)));
  892. }
  893. TEST(ConstantRange, MakeGuaranteedNoWrapRegion) {
  894. const int IntMin4Bits = 8;
  895. const int IntMax4Bits = 7;
  896. typedef OverflowingBinaryOperator OBO;
  897. for (int Const : {0, -1, -2, 1, 2, IntMin4Bits, IntMax4Bits}) {
  898. APInt C(4, Const, true /* = isSigned */);
  899. auto NUWRegion = ConstantRange::makeGuaranteedNoWrapRegion(
  900. Instruction::Add, C, OBO::NoUnsignedWrap);
  901. EXPECT_FALSE(NUWRegion.isEmptySet());
  902. auto NSWRegion = ConstantRange::makeGuaranteedNoWrapRegion(
  903. Instruction::Add, C, OBO::NoSignedWrap);
  904. EXPECT_FALSE(NSWRegion.isEmptySet());
  905. for (APInt I = NUWRegion.getLower(), E = NUWRegion.getUpper(); I != E;
  906. ++I) {
  907. bool Overflow = false;
  908. (void)I.uadd_ov(C, Overflow);
  909. EXPECT_FALSE(Overflow);
  910. }
  911. for (APInt I = NSWRegion.getLower(), E = NSWRegion.getUpper(); I != E;
  912. ++I) {
  913. bool Overflow = false;
  914. (void)I.sadd_ov(C, Overflow);
  915. EXPECT_FALSE(Overflow);
  916. }
  917. }
  918. for (int Const : {0, -1, -2, 1, 2, IntMin4Bits, IntMax4Bits}) {
  919. APInt C(4, Const, true /* = isSigned */);
  920. auto NUWRegion = ConstantRange::makeGuaranteedNoWrapRegion(
  921. Instruction::Sub, C, OBO::NoUnsignedWrap);
  922. EXPECT_FALSE(NUWRegion.isEmptySet());
  923. auto NSWRegion = ConstantRange::makeGuaranteedNoWrapRegion(
  924. Instruction::Sub, C, OBO::NoSignedWrap);
  925. EXPECT_FALSE(NSWRegion.isEmptySet());
  926. for (APInt I = NUWRegion.getLower(), E = NUWRegion.getUpper(); I != E;
  927. ++I) {
  928. bool Overflow = false;
  929. (void)I.usub_ov(C, Overflow);
  930. EXPECT_FALSE(Overflow);
  931. }
  932. for (APInt I = NSWRegion.getLower(), E = NSWRegion.getUpper(); I != E;
  933. ++I) {
  934. bool Overflow = false;
  935. (void)I.ssub_ov(C, Overflow);
  936. EXPECT_FALSE(Overflow);
  937. }
  938. }
  939. auto NSWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion(
  940. Instruction::Add, ConstantRange(32, /* isFullSet = */ true),
  941. OBO::NoSignedWrap);
  942. EXPECT_TRUE(NSWForAllValues.isSingleElement() &&
  943. NSWForAllValues.getSingleElement()->isMinValue());
  944. NSWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion(
  945. Instruction::Sub, ConstantRange(32, /* isFullSet = */ true),
  946. OBO::NoSignedWrap);
  947. EXPECT_TRUE(NSWForAllValues.isSingleElement() &&
  948. NSWForAllValues.getSingleElement()->isMaxValue());
  949. auto NUWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion(
  950. Instruction::Add, ConstantRange(32, /* isFullSet = */ true),
  951. OBO::NoUnsignedWrap);
  952. EXPECT_TRUE(NUWForAllValues.isSingleElement() &&
  953. NUWForAllValues.getSingleElement()->isMinValue());
  954. NUWForAllValues = ConstantRange::makeGuaranteedNoWrapRegion(
  955. Instruction::Sub, ConstantRange(32, /* isFullSet = */ true),
  956. OBO::NoUnsignedWrap);
  957. EXPECT_TRUE(NUWForAllValues.isSingleElement() &&
  958. NUWForAllValues.getSingleElement()->isMaxValue());
  959. EXPECT_TRUE(ConstantRange::makeGuaranteedNoWrapRegion(
  960. Instruction::Add, APInt(32, 0), OBO::NoUnsignedWrap).isFullSet());
  961. EXPECT_TRUE(ConstantRange::makeGuaranteedNoWrapRegion(
  962. Instruction::Add, APInt(32, 0), OBO::NoSignedWrap).isFullSet());
  963. EXPECT_TRUE(ConstantRange::makeGuaranteedNoWrapRegion(
  964. Instruction::Sub, APInt(32, 0), OBO::NoUnsignedWrap).isFullSet());
  965. EXPECT_TRUE(ConstantRange::makeGuaranteedNoWrapRegion(
  966. Instruction::Sub, APInt(32, 0), OBO::NoSignedWrap).isFullSet());
  967. ConstantRange OneToFive(APInt(32, 1), APInt(32, 6));
  968. EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
  969. Instruction::Add, OneToFive, OBO::NoSignedWrap),
  970. ConstantRange(APInt::getSignedMinValue(32),
  971. APInt::getSignedMaxValue(32) - 4));
  972. EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
  973. Instruction::Add, OneToFive, OBO::NoUnsignedWrap),
  974. ConstantRange(APInt::getMinValue(32), APInt::getMinValue(32) - 5));
  975. EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
  976. Instruction::Sub, OneToFive, OBO::NoSignedWrap),
  977. ConstantRange(APInt::getSignedMinValue(32) + 5,
  978. APInt::getSignedMinValue(32)));
  979. EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
  980. Instruction::Sub, OneToFive, OBO::NoUnsignedWrap),
  981. ConstantRange(APInt::getMinValue(32) + 5, APInt::getMinValue(32)));
  982. ConstantRange MinusFiveToMinusTwo(APInt(32, -5), APInt(32, -1));
  983. EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
  984. Instruction::Add, MinusFiveToMinusTwo, OBO::NoSignedWrap),
  985. ConstantRange(APInt::getSignedMinValue(32) + 5,
  986. APInt::getSignedMinValue(32)));
  987. EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
  988. Instruction::Add, MinusFiveToMinusTwo, OBO::NoUnsignedWrap),
  989. ConstantRange(APInt(32, 0), APInt(32, 2)));
  990. EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
  991. Instruction::Sub, MinusFiveToMinusTwo, OBO::NoSignedWrap),
  992. ConstantRange(APInt::getSignedMinValue(32),
  993. APInt::getSignedMaxValue(32) - 4));
  994. EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
  995. Instruction::Sub, MinusFiveToMinusTwo, OBO::NoUnsignedWrap),
  996. ConstantRange(APInt::getMaxValue(32) - 1,
  997. APInt::getMinValue(32)));
  998. ConstantRange MinusOneToOne(APInt(32, -1), APInt(32, 2));
  999. EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
  1000. Instruction::Add, MinusOneToOne, OBO::NoSignedWrap),
  1001. ConstantRange(APInt::getSignedMinValue(32) + 1,
  1002. APInt::getSignedMinValue(32) - 1));
  1003. EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
  1004. Instruction::Add, MinusOneToOne, OBO::NoUnsignedWrap),
  1005. ConstantRange(APInt(32, 0), APInt(32, 1)));
  1006. EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
  1007. Instruction::Sub, MinusOneToOne, OBO::NoSignedWrap),
  1008. ConstantRange(APInt::getSignedMinValue(32) + 1,
  1009. APInt::getSignedMinValue(32) - 1));
  1010. EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
  1011. Instruction::Sub, MinusOneToOne, OBO::NoUnsignedWrap),
  1012. ConstantRange(APInt::getMaxValue(32),
  1013. APInt::getMinValue(32)));
  1014. ConstantRange One(APInt(32, 1), APInt(32, 2));
  1015. EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
  1016. Instruction::Add, One, OBO::NoSignedWrap),
  1017. ConstantRange(APInt::getSignedMinValue(32),
  1018. APInt::getSignedMaxValue(32)));
  1019. EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
  1020. Instruction::Add, One, OBO::NoUnsignedWrap),
  1021. ConstantRange(APInt::getMinValue(32), APInt::getMaxValue(32)));
  1022. EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
  1023. Instruction::Sub, One, OBO::NoSignedWrap),
  1024. ConstantRange(APInt::getSignedMinValue(32) + 1,
  1025. APInt::getSignedMinValue(32)));
  1026. EXPECT_EQ(ConstantRange::makeGuaranteedNoWrapRegion(
  1027. Instruction::Sub, One, OBO::NoUnsignedWrap),
  1028. ConstantRange(APInt::getMinValue(32) + 1, APInt::getMinValue(32)));
  1029. }
  1030. template<typename Fn>
  1031. void TestNoWrapRegionExhaustive(Instruction::BinaryOps BinOp,
  1032. unsigned NoWrapKind, Fn OverflowFn) {
  1033. // When using 4 bits this test needs ~3s on a debug build.
  1034. unsigned Bits = 3;
  1035. EnumerateTwoConstantRanges(Bits,
  1036. [&](const ConstantRange &CR1, const ConstantRange &CR2) {
  1037. if (CR2.isEmptySet())
  1038. return;
  1039. ConstantRange NoWrap =
  1040. ConstantRange::makeGuaranteedNoWrapRegion(BinOp, CR2, NoWrapKind);
  1041. ForeachNumInConstantRange(CR1, [&](const APInt &N1) {
  1042. bool NoOverflow = true;
  1043. bool Overflow = true;
  1044. ForeachNumInConstantRange(CR2, [&](const APInt &N2) {
  1045. if (OverflowFn(N1, N2))
  1046. NoOverflow = false;
  1047. else
  1048. Overflow = false;
  1049. });
  1050. EXPECT_EQ(NoOverflow, NoWrap.contains(N1));
  1051. // The no-wrap range is exact for single-element ranges.
  1052. if (CR2.isSingleElement()) {
  1053. EXPECT_EQ(Overflow, !NoWrap.contains(N1));
  1054. }
  1055. });
  1056. });
  1057. }
  1058. // Show that makeGuaranteedNoWrapRegion() is maximal, and for single-element
  1059. // ranges also exact.
  1060. TEST(ConstantRange, NoWrapRegionExhaustive) {
  1061. TestNoWrapRegionExhaustive(
  1062. Instruction::Add, OverflowingBinaryOperator::NoUnsignedWrap,
  1063. [](const APInt &N1, const APInt &N2) {
  1064. bool Overflow;
  1065. (void) N1.uadd_ov(N2, Overflow);
  1066. return Overflow;
  1067. });
  1068. TestNoWrapRegionExhaustive(
  1069. Instruction::Add, OverflowingBinaryOperator::NoSignedWrap,
  1070. [](const APInt &N1, const APInt &N2) {
  1071. bool Overflow;
  1072. (void) N1.sadd_ov(N2, Overflow);
  1073. return Overflow;
  1074. });
  1075. TestNoWrapRegionExhaustive(
  1076. Instruction::Sub, OverflowingBinaryOperator::NoUnsignedWrap,
  1077. [](const APInt &N1, const APInt &N2) {
  1078. bool Overflow;
  1079. (void) N1.usub_ov(N2, Overflow);
  1080. return Overflow;
  1081. });
  1082. TestNoWrapRegionExhaustive(
  1083. Instruction::Sub, OverflowingBinaryOperator::NoSignedWrap,
  1084. [](const APInt &N1, const APInt &N2) {
  1085. bool Overflow;
  1086. (void) N1.ssub_ov(N2, Overflow);
  1087. return Overflow;
  1088. });
  1089. TestNoWrapRegionExhaustive(
  1090. Instruction::Mul, OverflowingBinaryOperator::NoUnsignedWrap,
  1091. [](const APInt &N1, const APInt &N2) {
  1092. bool Overflow;
  1093. (void) N1.umul_ov(N2, Overflow);
  1094. return Overflow;
  1095. });
  1096. TestNoWrapRegionExhaustive(
  1097. Instruction::Mul, OverflowingBinaryOperator::NoSignedWrap,
  1098. [](const APInt &N1, const APInt &N2) {
  1099. bool Overflow;
  1100. (void) N1.smul_ov(N2, Overflow);
  1101. return Overflow;
  1102. });
  1103. }
  1104. TEST(ConstantRange, GetEquivalentICmp) {
  1105. APInt RHS;
  1106. CmpInst::Predicate Pred;
  1107. EXPECT_TRUE(ConstantRange(APInt::getMinValue(32), APInt(32, 100))
  1108. .getEquivalentICmp(Pred, RHS));
  1109. EXPECT_EQ(Pred, CmpInst::ICMP_ULT);
  1110. EXPECT_EQ(RHS, APInt(32, 100));
  1111. EXPECT_TRUE(ConstantRange(APInt::getSignedMinValue(32), APInt(32, 100))
  1112. .getEquivalentICmp(Pred, RHS));
  1113. EXPECT_EQ(Pred, CmpInst::ICMP_SLT);
  1114. EXPECT_EQ(RHS, APInt(32, 100));
  1115. EXPECT_TRUE(ConstantRange(APInt(32, 100), APInt::getMinValue(32))
  1116. .getEquivalentICmp(Pred, RHS));
  1117. EXPECT_EQ(Pred, CmpInst::ICMP_UGE);
  1118. EXPECT_EQ(RHS, APInt(32, 100));
  1119. EXPECT_TRUE(ConstantRange(APInt(32, 100), APInt::getSignedMinValue(32))
  1120. .getEquivalentICmp(Pred, RHS));
  1121. EXPECT_EQ(Pred, CmpInst::ICMP_SGE);
  1122. EXPECT_EQ(RHS, APInt(32, 100));
  1123. EXPECT_TRUE(
  1124. ConstantRange(32, /*isFullSet=*/true).getEquivalentICmp(Pred, RHS));
  1125. EXPECT_EQ(Pred, CmpInst::ICMP_UGE);
  1126. EXPECT_EQ(RHS, APInt(32, 0));
  1127. EXPECT_TRUE(
  1128. ConstantRange(32, /*isFullSet=*/false).getEquivalentICmp(Pred, RHS));
  1129. EXPECT_EQ(Pred, CmpInst::ICMP_ULT);
  1130. EXPECT_EQ(RHS, APInt(32, 0));
  1131. EXPECT_FALSE(ConstantRange(APInt(32, 100), APInt(32, 200))
  1132. .getEquivalentICmp(Pred, RHS));
  1133. EXPECT_FALSE(ConstantRange(APInt::getSignedMinValue(32) - APInt(32, 100),
  1134. APInt::getSignedMinValue(32) + APInt(32, 100))
  1135. .getEquivalentICmp(Pred, RHS));
  1136. EXPECT_FALSE(ConstantRange(APInt::getMinValue(32) - APInt(32, 100),
  1137. APInt::getMinValue(32) + APInt(32, 100))
  1138. .getEquivalentICmp(Pred, RHS));
  1139. EXPECT_TRUE(ConstantRange(APInt(32, 100)).getEquivalentICmp(Pred, RHS));
  1140. EXPECT_EQ(Pred, CmpInst::ICMP_EQ);
  1141. EXPECT_EQ(RHS, APInt(32, 100));
  1142. EXPECT_TRUE(
  1143. ConstantRange(APInt(32, 100)).inverse().getEquivalentICmp(Pred, RHS));
  1144. EXPECT_EQ(Pred, CmpInst::ICMP_NE);
  1145. EXPECT_EQ(RHS, APInt(32, 100));
  1146. EXPECT_TRUE(
  1147. ConstantRange(APInt(512, 100)).inverse().getEquivalentICmp(Pred, RHS));
  1148. EXPECT_EQ(Pred, CmpInst::ICMP_NE);
  1149. EXPECT_EQ(RHS, APInt(512, 100));
  1150. // NB! It would be correct for the following four calls to getEquivalentICmp
  1151. // to return ordered predicates like CmpInst::ICMP_ULT or CmpInst::ICMP_UGT.
  1152. // However, that's not the case today.
  1153. EXPECT_TRUE(ConstantRange(APInt(32, 0)).getEquivalentICmp(Pred, RHS));
  1154. EXPECT_EQ(Pred, CmpInst::ICMP_EQ);
  1155. EXPECT_EQ(RHS, APInt(32, 0));
  1156. EXPECT_TRUE(
  1157. ConstantRange(APInt(32, 0)).inverse().getEquivalentICmp(Pred, RHS));
  1158. EXPECT_EQ(Pred, CmpInst::ICMP_NE);
  1159. EXPECT_EQ(RHS, APInt(32, 0));
  1160. EXPECT_TRUE(ConstantRange(APInt(32, -1)).getEquivalentICmp(Pred, RHS));
  1161. EXPECT_EQ(Pred, CmpInst::ICMP_EQ);
  1162. EXPECT_EQ(RHS, APInt(32, -1));
  1163. EXPECT_TRUE(
  1164. ConstantRange(APInt(32, -1)).inverse().getEquivalentICmp(Pred, RHS));
  1165. EXPECT_EQ(Pred, CmpInst::ICMP_NE);
  1166. EXPECT_EQ(RHS, APInt(32, -1));
  1167. }
  1168. TEST(ConstantRange, MakeGuaranteedNoWrapRegionMulUnsignedSingleValue) {
  1169. typedef OverflowingBinaryOperator OBO;
  1170. for (uint64_t I = std::numeric_limits<uint8_t>::min();
  1171. I <= std::numeric_limits<uint8_t>::max(); I++) {
  1172. auto Range = ConstantRange::makeGuaranteedNoWrapRegion(
  1173. Instruction::Mul, ConstantRange(APInt(8, I), APInt(8, I + 1)),
  1174. OBO::NoUnsignedWrap);
  1175. for (uint64_t V = std::numeric_limits<uint8_t>::min();
  1176. V <= std::numeric_limits<uint8_t>::max(); V++) {
  1177. bool Overflow;
  1178. (void)APInt(8, I).umul_ov(APInt(8, V), Overflow);
  1179. EXPECT_EQ(!Overflow, Range.contains(APInt(8, V)));
  1180. }
  1181. }
  1182. }
  1183. TEST(ConstantRange, MakeGuaranteedNoWrapRegionMulSignedSingleValue) {
  1184. typedef OverflowingBinaryOperator OBO;
  1185. for (int64_t I = std::numeric_limits<int8_t>::min();
  1186. I <= std::numeric_limits<int8_t>::max(); I++) {
  1187. auto Range = ConstantRange::makeGuaranteedNoWrapRegion(
  1188. Instruction::Mul,
  1189. ConstantRange(APInt(8, I, /*isSigned=*/true),
  1190. APInt(8, I + 1, /*isSigned=*/true)),
  1191. OBO::NoSignedWrap);
  1192. for (int64_t V = std::numeric_limits<int8_t>::min();
  1193. V <= std::numeric_limits<int8_t>::max(); V++) {
  1194. bool Overflow;
  1195. (void)APInt(8, I, /*isSigned=*/true)
  1196. .smul_ov(APInt(8, V, /*isSigned=*/true), Overflow);
  1197. EXPECT_EQ(!Overflow, Range.contains(APInt(8, V, /*isSigned=*/true)));
  1198. }
  1199. }
  1200. }
  1201. TEST(ConstantRange, MakeGuaranteedNoWrapRegionMulUnsignedRange) {
  1202. typedef OverflowingBinaryOperator OBO;
  1203. for (uint64_t Lo = std::numeric_limits<uint8_t>::min();
  1204. Lo <= std::numeric_limits<uint8_t>::max(); Lo++) {
  1205. for (uint64_t Hi = Lo; Hi <= std::numeric_limits<uint8_t>::max(); Hi++) {
  1206. EXPECT_EQ(
  1207. ConstantRange::makeGuaranteedNoWrapRegion(
  1208. Instruction::Mul, ConstantRange(APInt(8, Lo), APInt(8, Hi + 1)),
  1209. OBO::NoUnsignedWrap),
  1210. ConstantRange::makeGuaranteedNoWrapRegion(
  1211. Instruction::Mul, ConstantRange(APInt(8, Hi), APInt(8, Hi + 1)),
  1212. OBO::NoUnsignedWrap));
  1213. }
  1214. }
  1215. }
  1216. TEST(ConstantRange, MakeGuaranteedNoWrapRegionMulSignedRange) {
  1217. typedef OverflowingBinaryOperator OBO;
  1218. int Lo = -12, Hi = 16;
  1219. auto Range = ConstantRange::makeGuaranteedNoWrapRegion(
  1220. Instruction::Mul,
  1221. ConstantRange(APInt(8, Lo, /*isSigned=*/true),
  1222. APInt(8, Hi + 1, /*isSigned=*/true)),
  1223. OBO::NoSignedWrap);
  1224. for (int64_t V = std::numeric_limits<int8_t>::min();
  1225. V <= std::numeric_limits<int8_t>::max(); V++) {
  1226. bool AnyOverflow = false;
  1227. for (int64_t I = Lo; I <= Hi; I++) {
  1228. bool Overflow;
  1229. (void)APInt(8, I, /*isSigned=*/true)
  1230. .smul_ov(APInt(8, V, /*isSigned=*/true), Overflow);
  1231. AnyOverflow |= Overflow;
  1232. }
  1233. EXPECT_EQ(!AnyOverflow, Range.contains(APInt(8, V, /*isSigned=*/true)));
  1234. }
  1235. }
  1236. #define EXPECT_MAY_OVERFLOW(op) \
  1237. EXPECT_EQ(ConstantRange::OverflowResult::MayOverflow, (op))
  1238. #define EXPECT_ALWAYS_OVERFLOWS(op) \
  1239. EXPECT_EQ(ConstantRange::OverflowResult::AlwaysOverflows, (op))
  1240. #define EXPECT_NEVER_OVERFLOWS(op) \
  1241. EXPECT_EQ(ConstantRange::OverflowResult::NeverOverflows, (op))
  1242. TEST_F(ConstantRangeTest, UnsignedAddOverflow) {
  1243. // Ill-defined - may overflow is a conservative result.
  1244. EXPECT_MAY_OVERFLOW(Some.unsignedAddMayOverflow(Empty));
  1245. EXPECT_MAY_OVERFLOW(Empty.unsignedAddMayOverflow(Some));
  1246. // Never overflow despite one full/wrap set.
  1247. ConstantRange Zero(APInt::getNullValue(16));
  1248. EXPECT_NEVER_OVERFLOWS(Full.unsignedAddMayOverflow(Zero));
  1249. EXPECT_NEVER_OVERFLOWS(Wrap.unsignedAddMayOverflow(Zero));
  1250. EXPECT_NEVER_OVERFLOWS(Zero.unsignedAddMayOverflow(Full));
  1251. EXPECT_NEVER_OVERFLOWS(Zero.unsignedAddMayOverflow(Wrap));
  1252. // But usually full/wrap always may overflow.
  1253. EXPECT_MAY_OVERFLOW(Full.unsignedAddMayOverflow(One));
  1254. EXPECT_MAY_OVERFLOW(Wrap.unsignedAddMayOverflow(One));
  1255. EXPECT_MAY_OVERFLOW(One.unsignedAddMayOverflow(Full));
  1256. EXPECT_MAY_OVERFLOW(One.unsignedAddMayOverflow(Wrap));
  1257. ConstantRange A(APInt(16, 0xfd00), APInt(16, 0xfe00));
  1258. ConstantRange B1(APInt(16, 0x0100), APInt(16, 0x0201));
  1259. ConstantRange B2(APInt(16, 0x0100), APInt(16, 0x0202));
  1260. EXPECT_NEVER_OVERFLOWS(A.unsignedAddMayOverflow(B1));
  1261. EXPECT_MAY_OVERFLOW(A.unsignedAddMayOverflow(B2));
  1262. EXPECT_NEVER_OVERFLOWS(B1.unsignedAddMayOverflow(A));
  1263. EXPECT_MAY_OVERFLOW(B2.unsignedAddMayOverflow(A));
  1264. ConstantRange C1(APInt(16, 0x0299), APInt(16, 0x0400));
  1265. ConstantRange C2(APInt(16, 0x0300), APInt(16, 0x0400));
  1266. EXPECT_MAY_OVERFLOW(A.unsignedAddMayOverflow(C1));
  1267. EXPECT_ALWAYS_OVERFLOWS(A.unsignedAddMayOverflow(C2));
  1268. EXPECT_MAY_OVERFLOW(C1.unsignedAddMayOverflow(A));
  1269. EXPECT_ALWAYS_OVERFLOWS(C2.unsignedAddMayOverflow(A));
  1270. }
  1271. TEST_F(ConstantRangeTest, UnsignedSubOverflow) {
  1272. // Ill-defined - may overflow is a conservative result.
  1273. EXPECT_MAY_OVERFLOW(Some.unsignedSubMayOverflow(Empty));
  1274. EXPECT_MAY_OVERFLOW(Empty.unsignedSubMayOverflow(Some));
  1275. // Never overflow despite one full/wrap set.
  1276. ConstantRange Zero(APInt::getNullValue(16));
  1277. ConstantRange Max(APInt::getAllOnesValue(16));
  1278. EXPECT_NEVER_OVERFLOWS(Full.unsignedSubMayOverflow(Zero));
  1279. EXPECT_NEVER_OVERFLOWS(Wrap.unsignedSubMayOverflow(Zero));
  1280. EXPECT_NEVER_OVERFLOWS(Max.unsignedSubMayOverflow(Full));
  1281. EXPECT_NEVER_OVERFLOWS(Max.unsignedSubMayOverflow(Wrap));
  1282. // But usually full/wrap always may overflow.
  1283. EXPECT_MAY_OVERFLOW(Full.unsignedSubMayOverflow(One));
  1284. EXPECT_MAY_OVERFLOW(Wrap.unsignedSubMayOverflow(One));
  1285. EXPECT_MAY_OVERFLOW(One.unsignedSubMayOverflow(Full));
  1286. EXPECT_MAY_OVERFLOW(One.unsignedSubMayOverflow(Wrap));
  1287. ConstantRange A(APInt(16, 0x0000), APInt(16, 0x0100));
  1288. ConstantRange B(APInt(16, 0x0100), APInt(16, 0x0200));
  1289. EXPECT_NEVER_OVERFLOWS(B.unsignedSubMayOverflow(A));
  1290. EXPECT_ALWAYS_OVERFLOWS(A.unsignedSubMayOverflow(B));
  1291. ConstantRange A1(APInt(16, 0x0000), APInt(16, 0x0101));
  1292. ConstantRange B1(APInt(16, 0x0100), APInt(16, 0x0201));
  1293. EXPECT_NEVER_OVERFLOWS(B1.unsignedSubMayOverflow(A1));
  1294. EXPECT_MAY_OVERFLOW(A1.unsignedSubMayOverflow(B1));
  1295. ConstantRange A2(APInt(16, 0x0000), APInt(16, 0x0102));
  1296. ConstantRange B2(APInt(16, 0x0100), APInt(16, 0x0202));
  1297. EXPECT_MAY_OVERFLOW(B2.unsignedSubMayOverflow(A2));
  1298. EXPECT_MAY_OVERFLOW(A2.unsignedSubMayOverflow(B2));
  1299. }
  1300. TEST_F(ConstantRangeTest, SignedAddOverflow) {
  1301. // Ill-defined - may overflow is a conservative result.
  1302. EXPECT_MAY_OVERFLOW(Some.signedAddMayOverflow(Empty));
  1303. EXPECT_MAY_OVERFLOW(Empty.signedAddMayOverflow(Some));
  1304. // Never overflow despite one full/wrap set.
  1305. ConstantRange Zero(APInt::getNullValue(16));
  1306. EXPECT_NEVER_OVERFLOWS(Full.signedAddMayOverflow(Zero));
  1307. EXPECT_NEVER_OVERFLOWS(Wrap.signedAddMayOverflow(Zero));
  1308. EXPECT_NEVER_OVERFLOWS(Zero.signedAddMayOverflow(Full));
  1309. EXPECT_NEVER_OVERFLOWS(Zero.signedAddMayOverflow(Wrap));
  1310. // But usually full/wrap always may overflow.
  1311. EXPECT_MAY_OVERFLOW(Full.signedAddMayOverflow(One));
  1312. EXPECT_MAY_OVERFLOW(Wrap.signedAddMayOverflow(One));
  1313. EXPECT_MAY_OVERFLOW(One.signedAddMayOverflow(Full));
  1314. EXPECT_MAY_OVERFLOW(One.signedAddMayOverflow(Wrap));
  1315. ConstantRange A(APInt(16, 0x7d00), APInt(16, 0x7e00));
  1316. ConstantRange B1(APInt(16, 0x0100), APInt(16, 0x0201));
  1317. ConstantRange B2(APInt(16, 0x0100), APInt(16, 0x0202));
  1318. EXPECT_NEVER_OVERFLOWS(A.signedAddMayOverflow(B1));
  1319. EXPECT_MAY_OVERFLOW(A.signedAddMayOverflow(B2));
  1320. ConstantRange B3(APInt(16, 0x8000), APInt(16, 0x0201));
  1321. ConstantRange B4(APInt(16, 0x8000), APInt(16, 0x0202));
  1322. EXPECT_NEVER_OVERFLOWS(A.signedAddMayOverflow(B3));
  1323. EXPECT_MAY_OVERFLOW(A.signedAddMayOverflow(B4));
  1324. ConstantRange B5(APInt(16, 0x0299), APInt(16, 0x0400));
  1325. ConstantRange B6(APInt(16, 0x0300), APInt(16, 0x0400));
  1326. EXPECT_MAY_OVERFLOW(A.signedAddMayOverflow(B5));
  1327. EXPECT_ALWAYS_OVERFLOWS(A.signedAddMayOverflow(B6));
  1328. ConstantRange C(APInt(16, 0x8200), APInt(16, 0x8300));
  1329. ConstantRange D1(APInt(16, 0xfe00), APInt(16, 0xff00));
  1330. ConstantRange D2(APInt(16, 0xfd99), APInt(16, 0xff00));
  1331. EXPECT_NEVER_OVERFLOWS(C.signedAddMayOverflow(D1));
  1332. EXPECT_MAY_OVERFLOW(C.signedAddMayOverflow(D2));
  1333. ConstantRange D3(APInt(16, 0xfe00), APInt(16, 0x8000));
  1334. ConstantRange D4(APInt(16, 0xfd99), APInt(16, 0x8000));
  1335. EXPECT_NEVER_OVERFLOWS(C.signedAddMayOverflow(D3));
  1336. EXPECT_MAY_OVERFLOW(C.signedAddMayOverflow(D4));
  1337. ConstantRange D5(APInt(16, 0xfc00), APInt(16, 0xfd02));
  1338. ConstantRange D6(APInt(16, 0xfc00), APInt(16, 0xfd01));
  1339. EXPECT_MAY_OVERFLOW(C.signedAddMayOverflow(D5));
  1340. EXPECT_ALWAYS_OVERFLOWS(C.signedAddMayOverflow(D6));
  1341. ConstantRange E(APInt(16, 0xff00), APInt(16, 0x0100));
  1342. EXPECT_NEVER_OVERFLOWS(E.signedAddMayOverflow(E));
  1343. ConstantRange F(APInt(16, 0xf000), APInt(16, 0x7000));
  1344. EXPECT_MAY_OVERFLOW(F.signedAddMayOverflow(F));
  1345. }
  1346. TEST_F(ConstantRangeTest, SignedSubOverflow) {
  1347. // Ill-defined - may overflow is a conservative result.
  1348. EXPECT_MAY_OVERFLOW(Some.signedSubMayOverflow(Empty));
  1349. EXPECT_MAY_OVERFLOW(Empty.signedSubMayOverflow(Some));
  1350. // Never overflow despite one full/wrap set.
  1351. ConstantRange Zero(APInt::getNullValue(16));
  1352. EXPECT_NEVER_OVERFLOWS(Full.signedSubMayOverflow(Zero));
  1353. EXPECT_NEVER_OVERFLOWS(Wrap.signedSubMayOverflow(Zero));
  1354. // But usually full/wrap always may overflow.
  1355. EXPECT_MAY_OVERFLOW(Full.signedSubMayOverflow(One));
  1356. EXPECT_MAY_OVERFLOW(Wrap.signedSubMayOverflow(One));
  1357. EXPECT_MAY_OVERFLOW(One.signedSubMayOverflow(Full));
  1358. EXPECT_MAY_OVERFLOW(One.signedSubMayOverflow(Wrap));
  1359. ConstantRange A(APInt(16, 0x7d00), APInt(16, 0x7e00));
  1360. ConstantRange B1(APInt(16, 0xfe00), APInt(16, 0xff00));
  1361. ConstantRange B2(APInt(16, 0xfd99), APInt(16, 0xff00));
  1362. EXPECT_NEVER_OVERFLOWS(A.signedSubMayOverflow(B1));
  1363. EXPECT_MAY_OVERFLOW(A.signedSubMayOverflow(B2));
  1364. ConstantRange B3(APInt(16, 0xfc00), APInt(16, 0xfd02));
  1365. ConstantRange B4(APInt(16, 0xfc00), APInt(16, 0xfd01));
  1366. EXPECT_MAY_OVERFLOW(A.signedSubMayOverflow(B3));
  1367. EXPECT_ALWAYS_OVERFLOWS(A.signedSubMayOverflow(B4));
  1368. ConstantRange C(APInt(16, 0x8200), APInt(16, 0x8300));
  1369. ConstantRange D1(APInt(16, 0x0100), APInt(16, 0x0201));
  1370. ConstantRange D2(APInt(16, 0x0100), APInt(16, 0x0202));
  1371. EXPECT_NEVER_OVERFLOWS(C.signedSubMayOverflow(D1));
  1372. EXPECT_MAY_OVERFLOW(C.signedSubMayOverflow(D2));
  1373. ConstantRange D3(APInt(16, 0x0299), APInt(16, 0x0400));
  1374. ConstantRange D4(APInt(16, 0x0300), APInt(16, 0x0400));
  1375. EXPECT_MAY_OVERFLOW(C.signedSubMayOverflow(D3));
  1376. EXPECT_ALWAYS_OVERFLOWS(C.signedSubMayOverflow(D4));
  1377. ConstantRange E(APInt(16, 0xff00), APInt(16, 0x0100));
  1378. EXPECT_NEVER_OVERFLOWS(E.signedSubMayOverflow(E));
  1379. ConstantRange F(APInt(16, 0xf000), APInt(16, 0x7001));
  1380. EXPECT_MAY_OVERFLOW(F.signedSubMayOverflow(F));
  1381. }
  1382. template<typename Fn1, typename Fn2>
  1383. static void TestOverflowExhaustive(Fn1 OverflowFn, Fn2 MayOverflowFn) {
  1384. // Constant range overflow checks are tested exhaustively on 4-bit numbers.
  1385. unsigned Bits = 4;
  1386. EnumerateTwoConstantRanges(Bits, [=](const ConstantRange &CR1,
  1387. const ConstantRange &CR2) {
  1388. // Loop over all N1 in CR1 and N2 in CR2 and check whether any of the
  1389. // operations have overflow / have no overflow.
  1390. bool RangeHasOverflow = false;
  1391. bool RangeHasNoOverflow = false;
  1392. ForeachNumInConstantRange(CR1, [&](const APInt &N1) {
  1393. ForeachNumInConstantRange(CR2, [&](const APInt &N2) {
  1394. if (OverflowFn(N1, N2))
  1395. RangeHasOverflow = true;
  1396. else
  1397. RangeHasNoOverflow = true;
  1398. });
  1399. });
  1400. ConstantRange::OverflowResult OR = MayOverflowFn(CR1, CR2);
  1401. switch (OR) {
  1402. case ConstantRange::OverflowResult::AlwaysOverflows:
  1403. EXPECT_TRUE(RangeHasOverflow);
  1404. EXPECT_FALSE(RangeHasNoOverflow);
  1405. break;
  1406. case ConstantRange::OverflowResult::NeverOverflows:
  1407. EXPECT_FALSE(RangeHasOverflow);
  1408. EXPECT_TRUE(RangeHasNoOverflow);
  1409. break;
  1410. case ConstantRange::OverflowResult::MayOverflow:
  1411. // We return MayOverflow for empty sets as a conservative result,
  1412. // but of course neither the RangeHasOverflow nor the
  1413. // RangeHasNoOverflow flags will be set.
  1414. if (CR1.isEmptySet() || CR2.isEmptySet())
  1415. break;
  1416. EXPECT_TRUE(RangeHasOverflow);
  1417. EXPECT_TRUE(RangeHasNoOverflow);
  1418. break;
  1419. }
  1420. });
  1421. }
  1422. TEST_F(ConstantRangeTest, UnsignedAddOverflowExhaustive) {
  1423. TestOverflowExhaustive(
  1424. [](const APInt &N1, const APInt &N2) {
  1425. bool Overflow;
  1426. (void) N1.uadd_ov(N2, Overflow);
  1427. return Overflow;
  1428. },
  1429. [](const ConstantRange &CR1, const ConstantRange &CR2) {
  1430. return CR1.unsignedAddMayOverflow(CR2);
  1431. });
  1432. }
  1433. TEST_F(ConstantRangeTest, UnsignedSubOverflowExhaustive) {
  1434. TestOverflowExhaustive(
  1435. [](const APInt &N1, const APInt &N2) {
  1436. bool Overflow;
  1437. (void) N1.usub_ov(N2, Overflow);
  1438. return Overflow;
  1439. },
  1440. [](const ConstantRange &CR1, const ConstantRange &CR2) {
  1441. return CR1.unsignedSubMayOverflow(CR2);
  1442. });
  1443. }
  1444. TEST_F(ConstantRangeTest, UnsignedMulOverflowExhaustive) {
  1445. TestOverflowExhaustive(
  1446. [](const APInt &N1, const APInt &N2) {
  1447. bool Overflow;
  1448. (void) N1.umul_ov(N2, Overflow);
  1449. return Overflow;
  1450. },
  1451. [](const ConstantRange &CR1, const ConstantRange &CR2) {
  1452. return CR1.unsignedMulMayOverflow(CR2);
  1453. });
  1454. }
  1455. TEST_F(ConstantRangeTest, SignedAddOverflowExhaustive) {
  1456. TestOverflowExhaustive(
  1457. [](const APInt &N1, const APInt &N2) {
  1458. bool Overflow;
  1459. (void) N1.sadd_ov(N2, Overflow);
  1460. return Overflow;
  1461. },
  1462. [](const ConstantRange &CR1, const ConstantRange &CR2) {
  1463. return CR1.signedAddMayOverflow(CR2);
  1464. });
  1465. }
  1466. TEST_F(ConstantRangeTest, SignedSubOverflowExhaustive) {
  1467. TestOverflowExhaustive(
  1468. [](const APInt &N1, const APInt &N2) {
  1469. bool Overflow;
  1470. (void) N1.ssub_ov(N2, Overflow);
  1471. return Overflow;
  1472. },
  1473. [](const ConstantRange &CR1, const ConstantRange &CR2) {
  1474. return CR1.signedSubMayOverflow(CR2);
  1475. });
  1476. }
  1477. TEST_F(ConstantRangeTest, FromKnownBits) {
  1478. KnownBits Unknown(16);
  1479. EXPECT_EQ(Full, ConstantRange::fromKnownBits(Unknown, /*signed*/false));
  1480. EXPECT_EQ(Full, ConstantRange::fromKnownBits(Unknown, /*signed*/true));
  1481. // .10..01. -> unsigned 01000010 (66) to 11011011 (219)
  1482. // -> signed 11000010 (194) to 01011011 (91)
  1483. KnownBits Known(8);
  1484. Known.Zero = 36;
  1485. Known.One = 66;
  1486. ConstantRange Unsigned(APInt(8, 66), APInt(8, 219 + 1));
  1487. ConstantRange Signed(APInt(8, 194), APInt(8, 91 + 1));
  1488. EXPECT_EQ(Unsigned, ConstantRange::fromKnownBits(Known, /*signed*/false));
  1489. EXPECT_EQ(Signed, ConstantRange::fromKnownBits(Known, /*signed*/true));
  1490. // 1.10.10. -> 10100100 (164) to 11101101 (237)
  1491. Known.Zero = 18;
  1492. Known.One = 164;
  1493. ConstantRange CR1(APInt(8, 164), APInt(8, 237 + 1));
  1494. EXPECT_EQ(CR1, ConstantRange::fromKnownBits(Known, /*signed*/false));
  1495. EXPECT_EQ(CR1, ConstantRange::fromKnownBits(Known, /*signed*/true));
  1496. // 01.0.1.0 -> 01000100 (68) to 01101110 (110)
  1497. Known.Zero = 145;
  1498. Known.One = 68;
  1499. ConstantRange CR2(APInt(8, 68), APInt(8, 110 + 1));
  1500. EXPECT_EQ(CR2, ConstantRange::fromKnownBits(Known, /*signed*/false));
  1501. EXPECT_EQ(CR2, ConstantRange::fromKnownBits(Known, /*signed*/true));
  1502. }
  1503. TEST_F(ConstantRangeTest, FromKnownBitsExhaustive) {
  1504. unsigned Bits = 4;
  1505. unsigned Max = 1 << Bits;
  1506. KnownBits Known(Bits);
  1507. for (unsigned Zero = 0; Zero < Max; ++Zero) {
  1508. for (unsigned One = 0; One < Max; ++One) {
  1509. Known.Zero = Zero;
  1510. Known.One = One;
  1511. if (Known.hasConflict() || Known.isUnknown())
  1512. continue;
  1513. APInt MinUnsigned = APInt::getMaxValue(Bits);
  1514. APInt MaxUnsigned = APInt::getMinValue(Bits);
  1515. APInt MinSigned = APInt::getSignedMaxValue(Bits);
  1516. APInt MaxSigned = APInt::getSignedMinValue(Bits);
  1517. for (unsigned N = 0; N < Max; ++N) {
  1518. APInt Num(Bits, N);
  1519. if ((Num & Known.Zero) != 0 || (~Num & Known.One) != 0)
  1520. continue;
  1521. if (Num.ult(MinUnsigned)) MinUnsigned = Num;
  1522. if (Num.ugt(MaxUnsigned)) MaxUnsigned = Num;
  1523. if (Num.slt(MinSigned)) MinSigned = Num;
  1524. if (Num.sgt(MaxSigned)) MaxSigned = Num;
  1525. }
  1526. ConstantRange UnsignedCR(MinUnsigned, MaxUnsigned + 1);
  1527. ConstantRange SignedCR(MinSigned, MaxSigned + 1);
  1528. EXPECT_EQ(UnsignedCR, ConstantRange::fromKnownBits(Known, false));
  1529. EXPECT_EQ(SignedCR, ConstantRange::fromKnownBits(Known, true));
  1530. }
  1531. }
  1532. }
  1533. TEST_F(ConstantRangeTest, Negative) {
  1534. // All elements in an empty set (of which there are none) are both negative
  1535. // and non-negative. Empty & full sets checked explicitly for clarity, but
  1536. // they are also covered by the exhaustive test below.
  1537. EXPECT_TRUE(Empty.isAllNegative());
  1538. EXPECT_TRUE(Empty.isAllNonNegative());
  1539. EXPECT_FALSE(Full.isAllNegative());
  1540. EXPECT_FALSE(Full.isAllNonNegative());
  1541. unsigned Bits = 4;
  1542. EnumerateConstantRanges(Bits, [](const ConstantRange &CR) {
  1543. bool AllNegative = true;
  1544. bool AllNonNegative = true;
  1545. ForeachNumInConstantRange(CR, [&](const APInt &N) {
  1546. if (!N.isNegative())
  1547. AllNegative = false;
  1548. if (!N.isNonNegative())
  1549. AllNonNegative = false;
  1550. });
  1551. assert((CR.isEmptySet() || !AllNegative || !AllNonNegative) &&
  1552. "Only empty set can be both all negative and all non-negative");
  1553. EXPECT_EQ(AllNegative, CR.isAllNegative());
  1554. EXPECT_EQ(AllNonNegative, CR.isAllNonNegative());
  1555. });
  1556. }
  1557. TEST_F(ConstantRangeTest, UAddSat) {
  1558. TestUnsignedBinOpExhaustive(
  1559. [](const ConstantRange &CR1, const ConstantRange &CR2) {
  1560. return CR1.uadd_sat(CR2);
  1561. },
  1562. [](const APInt &N1, const APInt &N2) {
  1563. return N1.uadd_sat(N2);
  1564. });
  1565. }
  1566. TEST_F(ConstantRangeTest, USubSat) {
  1567. TestUnsignedBinOpExhaustive(
  1568. [](const ConstantRange &CR1, const ConstantRange &CR2) {
  1569. return CR1.usub_sat(CR2);
  1570. },
  1571. [](const APInt &N1, const APInt &N2) {
  1572. return N1.usub_sat(N2);
  1573. });
  1574. }
  1575. TEST_F(ConstantRangeTest, SAddSat) {
  1576. TestSignedBinOpExhaustive(
  1577. [](const ConstantRange &CR1, const ConstantRange &CR2) {
  1578. return CR1.sadd_sat(CR2);
  1579. },
  1580. [](const APInt &N1, const APInt &N2) {
  1581. return N1.sadd_sat(N2);
  1582. });
  1583. }
  1584. TEST_F(ConstantRangeTest, SSubSat) {
  1585. TestSignedBinOpExhaustive(
  1586. [](const ConstantRange &CR1, const ConstantRange &CR2) {
  1587. return CR1.ssub_sat(CR2);
  1588. },
  1589. [](const APInt &N1, const APInt &N2) {
  1590. return N1.ssub_sat(N2);
  1591. });
  1592. }
  1593. TEST_F(ConstantRangeTest, Abs) {
  1594. unsigned Bits = 4;
  1595. EnumerateConstantRanges(Bits, [&](const ConstantRange &CR) {
  1596. // We're working with unsigned integers here, because it makes the signed
  1597. // min case non-wrapping.
  1598. APInt Min = APInt::getMaxValue(Bits);
  1599. APInt Max = APInt::getMinValue(Bits);
  1600. ForeachNumInConstantRange(CR, [&](const APInt &N) {
  1601. APInt AbsN = N.abs();
  1602. if (AbsN.ult(Min))
  1603. Min = AbsN;
  1604. if (AbsN.ugt(Max))
  1605. Max = AbsN;
  1606. });
  1607. ConstantRange AbsCR = CR.abs();
  1608. if (Min.ugt(Max)) {
  1609. EXPECT_TRUE(AbsCR.isEmptySet());
  1610. return;
  1611. }
  1612. ConstantRange Exact = ConstantRange::getNonEmpty(Min, Max + 1);
  1613. EXPECT_EQ(Exact, AbsCR);
  1614. });
  1615. }
  1616. } // anonymous namespace