2
0

add2.ll 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  1. ; RUN: opt < %s -instcombine -S | FileCheck %s
  2. define i64 @test1(i64 %A, i32 %B) {
  3. %tmp12 = zext i32 %B to i64
  4. %tmp3 = shl i64 %tmp12, 32
  5. %tmp5 = add i64 %tmp3, %A
  6. %tmp6 = and i64 %tmp5, 123
  7. ret i64 %tmp6
  8. ; CHECK-LABEL: @test1(
  9. ; CHECK-NEXT: and i64 %A, 123
  10. ; CHECK-NEXT: ret i64
  11. }
  12. define i32 @test2(i32 %A) {
  13. %B = and i32 %A, 7
  14. %C = and i32 %A, 32
  15. %F = add i32 %B, %C
  16. ret i32 %F
  17. ; CHECK-LABEL: @test2(
  18. ; CHECK-NEXT: and i32 %A, 39
  19. ; CHECK-NEXT: ret i32
  20. }
  21. define i32 @test3(i32 %A) {
  22. %B = and i32 %A, 128
  23. %C = lshr i32 %A, 30
  24. %F = add i32 %B, %C
  25. ret i32 %F
  26. ; CHECK-LABEL: @test3(
  27. ; CHECK-NEXT: and
  28. ; CHECK-NEXT: lshr
  29. ; CHECK-NEXT: or i32 %B, %C
  30. ; CHECK-NEXT: ret i32
  31. }
  32. define i32 @test4(i32 %A) {
  33. %B = add nuw i32 %A, %A
  34. ret i32 %B
  35. ; CHECK-LABEL: @test4(
  36. ; CHECK-NEXT: %B = shl nuw i32 %A, 1
  37. ; CHECK-NEXT: ret i32 %B
  38. }
  39. define <2 x i1> @test5(<2 x i1> %A, <2 x i1> %B) {
  40. %add = add <2 x i1> %A, %B
  41. ret <2 x i1> %add
  42. ; CHECK-LABEL: @test5(
  43. ; CHECK-NEXT: %add = xor <2 x i1> %A, %B
  44. ; CHECK-NEXT: ret <2 x i1> %add
  45. }
  46. define <2 x i64> @test6(<2 x i64> %A) {
  47. %shl = shl <2 x i64> %A, <i64 2, i64 3>
  48. %add = add <2 x i64> %shl, %A
  49. ret <2 x i64> %add
  50. ; CHECK-LABEL: @test6(
  51. ; CHECK-NEXT: %add = mul <2 x i64> %A, <i64 5, i64 9>
  52. ; CHECK-NEXT: ret <2 x i64> %add
  53. }
  54. define <2 x i64> @test7(<2 x i64> %A) {
  55. %shl = shl <2 x i64> %A, <i64 2, i64 3>
  56. %mul = mul <2 x i64> %A, <i64 3, i64 4>
  57. %add = add <2 x i64> %shl, %mul
  58. ret <2 x i64> %add
  59. ; CHECK-LABEL: @test7(
  60. ; CHECK-NEXT: %add = mul <2 x i64> %A, <i64 7, i64 12>
  61. ; CHECK-NEXT: ret <2 x i64> %add
  62. }
  63. define <2 x i64> @test8(<2 x i64> %A) {
  64. %xor = xor <2 x i64> %A, <i64 -1, i64 -1>
  65. %add = add <2 x i64> %xor, <i64 2, i64 3>
  66. ret <2 x i64> %add
  67. ; CHECK-LABEL: @test8(
  68. ; CHECK-NEXT: %add = sub <2 x i64> <i64 1, i64 2>, %A
  69. ; CHECK-NEXT: ret <2 x i64> %add
  70. }
  71. define i16 @test9(i16 %a) {
  72. %b = mul i16 %a, 2
  73. %c = mul i16 %a, 32767
  74. %d = add i16 %b, %c
  75. ret i16 %d
  76. ; CHECK-LABEL: @test9(
  77. ; CHECK-NEXT: %d = mul i16 %a, -32767
  78. ; CHECK-NEXT: ret i16 %d
  79. }
  80. ; y + (~((x >> 3) & 0x55555555) + 1) -> y - ((x >> 3) & 0x55555555)
  81. define i32 @test10(i32 %x, i32 %y) {
  82. %shr = ashr i32 %x, 3
  83. %shr.not = or i32 %shr, -1431655766
  84. %neg = xor i32 %shr.not, 1431655765
  85. %add = add i32 %y, 1
  86. %add1 = add i32 %add, %neg
  87. ret i32 %add1
  88. ; CHECK-LABEL: @test10(
  89. ; CHECK-NEXT: [[SHR:%[a-z0-9]+]] = ashr i32 %x, 3
  90. ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 [[SHR]], 1431655765
  91. ; CHECK-NEXT: [[SUB:%[a-z0-9]+]] = sub i32 %y, [[AND]]
  92. ; CHECK-NEXT: ret i32 [[SUB]]
  93. }
  94. ; y + (~(x & 0x55555555) + 1) -> y - (x & 0x55555555)
  95. define i32 @test11(i32 %x, i32 %y) {
  96. %x.not = or i32 %x, -1431655766
  97. %neg = xor i32 %x.not, 1431655765
  98. %add = add i32 %y, 1
  99. %add1 = add i32 %add, %neg
  100. ret i32 %add1
  101. ; CHECK-LABEL: @test11(
  102. ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %x, 1431655765
  103. ; CHECK-NEXT: [[SUB:%[a-z0-9]+]] = sub i32 %y, [[AND]]
  104. ; CHECK-NEXT: ret i32 [[SUB]]
  105. }
  106. ; (y + 1) + ~(x & 0x55555555) -> y - (x & 0x55555555)
  107. define i32 @test12(i32 %x, i32 %y) {
  108. %add = add nsw i32 %y, 1
  109. %x.not = or i32 %x, -1431655766
  110. %neg = xor i32 %x.not, 1431655765
  111. %add1 = add nsw i32 %add, %neg
  112. ret i32 %add1
  113. ; CHECK-LABEL: @test12(
  114. ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %x, 1431655765
  115. ; CHECK-NEXT: [[SUB:%[a-z0-9]+]] = sub i32 %y, [[AND]]
  116. ; CHECK-NEXT: ret i32 [[SUB]]
  117. }
  118. ; y + (~(x & 0x55555556) + 1) -> y - (x & 0x55555556)
  119. define i32 @test13(i32 %x, i32 %y) {
  120. %x.not = or i32 %x, -1431655767
  121. %neg = xor i32 %x.not, 1431655766
  122. %add = add i32 %y, 1
  123. %add1 = add i32 %add, %neg
  124. ret i32 %add1
  125. ; CHECK-LABEL: @test13(
  126. ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %x, 1431655766
  127. ; CHECK-NEXT: [[SUB:%[a-z0-9]+]] = sub i32 %y, [[AND]]
  128. ; CHECK-NEXT: ret i32 [[SUB]]
  129. }
  130. ; (y + 1) + ~(x & 0x55555556) -> y - (x & 0x55555556)
  131. define i32 @test14(i32 %x, i32 %y) {
  132. %add = add nsw i32 %y, 1
  133. %x.not = or i32 %x, -1431655767
  134. %neg = xor i32 %x.not, 1431655766
  135. %add1 = add nsw i32 %add, %neg
  136. ret i32 %add1
  137. ; CHECK-LABEL: @test14(
  138. ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %x, 1431655766
  139. ; CHECK-NEXT: [[SUB:%[a-z0-9]+]] = sub i32 %y, [[AND]]
  140. ; CHECK-NEXT: ret i32 [[SUB]]
  141. }
  142. ; y + (~(x | 0x55555556) + 1) -> y - (x | 0x55555556)
  143. define i32 @test15(i32 %x, i32 %y) {
  144. %x.not = and i32 %x, -1431655767
  145. %neg = xor i32 %x.not, -1431655767
  146. %add = add i32 %y, 1
  147. %add1 = add i32 %add, %neg
  148. ret i32 %add1
  149. ; CHECK-LABEL: @test15(
  150. ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = or i32 %x, 1431655766
  151. ; CHECK-NEXT: [[SUB:%[a-z0-9]+]] = sub i32 %y, [[AND]]
  152. ; CHECK-NEXT: ret i32 [[SUB]]
  153. }
  154. ; (y + 1) + ~(x | 0x55555556) -> y - (x | 0x555555556)
  155. define i32 @test16(i32 %x, i32 %y) {
  156. %add = add nsw i32 %y, 1
  157. %x.not = and i32 %x, -1431655767
  158. %neg = xor i32 %x.not, -1431655767
  159. %add1 = add nsw i32 %add, %neg
  160. ret i32 %add1
  161. ; CHECK-LABEL: @test16(
  162. ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = or i32 %x, 1431655766
  163. ; CHECK-NEXT: [[SUB:%[a-z0-9]+]] = sub i32 %y, [[AND]]
  164. ; CHECK-NEXT: ret i32 [[SUB]]
  165. }
  166. ; y + (~(x | 0x55555555) + 1) -> y - (x | 0x55555555)
  167. define i32 @test17(i32 %x, i32 %y) {
  168. %x.not = and i32 %x, -1431655766
  169. %add2 = xor i32 %x.not, -1431655765
  170. %add1 = add nsw i32 %add2, %y
  171. ret i32 %add1
  172. ; CHECK-LABEL: @test17(
  173. ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = or i32 %x, 1431655765
  174. ; CHECK-NEXT: [[SUB:%[a-z0-9]+]] = sub i32 %y, [[AND]]
  175. ; CHECK-NEXT: ret i32 [[SUB]]
  176. }
  177. ; (y + 1) + ~(x | 0x55555555) -> y - (x | 0x55555555)
  178. define i32 @test18(i32 %x, i32 %y) {
  179. %add = add nsw i32 %y, 1
  180. %x.not = and i32 %x, -1431655766
  181. %neg = xor i32 %x.not, -1431655766
  182. %add1 = add nsw i32 %add, %neg
  183. ret i32 %add1
  184. ; CHECK-LABEL: @test18(
  185. ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = or i32 %x, 1431655765
  186. ; CHECK-NEXT: [[SUB:%[a-z0-9]+]] = sub i32 %y, [[AND]]
  187. ; CHECK-NEXT: ret i32 [[SUB]]
  188. }
  189. define i16 @add_nsw_mul_nsw(i16 %x) {
  190. %add1 = add nsw i16 %x, %x
  191. %add2 = add nsw i16 %add1, %x
  192. ret i16 %add2
  193. ; CHECK-LABEL: @add_nsw_mul_nsw(
  194. ; CHECK-NEXT: %add2 = mul nsw i16 %x, 3
  195. ; CHECK-NEXT: ret i16 %add2
  196. }
  197. define i16 @mul_add_to_mul_1(i16 %x) {
  198. %mul1 = mul nsw i16 %x, 8
  199. %add2 = add nsw i16 %x, %mul1
  200. ret i16 %add2
  201. ; CHECK-LABEL: @mul_add_to_mul_1(
  202. ; CHECK-NEXT: %add2 = mul nsw i16 %x, 9
  203. ; CHECK-NEXT: ret i16 %add2
  204. }
  205. define i16 @mul_add_to_mul_2(i16 %x) {
  206. %mul1 = mul nsw i16 %x, 8
  207. %add2 = add nsw i16 %mul1, %x
  208. ret i16 %add2
  209. ; CHECK-LABEL: @mul_add_to_mul_2(
  210. ; CHECK-NEXT: %add2 = mul nsw i16 %x, 9
  211. ; CHECK-NEXT: ret i16 %add2
  212. }
  213. define i16 @mul_add_to_mul_3(i16 %a) {
  214. %mul1 = mul i16 %a, 2
  215. %mul2 = mul i16 %a, 3
  216. %add = add nsw i16 %mul1, %mul2
  217. ret i16 %add
  218. ; CHECK-LABEL: @mul_add_to_mul_3(
  219. ; CHECK-NEXT: %add = mul i16 %a, 5
  220. ; CHECK-NEXT: ret i16 %add
  221. }
  222. define i16 @mul_add_to_mul_4(i16 %a) {
  223. %mul1 = mul nsw i16 %a, 2
  224. %mul2 = mul nsw i16 %a, 7
  225. %add = add nsw i16 %mul1, %mul2
  226. ret i16 %add
  227. ; CHECK-LABEL: @mul_add_to_mul_4(
  228. ; CHECK-NEXT: %add = mul nsw i16 %a, 9
  229. ; CHECK-NEXT: ret i16 %add
  230. }
  231. define i16 @mul_add_to_mul_5(i16 %a) {
  232. %mul1 = mul nsw i16 %a, 3
  233. %mul2 = mul nsw i16 %a, 7
  234. %add = add nsw i16 %mul1, %mul2
  235. ret i16 %add
  236. ; CHECK-LABEL: @mul_add_to_mul_5(
  237. ; CHECK-NEXT: %add = mul nsw i16 %a, 10
  238. ; CHECK-NEXT: ret i16 %add
  239. }
  240. define i32 @mul_add_to_mul_6(i32 %x, i32 %y) {
  241. %mul1 = mul nsw i32 %x, %y
  242. %mul2 = mul nsw i32 %mul1, 5
  243. %add = add nsw i32 %mul1, %mul2
  244. ret i32 %add
  245. ; CHECK-LABEL: @mul_add_to_mul_6(
  246. ; CHECK-NEXT: %mul1 = mul nsw i32 %x, %y
  247. ; CHECK-NEXT: %add = mul nsw i32 %mul1, 6
  248. ; CHECK-NEXT: ret i32 %add
  249. }
  250. define i16 @mul_add_to_mul_7(i16 %x) {
  251. %mul1 = mul nsw i16 %x, 32767
  252. %add2 = add nsw i16 %x, %mul1
  253. ret i16 %add2
  254. ; CHECK-LABEL: @mul_add_to_mul_7(
  255. ; CHECK-NEXT: %add2 = shl i16 %x, 15
  256. ; CHECK-NEXT: ret i16 %add2
  257. }
  258. define i16 @mul_add_to_mul_8(i16 %a) {
  259. %mul1 = mul nsw i16 %a, 16383
  260. %mul2 = mul nsw i16 %a, 16384
  261. %add = add nsw i16 %mul1, %mul2
  262. ret i16 %add
  263. ; CHECK-LABEL: @mul_add_to_mul_8(
  264. ; CHECK-NEXT: %add = mul nsw i16 %a, 32767
  265. ; CHECK-NEXT: ret i16 %add
  266. }
  267. define i16 @mul_add_to_mul_9(i16 %a) {
  268. %mul1 = mul nsw i16 %a, 16384
  269. %mul2 = mul nsw i16 %a, 16384
  270. %add = add nsw i16 %mul1, %mul2
  271. ret i16 %add
  272. ; CHECK-LABEL: @mul_add_to_mul_9(
  273. ; CHECK-NEXT: %add = shl i16 %a, 15
  274. ; CHECK-NEXT: ret i16 %add
  275. }
  276. ; This test and the next test verify that when a range metadata is attached to
  277. ; llvm.cttz, ValueTracking correctly intersects the range specified by the
  278. ; metadata and the range implied by the intrinsic.
  279. ;
  280. ; In this test, the range specified by the metadata is more strict. Therefore,
  281. ; ValueTracking uses that range.
  282. define i16 @add_cttz(i16 %a) {
  283. ; CHECK-LABEL: @add_cttz(
  284. ; llvm.cttz.i16(..., /*is_zero_undefined=*/true) implies the value returned
  285. ; is in [0, 16). The range metadata indicates the value returned is in [0, 8).
  286. ; Intersecting these ranges, we know the value returned is in [0, 8).
  287. ; Therefore, InstCombine will transform
  288. ; add %cttz, 1111 1111 1111 1000 ; decimal -8
  289. ; to
  290. ; or %cttz, 1111 1111 1111 1000
  291. %cttz = call i16 @llvm.cttz.i16(i16 %a, i1 true), !range !0
  292. %b = add i16 %cttz, -8
  293. ; CHECK: or i16 %cttz, -8
  294. ret i16 %b
  295. }
  296. declare i16 @llvm.cttz.i16(i16, i1)
  297. !0 = !{i16 0, i16 8}
  298. ; Similar to @add_cttz, but in this test, the range implied by the
  299. ; intrinsic is more strict. Therefore, ValueTracking uses that range.
  300. define i16 @add_cttz_2(i16 %a) {
  301. ; CHECK-LABEL: @add_cttz_2(
  302. ; llvm.cttz.i16(..., /*is_zero_undefined=*/true) implies the value returned
  303. ; is in [0, 16). The range metadata indicates the value returned is in
  304. ; [0, 32). Intersecting these ranges, we know the value returned is in
  305. ; [0, 16). Therefore, InstCombine will transform
  306. ; add %cttz, 1111 1111 1111 0000 ; decimal -16
  307. ; to
  308. ; or %cttz, 1111 1111 1111 0000
  309. %cttz = call i16 @llvm.cttz.i16(i16 %a, i1 true), !range !1
  310. %b = add i16 %cttz, -16
  311. ; CHECK: or i16 %cttz, -16
  312. ret i16 %b
  313. }
  314. !1 = !{i16 0, i16 32}
  315. define i32 @add_or_and(i32 %x, i32 %y) {
  316. %or = or i32 %x, %y
  317. %and = and i32 %x, %y
  318. %add = add i32 %or, %and
  319. ret i32 %add
  320. ; CHECK-LABEL: @add_or_and(
  321. ; CHECK-NEXT: add i32 %x, %y
  322. ; CHECK-NEXT: ret i32
  323. }
  324. define i32 @add_nsw_or_and(i32 %x, i32 %y) {
  325. %or = or i32 %x, %y
  326. %and = and i32 %x, %y
  327. %add = add nsw i32 %or, %and
  328. ret i32 %add
  329. ; CHECK-LABEL: @add_nsw_or_and(
  330. ; CHECK-NEXT: add nsw i32 %x, %y
  331. ; CHECK-NEXT: ret i32
  332. }
  333. define i32 @add_nuw_or_and(i32 %x, i32 %y) {
  334. %or = or i32 %x, %y
  335. %and = and i32 %x, %y
  336. %add = add nuw i32 %or, %and
  337. ret i32 %add
  338. ; CHECK-LABEL: @add_nuw_or_and(
  339. ; CHECK-NEXT: add nuw i32 %x, %y
  340. ; CHECK-NEXT: ret i32
  341. }
  342. define i32 @add_nuw_nsw_or_and(i32 %x, i32 %y) {
  343. %or = or i32 %x, %y
  344. %and = and i32 %x, %y
  345. %add = add nsw nuw i32 %or, %and
  346. ret i32 %add
  347. ; CHECK-LABEL: @add_nuw_nsw_or_and(
  348. ; CHECK-NEXT: add nuw nsw i32 %x, %y
  349. ; CHECK-NEXT: ret i32
  350. }
  351. ; A *nsw B + A *nsw C != A *nsw (B + C)
  352. ; e.g. A = -1, B = 1, C = INT_SMAX
  353. define i8 @add_of_mul(i8 %x, i8 %y, i8 %z) {
  354. ; CHECK-LABEL: @add_of_mul(
  355. entry:
  356. %mA = mul nsw i8 %x, %y
  357. %mB = mul nsw i8 %x, %z
  358. ; CHECK: %sum = mul i8
  359. %sum = add nsw i8 %mA, %mB
  360. ret i8 %sum
  361. }