icmp.ll 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605
  1. ; RUN: opt < %s -instcombine -S | FileCheck %s
  2. target datalayout = "e-p:64:64:64-p1:16:16:16-p2:32:32:32-p3:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
  3. define i32 @test1(i32 %X) {
  4. entry:
  5. icmp slt i32 %X, 0 ; <i1>:0 [#uses=1]
  6. zext i1 %0 to i32 ; <i32>:1 [#uses=1]
  7. ret i32 %1
  8. ; CHECK-LABEL: @test1(
  9. ; CHECK: lshr i32 %X, 31
  10. ; CHECK-NEXT: ret i32
  11. }
  12. define i32 @test2(i32 %X) {
  13. entry:
  14. icmp ult i32 %X, -2147483648 ; <i1>:0 [#uses=1]
  15. zext i1 %0 to i32 ; <i32>:1 [#uses=1]
  16. ret i32 %1
  17. ; CHECK-LABEL: @test2(
  18. ; CHECK: lshr i32 %X, 31
  19. ; CHECK-NEXT: xor i32
  20. ; CHECK-NEXT: ret i32
  21. }
  22. define i32 @test3(i32 %X) {
  23. entry:
  24. icmp slt i32 %X, 0 ; <i1>:0 [#uses=1]
  25. sext i1 %0 to i32 ; <i32>:1 [#uses=1]
  26. ret i32 %1
  27. ; CHECK-LABEL: @test3(
  28. ; CHECK: ashr i32 %X, 31
  29. ; CHECK-NEXT: ret i32
  30. }
  31. define i32 @test4(i32 %X) {
  32. entry:
  33. icmp ult i32 %X, -2147483648 ; <i1>:0 [#uses=1]
  34. sext i1 %0 to i32 ; <i32>:1 [#uses=1]
  35. ret i32 %1
  36. ; CHECK-LABEL: @test4(
  37. ; CHECK: ashr i32 %X, 31
  38. ; CHECK-NEXT: xor i32
  39. ; CHECK-NEXT: ret i32
  40. }
  41. ; PR4837
  42. define <2 x i1> @test5(<2 x i64> %x) {
  43. entry:
  44. %V = icmp eq <2 x i64> %x, undef
  45. ret <2 x i1> %V
  46. ; CHECK-LABEL: @test5(
  47. ; CHECK: ret <2 x i1> <i1 true, i1 true>
  48. }
  49. define i32 @test6(i32 %a, i32 %b) {
  50. %c = icmp sle i32 %a, -1
  51. %d = zext i1 %c to i32
  52. %e = sub i32 0, %d
  53. %f = and i32 %e, %b
  54. ret i32 %f
  55. ; CHECK-LABEL: @test6(
  56. ; CHECK-NEXT: ashr i32 %a, 31
  57. ; CHECK-NEXT: %f = and i32 %e, %b
  58. ; CHECK-NEXT: ret i32 %f
  59. }
  60. define i1 @test7(i32 %x) {
  61. entry:
  62. %a = add i32 %x, -1
  63. %b = icmp ult i32 %a, %x
  64. ret i1 %b
  65. ; CHECK-LABEL: @test7(
  66. ; CHECK: %b = icmp ne i32 %x, 0
  67. ; CHECK: ret i1 %b
  68. }
  69. define i1 @test8(i32 %x){
  70. entry:
  71. %a = add i32 %x, -1
  72. %b = icmp eq i32 %a, %x
  73. ret i1 %b
  74. ; CHECK-LABEL: @test8(
  75. ; CHECK: ret i1 false
  76. }
  77. define i1 @test9(i32 %x) {
  78. entry:
  79. %a = add i32 %x, -2
  80. %b = icmp ugt i32 %x, %a
  81. ret i1 %b
  82. ; CHECK-LABEL: @test9(
  83. ; CHECK: icmp ugt i32 %x, 1
  84. ; CHECK: ret i1 %b
  85. }
  86. define i1 @test10(i32 %x){
  87. entry:
  88. %a = add i32 %x, -1
  89. %b = icmp slt i32 %a, %x
  90. ret i1 %b
  91. ; CHECK-LABEL: @test10(
  92. ; CHECK: %b = icmp ne i32 %x, -2147483648
  93. ; CHECK: ret i1 %b
  94. }
  95. define i1 @test11(i32 %x) {
  96. %a = add nsw i32 %x, 8
  97. %b = icmp slt i32 %x, %a
  98. ret i1 %b
  99. ; CHECK-LABEL: @test11(
  100. ; CHECK: ret i1 true
  101. }
  102. ; PR6195
  103. define i1 @test12(i1 %A) {
  104. %S = select i1 %A, i64 -4294967295, i64 8589934591
  105. %B = icmp ne i64 bitcast (<2 x i32> <i32 1, i32 -1> to i64), %S
  106. ret i1 %B
  107. ; CHECK-LABEL: @test12(
  108. ; CHECK-NEXT: = xor i1 %A, true
  109. ; CHECK-NEXT: ret i1
  110. }
  111. ; PR6481
  112. define i1 @test13(i8 %X) nounwind readnone {
  113. entry:
  114. %cmp = icmp slt i8 undef, %X
  115. ret i1 %cmp
  116. ; CHECK-LABEL: @test13(
  117. ; CHECK: ret i1 false
  118. }
  119. define i1 @test14(i8 %X) nounwind readnone {
  120. entry:
  121. %cmp = icmp slt i8 undef, -128
  122. ret i1 %cmp
  123. ; CHECK-LABEL: @test14(
  124. ; CHECK: ret i1 false
  125. }
  126. define i1 @test15() nounwind readnone {
  127. entry:
  128. %cmp = icmp eq i8 undef, -128
  129. ret i1 %cmp
  130. ; CHECK-LABEL: @test15(
  131. ; CHECK: ret i1 undef
  132. }
  133. define i1 @test16() nounwind readnone {
  134. entry:
  135. %cmp = icmp ne i8 undef, -128
  136. ret i1 %cmp
  137. ; CHECK-LABEL: @test16(
  138. ; CHECK: ret i1 undef
  139. }
  140. define i1 @test17(i32 %x) nounwind {
  141. %shl = shl i32 1, %x
  142. %and = and i32 %shl, 8
  143. %cmp = icmp eq i32 %and, 0
  144. ret i1 %cmp
  145. ; CHECK-LABEL: @test17(
  146. ; CHECK-NEXT: %cmp = icmp ne i32 %x, 3
  147. }
  148. define i1 @test17a(i32 %x) nounwind {
  149. %shl = shl i32 1, %x
  150. %and = and i32 %shl, 7
  151. %cmp = icmp eq i32 %and, 0
  152. ret i1 %cmp
  153. ; CHECK-LABEL: @test17a(
  154. ; CHECK-NEXT: %cmp = icmp ugt i32 %x, 2
  155. }
  156. define i1 @test18(i32 %x) nounwind {
  157. %sh = lshr i32 8, %x
  158. %and = and i32 %sh, 1
  159. %cmp = icmp eq i32 %and, 0
  160. ret i1 %cmp
  161. ; CHECK-LABEL: @test18(
  162. ; CHECK-NEXT: %cmp = icmp ne i32 %x, 3
  163. }
  164. define i1 @test19(i32 %x) nounwind {
  165. %shl = shl i32 1, %x
  166. %and = and i32 %shl, 8
  167. %cmp = icmp eq i32 %and, 8
  168. ret i1 %cmp
  169. ; CHECK-LABEL: @test19(
  170. ; CHECK-NEXT: %cmp = icmp eq i32 %x, 3
  171. }
  172. define i1 @test20(i32 %x) nounwind {
  173. %shl = shl i32 1, %x
  174. %and = and i32 %shl, 8
  175. %cmp = icmp ne i32 %and, 0
  176. ret i1 %cmp
  177. ; CHECK-LABEL: @test20(
  178. ; CHECK-NEXT: %cmp = icmp eq i32 %x, 3
  179. }
  180. define i1 @test20a(i32 %x) nounwind {
  181. %shl = shl i32 1, %x
  182. %and = and i32 %shl, 7
  183. %cmp = icmp ne i32 %and, 0
  184. ret i1 %cmp
  185. ; CHECK-LABEL: @test20a(
  186. ; CHECK-NEXT: %cmp = icmp ult i32 %x, 3
  187. }
  188. define i1 @test21(i8 %x, i8 %y) {
  189. ; CHECK-LABEL: @test21(
  190. ; CHECK-NOT: or i8
  191. ; CHECK: icmp ugt
  192. %A = or i8 %x, 1
  193. %B = icmp ugt i8 %A, 3
  194. ret i1 %B
  195. }
  196. define i1 @test22(i8 %x, i8 %y) {
  197. ; CHECK-LABEL: @test22(
  198. ; CHECK-NOT: or i8
  199. ; CHECK: icmp ult
  200. %A = or i8 %x, 1
  201. %B = icmp ult i8 %A, 4
  202. ret i1 %B
  203. }
  204. ; PR2740
  205. ; CHECK-LABEL: @test23(
  206. ; CHECK: icmp sgt i32 %x, 1328634634
  207. define i1 @test23(i32 %x) nounwind {
  208. %i3 = sdiv i32 %x, -1328634635
  209. %i4 = icmp eq i32 %i3, -1
  210. ret i1 %i4
  211. }
  212. @X = global [1000 x i32] zeroinitializer
  213. ; PR8882
  214. ; CHECK-LABEL: @test24(
  215. ; CHECK: %cmp = icmp eq i64 %i, 1000
  216. ; CHECK: ret i1 %cmp
  217. define i1 @test24(i64 %i) {
  218. %p1 = getelementptr inbounds i32, i32* getelementptr inbounds ([1000 x i32], [1000 x i32]* @X, i64 0, i64 0), i64 %i
  219. %cmp = icmp eq i32* %p1, getelementptr inbounds ([1000 x i32], [1000 x i32]* @X, i64 1, i64 0)
  220. ret i1 %cmp
  221. }
  222. @X_as1 = addrspace(1) global [1000 x i32] zeroinitializer
  223. ; CHECK: @test24_as1
  224. ; CHECK: trunc i64 %i to i16
  225. ; CHECK: %cmp = icmp eq i16 %1, 1000
  226. ; CHECK: ret i1 %cmp
  227. define i1 @test24_as1(i64 %i) {
  228. %p1 = getelementptr inbounds i32, i32 addrspace(1)* getelementptr inbounds ([1000 x i32], [1000 x i32] addrspace(1)* @X_as1, i64 0, i64 0), i64 %i
  229. %cmp = icmp eq i32 addrspace(1)* %p1, getelementptr inbounds ([1000 x i32], [1000 x i32] addrspace(1)* @X_as1, i64 1, i64 0)
  230. ret i1 %cmp
  231. }
  232. ; CHECK-LABEL: @test25(
  233. ; X + Z > Y + Z -> X > Y if there is no overflow.
  234. ; CHECK: %c = icmp sgt i32 %x, %y
  235. ; CHECK: ret i1 %c
  236. define i1 @test25(i32 %x, i32 %y, i32 %z) {
  237. %lhs = add nsw i32 %x, %z
  238. %rhs = add nsw i32 %y, %z
  239. %c = icmp sgt i32 %lhs, %rhs
  240. ret i1 %c
  241. }
  242. ; CHECK-LABEL: @test26(
  243. ; X + Z > Y + Z -> X > Y if there is no overflow.
  244. ; CHECK: %c = icmp ugt i32 %x, %y
  245. ; CHECK: ret i1 %c
  246. define i1 @test26(i32 %x, i32 %y, i32 %z) {
  247. %lhs = add nuw i32 %x, %z
  248. %rhs = add nuw i32 %y, %z
  249. %c = icmp ugt i32 %lhs, %rhs
  250. ret i1 %c
  251. }
  252. ; CHECK-LABEL: @test27(
  253. ; X - Z > Y - Z -> X > Y if there is no overflow.
  254. ; CHECK: %c = icmp sgt i32 %x, %y
  255. ; CHECK: ret i1 %c
  256. define i1 @test27(i32 %x, i32 %y, i32 %z) {
  257. %lhs = sub nsw i32 %x, %z
  258. %rhs = sub nsw i32 %y, %z
  259. %c = icmp sgt i32 %lhs, %rhs
  260. ret i1 %c
  261. }
  262. ; CHECK-LABEL: @test28(
  263. ; X - Z > Y - Z -> X > Y if there is no overflow.
  264. ; CHECK: %c = icmp ugt i32 %x, %y
  265. ; CHECK: ret i1 %c
  266. define i1 @test28(i32 %x, i32 %y, i32 %z) {
  267. %lhs = sub nuw i32 %x, %z
  268. %rhs = sub nuw i32 %y, %z
  269. %c = icmp ugt i32 %lhs, %rhs
  270. ret i1 %c
  271. }
  272. ; CHECK-LABEL: @test29(
  273. ; X + Y > X -> Y > 0 if there is no overflow.
  274. ; CHECK: %c = icmp sgt i32 %y, 0
  275. ; CHECK: ret i1 %c
  276. define i1 @test29(i32 %x, i32 %y) {
  277. %lhs = add nsw i32 %x, %y
  278. %c = icmp sgt i32 %lhs, %x
  279. ret i1 %c
  280. }
  281. ; CHECK-LABEL: @test30(
  282. ; X + Y > X -> Y > 0 if there is no overflow.
  283. ; CHECK: %c = icmp ne i32 %y, 0
  284. ; CHECK: ret i1 %c
  285. define i1 @test30(i32 %x, i32 %y) {
  286. %lhs = add nuw i32 %x, %y
  287. %c = icmp ugt i32 %lhs, %x
  288. ret i1 %c
  289. }
  290. ; CHECK-LABEL: @test31(
  291. ; X > X + Y -> 0 > Y if there is no overflow.
  292. ; CHECK: %c = icmp slt i32 %y, 0
  293. ; CHECK: ret i1 %c
  294. define i1 @test31(i32 %x, i32 %y) {
  295. %rhs = add nsw i32 %x, %y
  296. %c = icmp sgt i32 %x, %rhs
  297. ret i1 %c
  298. }
  299. ; CHECK-LABEL: @test32(
  300. ; X > X + Y -> 0 > Y if there is no overflow.
  301. ; CHECK: ret i1 false
  302. define i1 @test32(i32 %x, i32 %y) {
  303. %rhs = add nuw i32 %x, %y
  304. %c = icmp ugt i32 %x, %rhs
  305. ret i1 %c
  306. }
  307. ; CHECK-LABEL: @test33(
  308. ; X - Y > X -> 0 > Y if there is no overflow.
  309. ; CHECK: %c = icmp slt i32 %y, 0
  310. ; CHECK: ret i1 %c
  311. define i1 @test33(i32 %x, i32 %y) {
  312. %lhs = sub nsw i32 %x, %y
  313. %c = icmp sgt i32 %lhs, %x
  314. ret i1 %c
  315. }
  316. ; CHECK-LABEL: @test34(
  317. ; X - Y > X -> 0 > Y if there is no overflow.
  318. ; CHECK: ret i1 false
  319. define i1 @test34(i32 %x, i32 %y) {
  320. %lhs = sub nuw i32 %x, %y
  321. %c = icmp ugt i32 %lhs, %x
  322. ret i1 %c
  323. }
  324. ; CHECK-LABEL: @test35(
  325. ; X > X - Y -> Y > 0 if there is no overflow.
  326. ; CHECK: %c = icmp sgt i32 %y, 0
  327. ; CHECK: ret i1 %c
  328. define i1 @test35(i32 %x, i32 %y) {
  329. %rhs = sub nsw i32 %x, %y
  330. %c = icmp sgt i32 %x, %rhs
  331. ret i1 %c
  332. }
  333. ; CHECK-LABEL: @test36(
  334. ; X > X - Y -> Y > 0 if there is no overflow.
  335. ; CHECK: %c = icmp ne i32 %y, 0
  336. ; CHECK: ret i1 %c
  337. define i1 @test36(i32 %x, i32 %y) {
  338. %rhs = sub nuw i32 %x, %y
  339. %c = icmp ugt i32 %x, %rhs
  340. ret i1 %c
  341. }
  342. ; CHECK-LABEL: @test37(
  343. ; X - Y > X - Z -> Z > Y if there is no overflow.
  344. ; CHECK: %c = icmp sgt i32 %z, %y
  345. ; CHECK: ret i1 %c
  346. define i1 @test37(i32 %x, i32 %y, i32 %z) {
  347. %lhs = sub nsw i32 %x, %y
  348. %rhs = sub nsw i32 %x, %z
  349. %c = icmp sgt i32 %lhs, %rhs
  350. ret i1 %c
  351. }
  352. ; CHECK-LABEL: @test38(
  353. ; X - Y > X - Z -> Z > Y if there is no overflow.
  354. ; CHECK: %c = icmp ugt i32 %z, %y
  355. ; CHECK: ret i1 %c
  356. define i1 @test38(i32 %x, i32 %y, i32 %z) {
  357. %lhs = sub nuw i32 %x, %y
  358. %rhs = sub nuw i32 %x, %z
  359. %c = icmp ugt i32 %lhs, %rhs
  360. ret i1 %c
  361. }
  362. ; PR9343 #1
  363. ; CHECK-LABEL: @test39(
  364. ; CHECK: %B = icmp eq i32 %X, 0
  365. define i1 @test39(i32 %X, i32 %Y) {
  366. %A = ashr exact i32 %X, %Y
  367. %B = icmp eq i32 %A, 0
  368. ret i1 %B
  369. }
  370. ; CHECK-LABEL: @test40(
  371. ; CHECK: %B = icmp ne i32 %X, 0
  372. define i1 @test40(i32 %X, i32 %Y) {
  373. %A = lshr exact i32 %X, %Y
  374. %B = icmp ne i32 %A, 0
  375. ret i1 %B
  376. }
  377. ; PR9343 #3
  378. ; CHECK-LABEL: @test41(
  379. ; CHECK: ret i1 true
  380. define i1 @test41(i32 %X, i32 %Y) {
  381. %A = urem i32 %X, %Y
  382. %B = icmp ugt i32 %Y, %A
  383. ret i1 %B
  384. }
  385. ; CHECK-LABEL: @test42(
  386. ; CHECK: %B = icmp sgt i32 %Y, -1
  387. define i1 @test42(i32 %X, i32 %Y) {
  388. %A = srem i32 %X, %Y
  389. %B = icmp slt i32 %A, %Y
  390. ret i1 %B
  391. }
  392. ; CHECK-LABEL: @test43(
  393. ; CHECK: %B = icmp slt i32 %Y, 0
  394. define i1 @test43(i32 %X, i32 %Y) {
  395. %A = srem i32 %X, %Y
  396. %B = icmp slt i32 %Y, %A
  397. ret i1 %B
  398. }
  399. ; CHECK-LABEL: @test44(
  400. ; CHECK: %B = icmp sgt i32 %Y, -1
  401. define i1 @test44(i32 %X, i32 %Y) {
  402. %A = srem i32 %X, %Y
  403. %B = icmp slt i32 %A, %Y
  404. ret i1 %B
  405. }
  406. ; CHECK-LABEL: @test45(
  407. ; CHECK: %B = icmp slt i32 %Y, 0
  408. define i1 @test45(i32 %X, i32 %Y) {
  409. %A = srem i32 %X, %Y
  410. %B = icmp slt i32 %Y, %A
  411. ret i1 %B
  412. }
  413. ; PR9343 #4
  414. ; CHECK-LABEL: @test46(
  415. ; CHECK: %C = icmp ult i32 %X, %Y
  416. define i1 @test46(i32 %X, i32 %Y, i32 %Z) {
  417. %A = ashr exact i32 %X, %Z
  418. %B = ashr exact i32 %Y, %Z
  419. %C = icmp ult i32 %A, %B
  420. ret i1 %C
  421. }
  422. ; PR9343 #5
  423. ; CHECK-LABEL: @test47(
  424. ; CHECK: %C = icmp ugt i32 %X, %Y
  425. define i1 @test47(i32 %X, i32 %Y, i32 %Z) {
  426. %A = ashr exact i32 %X, %Z
  427. %B = ashr exact i32 %Y, %Z
  428. %C = icmp ugt i32 %A, %B
  429. ret i1 %C
  430. }
  431. ; PR9343 #8
  432. ; CHECK-LABEL: @test48(
  433. ; CHECK: %C = icmp eq i32 %X, %Y
  434. define i1 @test48(i32 %X, i32 %Y, i32 %Z) {
  435. %A = sdiv exact i32 %X, %Z
  436. %B = sdiv exact i32 %Y, %Z
  437. %C = icmp eq i32 %A, %B
  438. ret i1 %C
  439. }
  440. ; PR8469
  441. ; CHECK-LABEL: @test49(
  442. ; CHECK: ret <2 x i1> <i1 true, i1 true>
  443. define <2 x i1> @test49(<2 x i32> %tmp3) {
  444. entry:
  445. %tmp11 = and <2 x i32> %tmp3, <i32 3, i32 3>
  446. %cmp = icmp ult <2 x i32> %tmp11, <i32 4, i32 4>
  447. ret <2 x i1> %cmp
  448. }
  449. ; PR9343 #7
  450. ; CHECK-LABEL: @test50(
  451. ; CHECK: ret i1 true
  452. define i1 @test50(i16 %X, i32 %Y) {
  453. %A = zext i16 %X to i32
  454. %B = srem i32 %A, %Y
  455. %C = icmp sgt i32 %B, -1
  456. ret i1 %C
  457. }
  458. ; CHECK-LABEL: @test51(
  459. ; CHECK: ret i1 %C
  460. define i1 @test51(i32 %X, i32 %Y) {
  461. %A = and i32 %X, 2147483648
  462. %B = srem i32 %A, %Y
  463. %C = icmp sgt i32 %B, -1
  464. ret i1 %C
  465. }
  466. ; CHECK-LABEL: @test52(
  467. ; CHECK-NEXT: and i32 %x1, 16711935
  468. ; CHECK-NEXT: icmp eq i32 {{.*}}, 4980863
  469. ; CHECK-NEXT: ret i1
  470. define i1 @test52(i32 %x1) nounwind {
  471. %conv = and i32 %x1, 255
  472. %cmp = icmp eq i32 %conv, 127
  473. %tmp2 = lshr i32 %x1, 16
  474. %tmp3 = trunc i32 %tmp2 to i8
  475. %cmp15 = icmp eq i8 %tmp3, 76
  476. %A = and i1 %cmp, %cmp15
  477. ret i1 %A
  478. }
  479. ; PR9838
  480. ; CHECK-LABEL: @test53(
  481. ; CHECK-NEXT: sdiv exact
  482. ; CHECK-NEXT: sdiv
  483. ; CHECK-NEXT: icmp
  484. define i1 @test53(i32 %a, i32 %b) nounwind {
  485. %x = sdiv exact i32 %a, 30
  486. %y = sdiv i32 %b, 30
  487. %z = icmp eq i32 %x, %y
  488. ret i1 %z
  489. }
  490. ; CHECK-LABEL: @test54(
  491. ; CHECK-NEXT: %and = and i8 %a, -64
  492. ; CHECK-NEXT: icmp eq i8 %and, -128
  493. define i1 @test54(i8 %a) nounwind {
  494. %ext = zext i8 %a to i32
  495. %and = and i32 %ext, 192
  496. %ret = icmp eq i32 %and, 128
  497. ret i1 %ret
  498. }
  499. ; CHECK-LABEL: @test55(
  500. ; CHECK-NEXT: icmp eq i32 %a, -123
  501. define i1 @test55(i32 %a) {
  502. %sub = sub i32 0, %a
  503. %cmp = icmp eq i32 %sub, 123
  504. ret i1 %cmp
  505. }
  506. ; CHECK-LABEL: @test56(
  507. ; CHECK-NEXT: icmp eq i32 %a, -113
  508. define i1 @test56(i32 %a) {
  509. %sub = sub i32 10, %a
  510. %cmp = icmp eq i32 %sub, 123
  511. ret i1 %cmp
  512. }
  513. ; PR10267 Don't make icmps more expensive when no other inst is subsumed.
  514. declare void @foo(i32)
  515. ; CHECK-LABEL: @test57(
  516. ; CHECK: %and = and i32 %a, -2
  517. ; CHECK: %cmp = icmp ne i32 %and, 0
  518. define i1 @test57(i32 %a) {
  519. %and = and i32 %a, -2
  520. %cmp = icmp ne i32 %and, 0
  521. call void @foo(i32 %and)
  522. ret i1 %cmp
  523. }
  524. ; rdar://problem/10482509
  525. ; CHECK-LABEL: @cmpabs1(
  526. ; CHECK-NEXT: icmp ne
  527. define zeroext i1 @cmpabs1(i64 %val) {
  528. %sub = sub nsw i64 0, %val
  529. %cmp = icmp slt i64 %val, 0
  530. %sub.val = select i1 %cmp, i64 %sub, i64 %val
  531. %tobool = icmp ne i64 %sub.val, 0
  532. ret i1 %tobool
  533. }
  534. ; CHECK-LABEL: @cmpabs2(
  535. ; CHECK-NEXT: icmp ne
  536. define zeroext i1 @cmpabs2(i64 %val) {
  537. %sub = sub nsw i64 0, %val
  538. %cmp = icmp slt i64 %val, 0
  539. %sub.val = select i1 %cmp, i64 %val, i64 %sub
  540. %tobool = icmp ne i64 %sub.val, 0
  541. ret i1 %tobool
  542. }
  543. ; CHECK-LABEL: @test58(
  544. ; CHECK-NEXT: call i32 @test58_d(i64 36029346783166592)
  545. define void @test58() nounwind {
  546. %cast = bitcast <1 x i64> <i64 36029346783166592> to i64
  547. %call = call i32 @test58_d( i64 %cast) nounwind
  548. ret void
  549. }
  550. declare i32 @test58_d(i64)
  551. define i1 @test59(i8* %foo) {
  552. %bit = bitcast i8* %foo to i32*
  553. %gep1 = getelementptr inbounds i32, i32* %bit, i64 2
  554. %gep2 = getelementptr inbounds i8, i8* %foo, i64 10
  555. %cast1 = bitcast i32* %gep1 to i8*
  556. %cmp = icmp ult i8* %cast1, %gep2
  557. %use = ptrtoint i8* %cast1 to i64
  558. %call = call i32 @test58_d(i64 %use) nounwind
  559. ret i1 %cmp
  560. ; CHECK-LABEL: @test59(
  561. ; CHECK: ret i1 true
  562. }
  563. define i1 @test59_as1(i8 addrspace(1)* %foo) {
  564. %bit = bitcast i8 addrspace(1)* %foo to i32 addrspace(1)*
  565. %gep1 = getelementptr inbounds i32, i32 addrspace(1)* %bit, i64 2
  566. %gep2 = getelementptr inbounds i8, i8 addrspace(1)* %foo, i64 10
  567. %cast1 = bitcast i32 addrspace(1)* %gep1 to i8 addrspace(1)*
  568. %cmp = icmp ult i8 addrspace(1)* %cast1, %gep2
  569. %use = ptrtoint i8 addrspace(1)* %cast1 to i64
  570. %call = call i32 @test58_d(i64 %use) nounwind
  571. ret i1 %cmp
  572. ; CHECK: @test59_as1
  573. ; CHECK: %[[GEP:.+]] = getelementptr inbounds i8, i8 addrspace(1)* %foo, i16 8
  574. ; CHECK: ptrtoint i8 addrspace(1)* %[[GEP]] to i16
  575. ; CHECK: ret i1 true
  576. }
  577. define i1 @test60(i8* %foo, i64 %i, i64 %j) {
  578. %bit = bitcast i8* %foo to i32*
  579. %gep1 = getelementptr inbounds i32, i32* %bit, i64 %i
  580. %gep2 = getelementptr inbounds i8, i8* %foo, i64 %j
  581. %cast1 = bitcast i32* %gep1 to i8*
  582. %cmp = icmp ult i8* %cast1, %gep2
  583. ret i1 %cmp
  584. ; CHECK-LABEL: @test60(
  585. ; CHECK-NEXT: %gep1.idx = shl nuw i64 %i, 2
  586. ; CHECK-NEXT: icmp slt i64 %gep1.idx, %j
  587. ; CHECK-NEXT: ret i1
  588. }
  589. define i1 @test60_as1(i8 addrspace(1)* %foo, i64 %i, i64 %j) {
  590. %bit = bitcast i8 addrspace(1)* %foo to i32 addrspace(1)*
  591. %gep1 = getelementptr inbounds i32, i32 addrspace(1)* %bit, i64 %i
  592. %gep2 = getelementptr inbounds i8, i8 addrspace(1)* %foo, i64 %j
  593. %cast1 = bitcast i32 addrspace(1)* %gep1 to i8 addrspace(1)*
  594. %cmp = icmp ult i8 addrspace(1)* %cast1, %gep2
  595. ret i1 %cmp
  596. ; CHECK: @test60_as1
  597. ; CHECK: trunc i64 %i to i16
  598. ; CHECK: trunc i64 %j to i16
  599. ; CHECK: %gep1.idx = shl nuw i16 %{{.+}}, 2
  600. ; CHECK-NEXT: icmp sgt i16 %{{.+}}, %gep1.idx
  601. ; CHECK-NEXT: ret i1
  602. }
  603. ; Same as test60, but look through an addrspacecast instead of a
  604. ; bitcast. This uses the same sized addrspace.
  605. define i1 @test60_addrspacecast(i8* %foo, i64 %i, i64 %j) {
  606. %bit = addrspacecast i8* %foo to i32 addrspace(3)*
  607. %gep1 = getelementptr inbounds i32, i32 addrspace(3)* %bit, i64 %i
  608. %gep2 = getelementptr inbounds i8, i8* %foo, i64 %j
  609. %cast1 = addrspacecast i32 addrspace(3)* %gep1 to i8*
  610. %cmp = icmp ult i8* %cast1, %gep2
  611. ret i1 %cmp
  612. ; CHECK-LABEL: @test60_addrspacecast(
  613. ; CHECK-NEXT: %gep1.idx = shl nuw i64 %i, 2
  614. ; CHECK-NEXT: icmp slt i64 %gep1.idx, %j
  615. ; CHECK-NEXT: ret i1
  616. }
  617. define i1 @test60_addrspacecast_smaller(i8* %foo, i16 %i, i64 %j) {
  618. %bit = addrspacecast i8* %foo to i32 addrspace(1)*
  619. %gep1 = getelementptr inbounds i32, i32 addrspace(1)* %bit, i16 %i
  620. %gep2 = getelementptr inbounds i8, i8* %foo, i64 %j
  621. %cast1 = addrspacecast i32 addrspace(1)* %gep1 to i8*
  622. %cmp = icmp ult i8* %cast1, %gep2
  623. ret i1 %cmp
  624. ; CHECK-LABEL: @test60_addrspacecast_smaller(
  625. ; CHECK-NEXT: %gep1.idx = shl nuw i16 %i, 2
  626. ; CHECK-NEXT: trunc i64 %j to i16
  627. ; CHECK-NEXT: icmp sgt i16 %1, %gep1.idx
  628. ; CHECK-NEXT: ret i1
  629. }
  630. define i1 @test60_addrspacecast_larger(i8 addrspace(1)* %foo, i32 %i, i16 %j) {
  631. %bit = addrspacecast i8 addrspace(1)* %foo to i32 addrspace(2)*
  632. %gep1 = getelementptr inbounds i32, i32 addrspace(2)* %bit, i32 %i
  633. %gep2 = getelementptr inbounds i8, i8 addrspace(1)* %foo, i16 %j
  634. %cast1 = addrspacecast i32 addrspace(2)* %gep1 to i8 addrspace(1)*
  635. %cmp = icmp ult i8 addrspace(1)* %cast1, %gep2
  636. ret i1 %cmp
  637. ; CHECK-LABEL: @test60_addrspacecast_larger(
  638. ; CHECK-NEXT: %gep1.idx = shl nuw i32 %i, 2
  639. ; CHECK-NEXT: trunc i32 %gep1.idx to i16
  640. ; CHECK-NEXT: icmp slt i16 %1, %j
  641. ; CHECK-NEXT: ret i1
  642. }
  643. define i1 @test61(i8* %foo, i64 %i, i64 %j) {
  644. %bit = bitcast i8* %foo to i32*
  645. %gep1 = getelementptr i32, i32* %bit, i64 %i
  646. %gep2 = getelementptr i8, i8* %foo, i64 %j
  647. %cast1 = bitcast i32* %gep1 to i8*
  648. %cmp = icmp ult i8* %cast1, %gep2
  649. ret i1 %cmp
  650. ; Don't transform non-inbounds GEPs.
  651. ; CHECK-LABEL: @test61(
  652. ; CHECK: icmp ult i8* %cast1, %gep2
  653. ; CHECK-NEXT: ret i1
  654. }
  655. define i1 @test61_as1(i8 addrspace(1)* %foo, i16 %i, i16 %j) {
  656. %bit = bitcast i8 addrspace(1)* %foo to i32 addrspace(1)*
  657. %gep1 = getelementptr i32, i32 addrspace(1)* %bit, i16 %i
  658. %gep2 = getelementptr i8, i8 addrspace(1)* %foo, i16 %j
  659. %cast1 = bitcast i32 addrspace(1)* %gep1 to i8 addrspace(1)*
  660. %cmp = icmp ult i8 addrspace(1)* %cast1, %gep2
  661. ret i1 %cmp
  662. ; Don't transform non-inbounds GEPs.
  663. ; CHECK: @test61_as1
  664. ; CHECK: icmp ult i8 addrspace(1)* %cast1, %gep2
  665. ; CHECK-NEXT: ret i1
  666. }
  667. define i1 @test62(i8* %a) {
  668. %arrayidx1 = getelementptr inbounds i8, i8* %a, i64 1
  669. %arrayidx2 = getelementptr inbounds i8, i8* %a, i64 10
  670. %cmp = icmp slt i8* %arrayidx1, %arrayidx2
  671. ret i1 %cmp
  672. ; CHECK-LABEL: @test62(
  673. ; CHECK-NEXT: ret i1 true
  674. }
  675. define i1 @test62_as1(i8 addrspace(1)* %a) {
  676. ; CHECK-LABEL: @test62_as1(
  677. ; CHECK-NEXT: ret i1 true
  678. %arrayidx1 = getelementptr inbounds i8, i8 addrspace(1)* %a, i64 1
  679. %arrayidx2 = getelementptr inbounds i8, i8 addrspace(1)* %a, i64 10
  680. %cmp = icmp slt i8 addrspace(1)* %arrayidx1, %arrayidx2
  681. ret i1 %cmp
  682. }
  683. define i1 @test63(i8 %a, i32 %b) nounwind {
  684. %z = zext i8 %a to i32
  685. %t = and i32 %b, 255
  686. %c = icmp eq i32 %z, %t
  687. ret i1 %c
  688. ; CHECK-LABEL: @test63(
  689. ; CHECK-NEXT: %1 = trunc i32 %b to i8
  690. ; CHECK-NEXT: %c = icmp eq i8 %1, %a
  691. ; CHECK-NEXT: ret i1 %c
  692. }
  693. define i1 @test64(i8 %a, i32 %b) nounwind {
  694. %t = and i32 %b, 255
  695. %z = zext i8 %a to i32
  696. %c = icmp eq i32 %t, %z
  697. ret i1 %c
  698. ; CHECK-LABEL: @test64(
  699. ; CHECK-NEXT: %1 = trunc i32 %b to i8
  700. ; CHECK-NEXT: %c = icmp eq i8 %1, %a
  701. ; CHECK-NEXT: ret i1 %c
  702. }
  703. define i1 @test65(i64 %A, i64 %B) {
  704. %s1 = add i64 %A, %B
  705. %s2 = add i64 %A, %B
  706. %cmp = icmp eq i64 %s1, %s2
  707. ; CHECK-LABEL: @test65(
  708. ; CHECK-NEXT: ret i1 true
  709. ret i1 %cmp
  710. }
  711. define i1 @test66(i64 %A, i64 %B) {
  712. %s1 = add i64 %A, %B
  713. %s2 = add i64 %B, %A
  714. %cmp = icmp eq i64 %s1, %s2
  715. ; CHECK-LABEL: @test66(
  716. ; CHECK-NEXT: ret i1 true
  717. ret i1 %cmp
  718. }
  719. ; CHECK-LABEL: @test67(
  720. ; CHECK: %and = and i32 %x, 96
  721. ; CHECK: %cmp = icmp ne i32 %and, 0
  722. define i1 @test67(i32 %x) nounwind uwtable {
  723. %and = and i32 %x, 127
  724. %cmp = icmp sgt i32 %and, 31
  725. ret i1 %cmp
  726. }
  727. ; CHECK-LABEL: @test68(
  728. ; CHECK: %cmp = icmp ugt i32 %and, 30
  729. define i1 @test68(i32 %x) nounwind uwtable {
  730. %and = and i32 %x, 127
  731. %cmp = icmp sgt i32 %and, 30
  732. ret i1 %cmp
  733. }
  734. ; PR14708
  735. ; CHECK-LABEL: @test69(
  736. ; CHECK: %1 = and i32 %c, -33
  737. ; CHECK: %2 = icmp eq i32 %1, 65
  738. ; CHECK: ret i1 %2
  739. define i1 @test69(i32 %c) nounwind uwtable {
  740. %1 = icmp eq i32 %c, 97
  741. %2 = icmp eq i32 %c, 65
  742. %3 = or i1 %1, %2
  743. ret i1 %3
  744. }
  745. ; PR15940
  746. ; CHECK-LABEL: @test70(
  747. ; CHECK-NEXT: %A = srem i32 5, %X
  748. ; CHECK-NEXT: %C = icmp ne i32 %A, 2
  749. ; CHECK-NEXT: ret i1 %C
  750. define i1 @test70(i32 %X) {
  751. %A = srem i32 5, %X
  752. %B = add i32 %A, 2
  753. %C = icmp ne i32 %B, 4
  754. ret i1 %C
  755. }
  756. ; CHECK-LABEL: @icmp_sext16trunc(
  757. ; CHECK-NEXT: %1 = trunc i32 %x to i16
  758. ; CHECK-NEXT: %cmp = icmp slt i16 %1, 36
  759. define i1 @icmp_sext16trunc(i32 %x) {
  760. %trunc = trunc i32 %x to i16
  761. %sext = sext i16 %trunc to i32
  762. %cmp = icmp slt i32 %sext, 36
  763. ret i1 %cmp
  764. }
  765. ; CHECK-LABEL: @icmp_sext8trunc(
  766. ; CHECK-NEXT: %1 = trunc i32 %x to i8
  767. ; CHECK-NEXT: %cmp = icmp slt i8 %1, 36
  768. define i1 @icmp_sext8trunc(i32 %x) {
  769. %trunc = trunc i32 %x to i8
  770. %sext = sext i8 %trunc to i32
  771. %cmp = icmp slt i32 %sext, 36
  772. ret i1 %cmp
  773. }
  774. ; CHECK-LABEL: @icmp_shl16(
  775. ; CHECK-NEXT: %1 = trunc i32 %x to i16
  776. ; CHECK-NEXT: %cmp = icmp slt i16 %1, 36
  777. define i1 @icmp_shl16(i32 %x) {
  778. %shl = shl i32 %x, 16
  779. %cmp = icmp slt i32 %shl, 2359296
  780. ret i1 %cmp
  781. }
  782. ; CHECK-LABEL: @icmp_shl24(
  783. ; CHECK-NEXT: %1 = trunc i32 %x to i8
  784. ; CHECK-NEXT: %cmp = icmp slt i8 %1, 36
  785. define i1 @icmp_shl24(i32 %x) {
  786. %shl = shl i32 %x, 24
  787. %cmp = icmp slt i32 %shl, 603979776
  788. ret i1 %cmp
  789. }
  790. ; If the (shl x, C) preserved the sign and this is a sign test,
  791. ; compare the LHS operand instead
  792. ; CHECK-LABEL: @icmp_shl_nsw_sgt(
  793. ; CHECK-NEXT: icmp sgt i32 %x, 0
  794. define i1 @icmp_shl_nsw_sgt(i32 %x) {
  795. %shl = shl nsw i32 %x, 21
  796. %cmp = icmp sgt i32 %shl, 0
  797. ret i1 %cmp
  798. }
  799. ; CHECK-LABEL: @icmp_shl_nsw_sge0(
  800. ; CHECK-NEXT: icmp sgt i32 %x, -1
  801. define i1 @icmp_shl_nsw_sge0(i32 %x) {
  802. %shl = shl nsw i32 %x, 21
  803. %cmp = icmp sge i32 %shl, 0
  804. ret i1 %cmp
  805. }
  806. ; CHECK-LABEL: @icmp_shl_nsw_sge1(
  807. ; CHECK-NEXT: icmp sgt i32 %x, 0
  808. define i1 @icmp_shl_nsw_sge1(i32 %x) {
  809. %shl = shl nsw i32 %x, 21
  810. %cmp = icmp sge i32 %shl, 1
  811. ret i1 %cmp
  812. }
  813. ; Checks for icmp (eq|ne) (shl x, C), 0
  814. ; CHECK-LABEL: @icmp_shl_nsw_eq(
  815. ; CHECK-NEXT: icmp eq i32 %x, 0
  816. define i1 @icmp_shl_nsw_eq(i32 %x) {
  817. %mul = shl nsw i32 %x, 5
  818. %cmp = icmp eq i32 %mul, 0
  819. ret i1 %cmp
  820. }
  821. ; CHECK-LABEL: @icmp_shl_eq(
  822. ; CHECK-NOT: icmp eq i32 %mul, 0
  823. define i1 @icmp_shl_eq(i32 %x) {
  824. %mul = shl i32 %x, 5
  825. %cmp = icmp eq i32 %mul, 0
  826. ret i1 %cmp
  827. }
  828. ; CHECK-LABEL: @icmp_shl_nsw_ne(
  829. ; CHECK-NEXT: icmp ne i32 %x, 0
  830. define i1 @icmp_shl_nsw_ne(i32 %x) {
  831. %mul = shl nsw i32 %x, 7
  832. %cmp = icmp ne i32 %mul, 0
  833. ret i1 %cmp
  834. }
  835. ; CHECK-LABEL: @icmp_shl_ne(
  836. ; CHECK-NOT: icmp ne i32 %x, 0
  837. define i1 @icmp_shl_ne(i32 %x) {
  838. %mul = shl i32 %x, 7
  839. %cmp = icmp ne i32 %mul, 0
  840. ret i1 %cmp
  841. }
  842. ; If the (mul x, C) preserved the sign and this is sign test,
  843. ; compare the LHS operand instead
  844. ; CHECK-LABEL: @icmp_mul_nsw(
  845. ; CHECK-NEXT: icmp sgt i32 %x, 0
  846. define i1 @icmp_mul_nsw(i32 %x) {
  847. %mul = mul nsw i32 %x, 12
  848. %cmp = icmp sgt i32 %mul, 0
  849. ret i1 %cmp
  850. }
  851. ; CHECK-LABEL: @icmp_mul_nsw1(
  852. ; CHECK-NEXT: icmp slt i32 %x, 0
  853. define i1 @icmp_mul_nsw1(i32 %x) {
  854. %mul = mul nsw i32 %x, 12
  855. %cmp = icmp sle i32 %mul, -1
  856. ret i1 %cmp
  857. }
  858. ; CHECK-LABEL: @icmp_mul_nsw_neg(
  859. ; CHECK-NEXT: icmp slt i32 %x, 1
  860. define i1 @icmp_mul_nsw_neg(i32 %x) {
  861. %mul = mul nsw i32 %x, -12
  862. %cmp = icmp sge i32 %mul, 0
  863. ret i1 %cmp
  864. }
  865. ; CHECK-LABEL: @icmp_mul_nsw_neg1(
  866. ; CHECK-NEXT: icmp slt i32 %x, 0
  867. define i1 @icmp_mul_nsw_neg1(i32 %x) {
  868. %mul = mul nsw i32 %x, -12
  869. %cmp = icmp sge i32 %mul, 1
  870. ret i1 %cmp
  871. }
  872. ; CHECK-LABEL: @icmp_mul_nsw_0(
  873. ; CHECK-NOT: icmp sgt i32 %x, 0
  874. define i1 @icmp_mul_nsw_0(i32 %x) {
  875. %mul = mul nsw i32 %x, 0
  876. %cmp = icmp sgt i32 %mul, 0
  877. ret i1 %cmp
  878. }
  879. ; CHECK-LABEL: @icmp_mul(
  880. ; CHECK-NEXT: %mul = mul i32 %x, -12
  881. define i1 @icmp_mul(i32 %x) {
  882. %mul = mul i32 %x, -12
  883. %cmp = icmp sge i32 %mul, 0
  884. ret i1 %cmp
  885. }
  886. ; Checks for icmp (eq|ne) (mul x, C), 0
  887. ; CHECK-LABEL: @icmp_mul_neq0(
  888. ; CHECK-NEXT: icmp ne i32 %x, 0
  889. define i1 @icmp_mul_neq0(i32 %x) {
  890. %mul = mul nsw i32 %x, -12
  891. %cmp = icmp ne i32 %mul, 0
  892. ret i1 %cmp
  893. }
  894. ; CHECK-LABEL: @icmp_mul_eq0(
  895. ; CHECK-NEXT: icmp eq i32 %x, 0
  896. define i1 @icmp_mul_eq0(i32 %x) {
  897. %mul = mul nsw i32 %x, 12
  898. %cmp = icmp eq i32 %mul, 0
  899. ret i1 %cmp
  900. }
  901. ; CHECK-LABEL: @icmp_mul0_eq0(
  902. ; CHECK-NEXT: ret i1 true
  903. define i1 @icmp_mul0_eq0(i32 %x) {
  904. %mul = mul i32 %x, 0
  905. %cmp = icmp eq i32 %mul, 0
  906. ret i1 %cmp
  907. }
  908. ; CHECK-LABEL: @icmp_mul0_ne0(
  909. ; CHECK-NEXT: ret i1 false
  910. define i1 @icmp_mul0_ne0(i32 %x) {
  911. %mul = mul i32 %x, 0
  912. %cmp = icmp ne i32 %mul, 0
  913. ret i1 %cmp
  914. }
  915. ; CHECK-LABEL: @icmp_sub1_sge(
  916. ; CHECK-NEXT: icmp sgt i32 %x, %y
  917. define i1 @icmp_sub1_sge(i32 %x, i32 %y) {
  918. %sub = add nsw i32 %x, -1
  919. %cmp = icmp sge i32 %sub, %y
  920. ret i1 %cmp
  921. }
  922. ; CHECK-LABEL: @icmp_add1_sgt(
  923. ; CHECK-NEXT: icmp sge i32 %x, %y
  924. define i1 @icmp_add1_sgt(i32 %x, i32 %y) {
  925. %add = add nsw i32 %x, 1
  926. %cmp = icmp sgt i32 %add, %y
  927. ret i1 %cmp
  928. }
  929. ; CHECK-LABEL: @icmp_sub1_slt(
  930. ; CHECK-NEXT: icmp sle i32 %x, %y
  931. define i1 @icmp_sub1_slt(i32 %x, i32 %y) {
  932. %sub = add nsw i32 %x, -1
  933. %cmp = icmp slt i32 %sub, %y
  934. ret i1 %cmp
  935. }
  936. ; CHECK-LABEL: @icmp_add1_sle(
  937. ; CHECK-NEXT: icmp slt i32 %x, %y
  938. define i1 @icmp_add1_sle(i32 %x, i32 %y) {
  939. %add = add nsw i32 %x, 1
  940. %cmp = icmp sle i32 %add, %y
  941. ret i1 %cmp
  942. }
  943. ; CHECK-LABEL: @icmp_add20_sge_add57(
  944. ; CHECK-NEXT: [[ADD:%[a-z0-9]+]] = add nsw i32 %y, 37
  945. ; CHECK-NEXT: icmp sle i32 [[ADD]], %x
  946. define i1 @icmp_add20_sge_add57(i32 %x, i32 %y) {
  947. %1 = add nsw i32 %x, 20
  948. %2 = add nsw i32 %y, 57
  949. %cmp = icmp sge i32 %1, %2
  950. ret i1 %cmp
  951. }
  952. ; CHECK-LABEL: @icmp_sub57_sge_sub20(
  953. ; CHECK-NEXT: [[SUB:%[a-z0-9]+]] = add nsw i32 %x, -37
  954. ; CHECK-NEXT: icmp sge i32 [[SUB]], %y
  955. define i1 @icmp_sub57_sge_sub20(i32 %x, i32 %y) {
  956. %1 = add nsw i32 %x, -57
  957. %2 = add nsw i32 %y, -20
  958. %cmp = icmp sge i32 %1, %2
  959. ret i1 %cmp
  960. }
  961. ; CHECK-LABEL: @icmp_and_shl_neg_ne_0(
  962. ; CHECK-NEXT: [[SHL:%[a-z0-9]+]] = shl i32 1, %B
  963. ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 [[SHL]], %A
  964. ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp eq i32 [[AND]], 0
  965. ; CHECK-NEXT: ret i1 [[CMP]]
  966. define i1 @icmp_and_shl_neg_ne_0(i32 %A, i32 %B) {
  967. %neg = xor i32 %A, -1
  968. %shl = shl i32 1, %B
  969. %and = and i32 %shl, %neg
  970. %cmp = icmp ne i32 %and, 0
  971. ret i1 %cmp
  972. }
  973. ; CHECK-LABEL: @icmp_and_shl_neg_eq_0(
  974. ; CHECK-NEXT: [[SHL:%[a-z0-9]+]] = shl i32 1, %B
  975. ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 [[SHL]], %A
  976. ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 [[AND]], 0
  977. ; CHECK-NEXT: ret i1 [[CMP]]
  978. define i1 @icmp_and_shl_neg_eq_0(i32 %A, i32 %B) {
  979. %neg = xor i32 %A, -1
  980. %shl = shl i32 1, %B
  981. %and = and i32 %shl, %neg
  982. %cmp = icmp eq i32 %and, 0
  983. ret i1 %cmp
  984. }
  985. ; CHECK-LABEL: @icmp_add_and_shr_ne_0(
  986. ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %X, 240
  987. ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 [[AND]], 224
  988. ; CHECK-NEXT: ret i1 [[CMP]]
  989. define i1 @icmp_add_and_shr_ne_0(i32 %X) {
  990. %shr = lshr i32 %X, 4
  991. %and = and i32 %shr, 15
  992. %add = add i32 %and, -14
  993. %tobool = icmp ne i32 %add, 0
  994. ret i1 %tobool
  995. }
  996. ; PR16244
  997. ; CHECK-LABEL: define i1 @test71(
  998. ; CHECK-NEXT: ret i1 false
  999. define i1 @test71(i8* %x) {
  1000. %a = getelementptr i8, i8* %x, i64 8
  1001. %b = getelementptr inbounds i8, i8* %x, i64 8
  1002. %c = icmp ugt i8* %a, %b
  1003. ret i1 %c
  1004. }
  1005. define i1 @test71_as1(i8 addrspace(1)* %x) {
  1006. ; CHECK-LABEL: @test71_as1(
  1007. ; CHECK-NEXT: ret i1 false
  1008. %a = getelementptr i8, i8 addrspace(1)* %x, i64 8
  1009. %b = getelementptr inbounds i8, i8 addrspace(1)* %x, i64 8
  1010. %c = icmp ugt i8 addrspace(1)* %a, %b
  1011. ret i1 %c
  1012. }
  1013. ; CHECK-LABEL: @icmp_shl_1_V_ult_32(
  1014. ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ult i32 %V, 5
  1015. ; CHECK-NEXT: ret i1 [[CMP]]
  1016. define i1 @icmp_shl_1_V_ult_32(i32 %V) {
  1017. %shl = shl i32 1, %V
  1018. %cmp = icmp ult i32 %shl, 32
  1019. ret i1 %cmp
  1020. }
  1021. ; CHECK-LABEL: @icmp_shl_1_V_eq_32(
  1022. ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp eq i32 %V, 5
  1023. ; CHECK-NEXT: ret i1 [[CMP]]
  1024. define i1 @icmp_shl_1_V_eq_32(i32 %V) {
  1025. %shl = shl i32 1, %V
  1026. %cmp = icmp eq i32 %shl, 32
  1027. ret i1 %cmp
  1028. }
  1029. ; CHECK-LABEL: @icmp_shl_1_V_ult_30(
  1030. ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ult i32 %V, 5
  1031. ; CHECK-NEXT: ret i1 [[CMP]]
  1032. define i1 @icmp_shl_1_V_ult_30(i32 %V) {
  1033. %shl = shl i32 1, %V
  1034. %cmp = icmp ult i32 %shl, 30
  1035. ret i1 %cmp
  1036. }
  1037. ; CHECK-LABEL: @icmp_shl_1_V_ugt_30(
  1038. ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ugt i32 %V, 4
  1039. ; CHECK-NEXT: ret i1 [[CMP]]
  1040. define i1 @icmp_shl_1_V_ugt_30(i32 %V) {
  1041. %shl = shl i32 1, %V
  1042. %cmp = icmp ugt i32 %shl, 30
  1043. ret i1 %cmp
  1044. }
  1045. ; CHECK-LABEL: @icmp_shl_1_V_ule_30(
  1046. ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ult i32 %V, 5
  1047. ; CHECK-NEXT: ret i1 [[CMP]]
  1048. define i1 @icmp_shl_1_V_ule_30(i32 %V) {
  1049. %shl = shl i32 1, %V
  1050. %cmp = icmp ule i32 %shl, 30
  1051. ret i1 %cmp
  1052. }
  1053. ; CHECK-LABEL: @icmp_shl_1_V_uge_30(
  1054. ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ugt i32 %V, 4
  1055. ; CHECK-NEXT: ret i1 [[CMP]]
  1056. define i1 @icmp_shl_1_V_uge_30(i32 %V) {
  1057. %shl = shl i32 1, %V
  1058. %cmp = icmp uge i32 %shl, 30
  1059. ret i1 %cmp
  1060. }
  1061. ; CHECK-LABEL: @icmp_shl_1_V_uge_2147483648(
  1062. ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp eq i32 %V, 31
  1063. ; CHECK-NEXT: ret i1 [[CMP]]
  1064. define i1 @icmp_shl_1_V_uge_2147483648(i32 %V) {
  1065. %shl = shl i32 1, %V
  1066. %cmp = icmp uge i32 %shl, 2147483648
  1067. ret i1 %cmp
  1068. }
  1069. ; CHECK-LABEL: @icmp_shl_1_V_ult_2147483648(
  1070. ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 %V, 31
  1071. ; CHECK-NEXT: ret i1 [[CMP]]
  1072. define i1 @icmp_shl_1_V_ult_2147483648(i32 %V) {
  1073. %shl = shl i32 1, %V
  1074. %cmp = icmp ult i32 %shl, 2147483648
  1075. ret i1 %cmp
  1076. }
  1077. ; CHECK-LABEL: @or_icmp_eq_B_0_icmp_ult_A_B(
  1078. ; CHECK-NEXT: [[SUB:%[a-z0-9]+]] = add i64 %b, -1
  1079. ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp uge i64 [[SUB]], %a
  1080. ; CHECK-NEXT: ret i1 [[CMP]]
  1081. define i1 @or_icmp_eq_B_0_icmp_ult_A_B(i64 %a, i64 %b) {
  1082. %1 = icmp eq i64 %b, 0
  1083. %2 = icmp ult i64 %a, %b
  1084. %3 = or i1 %1, %2
  1085. ret i1 %3
  1086. }
  1087. ; CHECK-LABEL: @icmp_add_ult_2(
  1088. ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %X, -2
  1089. ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp eq i32 [[AND]], 14
  1090. ; CHECK-NEXT: ret i1 [[CMP]]
  1091. define i1 @icmp_add_ult_2(i32 %X) {
  1092. %add = add i32 %X, -14
  1093. %cmp = icmp ult i32 %add, 2
  1094. ret i1 %cmp
  1095. }
  1096. ; CHECK: @icmp_add_X_-14_ult_2
  1097. ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %X, -2
  1098. ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp eq i32 [[AND]], 14
  1099. ; CHECK-NEXT: ret i1 [[CMP]]
  1100. define i1 @icmp_add_X_-14_ult_2(i32 %X) {
  1101. %add = add i32 %X, -14
  1102. %cmp = icmp ult i32 %add, 2
  1103. ret i1 %cmp
  1104. }
  1105. ; CHECK-LABEL: @icmp_sub_3_X_ult_2(
  1106. ; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 %X, 1
  1107. ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp eq i32 [[OR]], 3
  1108. ; CHECK-NEXT: ret i1 [[CMP]]
  1109. define i1 @icmp_sub_3_X_ult_2(i32 %X) {
  1110. %add = sub i32 3, %X
  1111. %cmp = icmp ult i32 %add, 2
  1112. ret i1 %cmp
  1113. }
  1114. ; CHECK: @icmp_add_X_-14_uge_2
  1115. ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %X, -2
  1116. ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 [[AND]], 14
  1117. ; CHECK-NEXT: ret i1 [[CMP]]
  1118. define i1 @icmp_add_X_-14_uge_2(i32 %X) {
  1119. %add = add i32 %X, -14
  1120. %cmp = icmp uge i32 %add, 2
  1121. ret i1 %cmp
  1122. }
  1123. ; CHECK-LABEL: @icmp_sub_3_X_uge_2(
  1124. ; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 %X, 1
  1125. ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 [[OR]], 3
  1126. ; CHECK-NEXT: ret i1 [[CMP]]
  1127. define i1 @icmp_sub_3_X_uge_2(i32 %X) {
  1128. %add = sub i32 3, %X
  1129. %cmp = icmp uge i32 %add, 2
  1130. ret i1 %cmp
  1131. }
  1132. ; CHECK: @icmp_and_X_-16_eq-16
  1133. ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ugt i32 %X, -17
  1134. ; CHECK-NEXT: ret i1 [[CMP]]
  1135. define i1 @icmp_and_X_-16_eq-16(i32 %X) {
  1136. %and = and i32 %X, -16
  1137. %cmp = icmp eq i32 %and, -16
  1138. ret i1 %cmp
  1139. }
  1140. ; CHECK: @icmp_and_X_-16_ne-16
  1141. ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ult i32 %X, -16
  1142. ; CHECK-NEXT: ret i1 [[CMP]]
  1143. define i1 @icmp_and_X_-16_ne-16(i32 %X) {
  1144. %and = and i32 %X, -16
  1145. %cmp = icmp ne i32 %and, -16
  1146. ret i1 %cmp
  1147. }
  1148. ; CHECK: @icmp_sub_-1_X_ult_4
  1149. ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ugt i32 %X, -5
  1150. ; CHECK-NEXT: ret i1 [[CMP]]
  1151. define i1 @icmp_sub_-1_X_ult_4(i32 %X) {
  1152. %sub = sub i32 -1, %X
  1153. %cmp = icmp ult i32 %sub, 4
  1154. ret i1 %cmp
  1155. }
  1156. ; CHECK: @icmp_sub_-1_X_uge_4
  1157. ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ult i32 %X, -4
  1158. ; CHECK-NEXT: ret i1 [[CMP]]
  1159. define i1 @icmp_sub_-1_X_uge_4(i32 %X) {
  1160. %sub = sub i32 -1, %X
  1161. %cmp = icmp uge i32 %sub, 4
  1162. ret i1 %cmp
  1163. }
  1164. ; CHECK-LABEL: @icmp_swap_operands_for_cse
  1165. ; CHECK: [[CMP:%[a-z0-9]+]] = icmp ult i32 %X, %Y
  1166. ; CHECK-NEXT: br i1 [[CMP]], label %true, label %false
  1167. ; CHECK: ret i1
  1168. define i1 @icmp_swap_operands_for_cse(i32 %X, i32 %Y) {
  1169. entry:
  1170. %sub = sub i32 %X, %Y
  1171. %cmp = icmp ugt i32 %Y, %X
  1172. br i1 %cmp, label %true, label %false
  1173. true:
  1174. %restrue = trunc i32 %sub to i1
  1175. br label %end
  1176. false:
  1177. %shift = lshr i32 %sub, 4
  1178. %resfalse = trunc i32 %shift to i1
  1179. br label %end
  1180. end:
  1181. %res = phi i1 [%restrue, %true], [%resfalse, %false]
  1182. ret i1 %res
  1183. }
  1184. ; CHECK-LABEL: @icmp_swap_operands_for_cse2
  1185. ; CHECK: [[CMP:%[a-z0-9]+]] = icmp ult i32 %X, %Y
  1186. ; CHECK-NEXT: br i1 [[CMP]], label %true, label %false
  1187. ; CHECK: ret i1
  1188. define i1 @icmp_swap_operands_for_cse2(i32 %X, i32 %Y) {
  1189. entry:
  1190. %cmp = icmp ugt i32 %Y, %X
  1191. br i1 %cmp, label %true, label %false
  1192. true:
  1193. %sub = sub i32 %X, %Y
  1194. %sub1 = sub i32 %X, %Y
  1195. %add = add i32 %sub, %sub1
  1196. %restrue = trunc i32 %add to i1
  1197. br label %end
  1198. false:
  1199. %sub2 = sub i32 %Y, %X
  1200. %resfalse = trunc i32 %sub2 to i1
  1201. br label %end
  1202. end:
  1203. %res = phi i1 [%restrue, %true], [%resfalse, %false]
  1204. ret i1 %res
  1205. }
  1206. ; CHECK-LABEL: @icmp_do_not_swap_operands_for_cse
  1207. ; CHECK: [[CMP:%[a-z0-9]+]] = icmp ugt i32 %Y, %X
  1208. ; CHECK-NEXT: br i1 [[CMP]], label %true, label %false
  1209. ; CHECK: ret i1
  1210. define i1 @icmp_do_not_swap_operands_for_cse(i32 %X, i32 %Y) {
  1211. entry:
  1212. %cmp = icmp ugt i32 %Y, %X
  1213. br i1 %cmp, label %true, label %false
  1214. true:
  1215. %sub = sub i32 %X, %Y
  1216. %restrue = trunc i32 %sub to i1
  1217. br label %end
  1218. false:
  1219. %sub2 = sub i32 %Y, %X
  1220. %resfalse = trunc i32 %sub2 to i1
  1221. br label %end
  1222. end:
  1223. %res = phi i1 [%restrue, %true], [%resfalse, %false]
  1224. ret i1 %res
  1225. }
  1226. ; CHECK-LABEL: @icmp_lshr_lshr_eq
  1227. ; CHECK: %z.unshifted = xor i32 %a, %b
  1228. ; CHECK: %z = icmp ult i32 %z.unshifted, 1073741824
  1229. define i1 @icmp_lshr_lshr_eq(i32 %a, i32 %b) nounwind {
  1230. %x = lshr i32 %a, 30
  1231. %y = lshr i32 %b, 30
  1232. %z = icmp eq i32 %x, %y
  1233. ret i1 %z
  1234. }
  1235. ; CHECK-LABEL: @icmp_ashr_ashr_ne
  1236. ; CHECK: %z.unshifted = xor i32 %a, %b
  1237. ; CHECK: %z = icmp ugt i32 %z.unshifted, 255
  1238. define i1 @icmp_ashr_ashr_ne(i32 %a, i32 %b) nounwind {
  1239. %x = ashr i32 %a, 8
  1240. %y = ashr i32 %b, 8
  1241. %z = icmp ne i32 %x, %y
  1242. ret i1 %z
  1243. }
  1244. ; CHECK-LABEL: @icmp_neg_cst_slt
  1245. ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %a, 10
  1246. ; CHECK-NEXT: ret i1 [[CMP]]
  1247. define i1 @icmp_neg_cst_slt(i32 %a) {
  1248. %1 = sub nsw i32 0, %a
  1249. %2 = icmp slt i32 %1, -10
  1250. ret i1 %2
  1251. }
  1252. ; CHECK-LABEL: @icmp_and_or_lshr
  1253. ; CHECK-NEXT: [[SHL:%[a-z0-9]+]] = shl nuw i32 1, %y
  1254. ; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 [[SHL]], 1
  1255. ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 [[OR]], %x
  1256. ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 [[AND]], 0
  1257. ; CHECK-NEXT: ret i1 [[CMP]]
  1258. define i1 @icmp_and_or_lshr(i32 %x, i32 %y) {
  1259. %shf = lshr i32 %x, %y
  1260. %or = or i32 %shf, %x
  1261. %and = and i32 %or, 1
  1262. %ret = icmp ne i32 %and, 0
  1263. ret i1 %ret
  1264. }
  1265. ; CHECK-LABEL: @icmp_and_or_lshr_cst
  1266. ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %x, 3
  1267. ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 [[AND]], 0
  1268. ; CHECK-NEXT: ret i1 [[CMP]]
  1269. define i1 @icmp_and_or_lshr_cst(i32 %x) {
  1270. %shf = lshr i32 %x, 1
  1271. %or = or i32 %shf, %x
  1272. %and = and i32 %or, 1
  1273. %ret = icmp ne i32 %and, 0
  1274. ret i1 %ret
  1275. }
  1276. ; CHECK-LABEL: @shl_ap1_zero_ap2_non_zero_2
  1277. ; CHECK-NEXT: %cmp = icmp ugt i32 %a, 29
  1278. ; CHECK-NEXT: ret i1 %cmp
  1279. define i1 @shl_ap1_zero_ap2_non_zero_2(i32 %a) {
  1280. %shl = shl i32 4, %a
  1281. %cmp = icmp eq i32 %shl, 0
  1282. ret i1 %cmp
  1283. }
  1284. ; CHECK-LABEL: @shl_ap1_zero_ap2_non_zero_4
  1285. ; CHECK-NEXT: %cmp = icmp ugt i32 %a, 30
  1286. ; CHECK-NEXT: ret i1 %cmp
  1287. define i1 @shl_ap1_zero_ap2_non_zero_4(i32 %a) {
  1288. %shl = shl i32 -2, %a
  1289. %cmp = icmp eq i32 %shl, 0
  1290. ret i1 %cmp
  1291. }
  1292. ; CHECK-LABEL: @shl_ap1_non_zero_ap2_non_zero_both_positive
  1293. ; CHECK-NEXT: %cmp = icmp eq i32 %a, 0
  1294. ; CHECK-NEXT: ret i1 %cmp
  1295. define i1 @shl_ap1_non_zero_ap2_non_zero_both_positive(i32 %a) {
  1296. %shl = shl i32 50, %a
  1297. %cmp = icmp eq i32 %shl, 50
  1298. ret i1 %cmp
  1299. }
  1300. ; CHECK-LABEL: @shl_ap1_non_zero_ap2_non_zero_both_negative
  1301. ; CHECK-NEXT: %cmp = icmp eq i32 %a, 0
  1302. ; CHECK-NEXT: ret i1 %cmp
  1303. define i1 @shl_ap1_non_zero_ap2_non_zero_both_negative(i32 %a) {
  1304. %shl = shl i32 -50, %a
  1305. %cmp = icmp eq i32 %shl, -50
  1306. ret i1 %cmp
  1307. }
  1308. ; CHECK-LABEL: @shl_ap1_non_zero_ap2_non_zero_ap1_1
  1309. ; CHECK-NEXT: ret i1 false
  1310. define i1 @shl_ap1_non_zero_ap2_non_zero_ap1_1(i32 %a) {
  1311. %shl = shl i32 50, %a
  1312. %cmp = icmp eq i32 %shl, 25
  1313. ret i1 %cmp
  1314. }
  1315. ; CHECK-LABEL: @shl_ap1_non_zero_ap2_non_zero_ap1_2
  1316. ; CHECK-NEXT: %cmp = icmp eq i32 %a, 1
  1317. ; CHECK-NEXT: ret i1 %cmp
  1318. define i1 @shl_ap1_non_zero_ap2_non_zero_ap1_2(i32 %a) {
  1319. %shl = shl i32 25, %a
  1320. %cmp = icmp eq i32 %shl, 50
  1321. ret i1 %cmp
  1322. }
  1323. ; CHECK-LABEL: @shl_ap1_non_zero_ap2_non_zero_ap1_3
  1324. ; CHECK-NEXT: ret i1 false
  1325. define i1 @shl_ap1_non_zero_ap2_non_zero_ap1_3(i32 %a) {
  1326. %shl = shl i32 26, %a
  1327. %cmp = icmp eq i32 %shl, 50
  1328. ret i1 %cmp
  1329. }
  1330. ; CHECK-LABEL: @icmp_sgt_zero_add_nsw
  1331. ; CHECK-NEXT: icmp sgt i32 %a, -1
  1332. define i1 @icmp_sgt_zero_add_nsw(i32 %a) {
  1333. %add = add nsw i32 %a, 1
  1334. %cmp = icmp sgt i32 %add, 0
  1335. ret i1 %cmp
  1336. }
  1337. ; CHECK-LABEL: @icmp_sge_zero_add_nsw
  1338. ; CHECK-NEXT: icmp sgt i32 %a, -2
  1339. define i1 @icmp_sge_zero_add_nsw(i32 %a) {
  1340. %add = add nsw i32 %a, 1
  1341. %cmp = icmp sge i32 %add, 0
  1342. ret i1 %cmp
  1343. }
  1344. ; CHECK-LABEL: @icmp_slt_zero_add_nsw
  1345. ; CHECK-NEXT: icmp slt i32 %a, -1
  1346. define i1 @icmp_slt_zero_add_nsw(i32 %a) {
  1347. %add = add nsw i32 %a, 1
  1348. %cmp = icmp slt i32 %add, 0
  1349. ret i1 %cmp
  1350. }
  1351. ; CHECK-LABEL: @icmp_sle_zero_add_nsw
  1352. ; CHECK-NEXT: icmp slt i32 %a, 0
  1353. define i1 @icmp_sle_zero_add_nsw(i32 %a) {
  1354. %add = add nsw i32 %a, 1
  1355. %cmp = icmp sle i32 %add, 0
  1356. ret i1 %cmp
  1357. }
  1358. ; CHECK-LABEL: @icmp_cmpxchg_strong
  1359. ; CHECK-NEXT: %[[xchg:.*]] = cmpxchg i32* %sc, i32 %old_val, i32 %new_val seq_cst seq_cst
  1360. ; CHECK-NEXT: %[[icmp:.*]] = extractvalue { i32, i1 } %[[xchg]], 1
  1361. ; CHECK-NEXT: ret i1 %[[icmp]]
  1362. define zeroext i1 @icmp_cmpxchg_strong(i32* %sc, i32 %old_val, i32 %new_val) {
  1363. %xchg = cmpxchg i32* %sc, i32 %old_val, i32 %new_val seq_cst seq_cst
  1364. %xtrc = extractvalue { i32, i1 } %xchg, 0
  1365. %icmp = icmp eq i32 %xtrc, %old_val
  1366. ret i1 %icmp
  1367. }
  1368. ; CHECK-LABEL: @f1
  1369. ; CHECK-NEXT: %[[cmp:.*]] = icmp sge i64 %a, %b
  1370. ; CHECK-NEXT: ret i1 %[[cmp]]
  1371. define i1 @f1(i64 %a, i64 %b) {
  1372. %t = sub nsw i64 %a, %b
  1373. %v = icmp sge i64 %t, 0
  1374. ret i1 %v
  1375. }
  1376. ; CHECK-LABEL: @f2
  1377. ; CHECK-NEXT: %[[cmp:.*]] = icmp sgt i64 %a, %b
  1378. ; CHECK-NEXT: ret i1 %[[cmp]]
  1379. define i1 @f2(i64 %a, i64 %b) {
  1380. %t = sub nsw i64 %a, %b
  1381. %v = icmp sgt i64 %t, 0
  1382. ret i1 %v
  1383. }
  1384. ; CHECK-LABEL: @f3
  1385. ; CHECK-NEXT: %[[cmp:.*]] = icmp slt i64 %a, %b
  1386. ; CHECK-NEXT: ret i1 %[[cmp]]
  1387. define i1 @f3(i64 %a, i64 %b) {
  1388. %t = sub nsw i64 %a, %b
  1389. %v = icmp slt i64 %t, 0
  1390. ret i1 %v
  1391. }
  1392. ; CHECK-LABEL: @f4
  1393. ; CHECK-NEXT: %[[cmp:.*]] = icmp sle i64 %a, %b
  1394. ; CHECK-NEXT: ret i1 %[[cmp]]
  1395. define i1 @f4(i64 %a, i64 %b) {
  1396. %t = sub nsw i64 %a, %b
  1397. %v = icmp sle i64 %t, 0
  1398. ret i1 %v
  1399. }
  1400. ; CHECK-LABEL: @f5
  1401. ; CHECK: %[[cmp:.*]] = icmp slt i32 %[[sub:.*]], 0
  1402. ; CHECK: %[[neg:.*]] = sub nsw i32 0, %[[sub]]
  1403. ; CHECK: %[[sel:.*]] = select i1 %[[cmp]], i32 %[[neg]], i32 %[[sub]]
  1404. ; CHECK: ret i32 %[[sel]]
  1405. define i32 @f5(i8 %a, i8 %b) {
  1406. %conv = zext i8 %a to i32
  1407. %conv3 = zext i8 %b to i32
  1408. %sub = sub nsw i32 %conv, %conv3
  1409. %cmp4 = icmp slt i32 %sub, 0
  1410. %sub7 = sub nsw i32 0, %sub
  1411. %sub7.sub = select i1 %cmp4, i32 %sub7, i32 %sub
  1412. ret i32 %sub7.sub
  1413. }
  1414. ; CHECK-LABEL: @f6
  1415. ; CHECK: %cmp.unshifted = xor i32 %a, %b
  1416. ; CHECK-NEXT: %cmp.mask = and i32 %cmp.unshifted, 255
  1417. ; CHECK-NEXT: %cmp = icmp eq i32 %cmp.mask, 0
  1418. ; CHECK-NEXT: %s = select i1 %cmp, i32 10000, i32 0
  1419. ; CHECK-NEXT: ret i32 %s
  1420. define i32 @f6(i32 %a, i32 %b) {
  1421. %sext = shl i32 %a, 24
  1422. %conv = ashr i32 %sext, 24
  1423. %sext6 = shl i32 %b, 24
  1424. %conv4 = ashr i32 %sext6, 24
  1425. %cmp = icmp eq i32 %conv, %conv4
  1426. %s = select i1 %cmp, i32 10000, i32 0
  1427. ret i32 %s
  1428. }
  1429. ; CHECK-LABEL: @f7
  1430. ; CHECK: %cmp.unshifted = xor i32 %a, %b
  1431. ; CHECK-NEXT: %cmp.mask = and i32 %cmp.unshifted, 511
  1432. ; CHECK-NEXT: %cmp = icmp ne i32 %cmp.mask, 0
  1433. ; CHECK-NEXT: %s = select i1 %cmp, i32 10000, i32 0
  1434. ; CHECK-NEXT: ret i32 %s
  1435. define i32 @f7(i32 %a, i32 %b) {
  1436. %sext = shl i32 %a, 23
  1437. %sext6 = shl i32 %b, 23
  1438. %cmp = icmp ne i32 %sext, %sext6
  1439. %s = select i1 %cmp, i32 10000, i32 0
  1440. ret i32 %s
  1441. }