or.ll 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518
  1. ; This test makes sure that these instructions are properly eliminated.
  2. ; RUN: opt < %s -instcombine -S | FileCheck %s
  3. target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
  4. define i32 @test1(i32 %A) {
  5. %B = or i32 %A, 0
  6. ret i32 %B
  7. ; CHECK-LABEL: @test1(
  8. ; CHECK: ret i32 %A
  9. }
  10. define i32 @test2(i32 %A) {
  11. %B = or i32 %A, -1
  12. ret i32 %B
  13. ; CHECK-LABEL: @test2(
  14. ; CHECK: ret i32 -1
  15. }
  16. define i8 @test2a(i8 %A) {
  17. %B = or i8 %A, -1
  18. ret i8 %B
  19. ; CHECK-LABEL: @test2a(
  20. ; CHECK: ret i8 -1
  21. }
  22. define i1 @test3(i1 %A) {
  23. %B = or i1 %A, false
  24. ret i1 %B
  25. ; CHECK-LABEL: @test3(
  26. ; CHECK: ret i1 %A
  27. }
  28. define i1 @test4(i1 %A) {
  29. %B = or i1 %A, true
  30. ret i1 %B
  31. ; CHECK-LABEL: @test4(
  32. ; CHECK: ret i1 true
  33. }
  34. define i1 @test5(i1 %A) {
  35. %B = or i1 %A, %A
  36. ret i1 %B
  37. ; CHECK-LABEL: @test5(
  38. ; CHECK: ret i1 %A
  39. }
  40. define i32 @test6(i32 %A) {
  41. %B = or i32 %A, %A
  42. ret i32 %B
  43. ; CHECK-LABEL: @test6(
  44. ; CHECK: ret i32 %A
  45. }
  46. ; A | ~A == -1
  47. define i32 @test7(i32 %A) {
  48. %NotA = xor i32 -1, %A
  49. %B = or i32 %A, %NotA
  50. ret i32 %B
  51. ; CHECK-LABEL: @test7(
  52. ; CHECK: ret i32 -1
  53. }
  54. define i8 @test8(i8 %A) {
  55. %B = or i8 %A, -2
  56. %C = or i8 %B, 1
  57. ret i8 %C
  58. ; CHECK-LABEL: @test8(
  59. ; CHECK: ret i8 -1
  60. }
  61. ; Test that (A|c1)|(B|c2) == (A|B)|(c1|c2)
  62. define i8 @test9(i8 %A, i8 %B) {
  63. %C = or i8 %A, 1
  64. %D = or i8 %B, -2
  65. %E = or i8 %C, %D
  66. ret i8 %E
  67. ; CHECK-LABEL: @test9(
  68. ; CHECK: ret i8 -1
  69. }
  70. define i8 @test10(i8 %A) {
  71. %B = or i8 %A, 1
  72. %C = and i8 %B, -2
  73. ; (X & C1) | C2 --> (X | C2) & (C1|C2)
  74. %D = or i8 %C, -2
  75. ret i8 %D
  76. ; CHECK-LABEL: @test10(
  77. ; CHECK: ret i8 -2
  78. }
  79. define i8 @test11(i8 %A) {
  80. %B = or i8 %A, -2
  81. %C = xor i8 %B, 13
  82. ; (X ^ C1) | C2 --> (X | C2) ^ (C1&~C2)
  83. %D = or i8 %C, 1
  84. %E = xor i8 %D, 12
  85. ret i8 %E
  86. ; CHECK-LABEL: @test11(
  87. ; CHECK: ret i8 -1
  88. }
  89. define i32 @test12(i32 %A) {
  90. ; Should be eliminated
  91. %B = or i32 %A, 4
  92. %C = and i32 %B, 8
  93. ret i32 %C
  94. ; CHECK-LABEL: @test12(
  95. ; CHECK: %C = and i32 %A, 8
  96. ; CHECK: ret i32 %C
  97. }
  98. define i32 @test13(i32 %A) {
  99. %B = or i32 %A, 12
  100. ; Always equal to 8
  101. %C = and i32 %B, 8
  102. ret i32 %C
  103. ; CHECK-LABEL: @test13(
  104. ; CHECK: ret i32 8
  105. }
  106. define i1 @test14(i32 %A, i32 %B) {
  107. %C1 = icmp ult i32 %A, %B
  108. %C2 = icmp ugt i32 %A, %B
  109. ; (A < B) | (A > B) === A != B
  110. %D = or i1 %C1, %C2
  111. ret i1 %D
  112. ; CHECK-LABEL: @test14(
  113. ; CHECK: icmp ne i32 %A, %B
  114. ; CHECK: ret i1
  115. }
  116. define i1 @test15(i32 %A, i32 %B) {
  117. %C1 = icmp ult i32 %A, %B
  118. %C2 = icmp eq i32 %A, %B
  119. ; (A < B) | (A == B) === A <= B
  120. %D = or i1 %C1, %C2
  121. ret i1 %D
  122. ; CHECK-LABEL: @test15(
  123. ; CHECK: icmp ule i32 %A, %B
  124. ; CHECK: ret i1
  125. }
  126. define i32 @test16(i32 %A) {
  127. %B = and i32 %A, 1
  128. ; -2 = ~1
  129. %C = and i32 %A, -2
  130. ; %D = and int %B, -1 == %B
  131. %D = or i32 %B, %C
  132. ret i32 %D
  133. ; CHECK-LABEL: @test16(
  134. ; CHECK: ret i32 %A
  135. }
  136. define i32 @test17(i32 %A) {
  137. %B = and i32 %A, 1
  138. %C = and i32 %A, 4
  139. ; %D = and int %B, 5
  140. %D = or i32 %B, %C
  141. ret i32 %D
  142. ; CHECK-LABEL: @test17(
  143. ; CHECK: %D = and i32 %A, 5
  144. ; CHECK: ret i32 %D
  145. }
  146. define i1 @test18(i32 %A) {
  147. %B = icmp sge i32 %A, 100
  148. %C = icmp slt i32 %A, 50
  149. ;; (A-50) >u 50
  150. %D = or i1 %B, %C
  151. ret i1 %D
  152. ; CHECK-LABEL: @test18(
  153. ; CHECK: add i32
  154. ; CHECK: icmp ugt
  155. ; CHECK: ret i1
  156. }
  157. define i1 @test19(i32 %A) {
  158. %B = icmp eq i32 %A, 50
  159. %C = icmp eq i32 %A, 51
  160. ;; (A&-2) == 50
  161. %D = or i1 %B, %C
  162. ret i1 %D
  163. ; CHECK-LABEL: @test19(
  164. ; CHECK: and i32
  165. ; CHECK: icmp eq
  166. ; CHECK: ret i1
  167. }
  168. define i32 @test20(i32 %x) {
  169. %y = and i32 %x, 123
  170. %z = or i32 %y, %x
  171. ret i32 %z
  172. ; CHECK-LABEL: @test20(
  173. ; CHECK: ret i32 %x
  174. }
  175. define i32 @test21(i32 %tmp.1) {
  176. %tmp.1.mask1 = add i32 %tmp.1, 2
  177. %tmp.3 = and i32 %tmp.1.mask1, -2
  178. %tmp.5 = and i32 %tmp.1, 1
  179. ;; add tmp.1, 2
  180. %tmp.6 = or i32 %tmp.5, %tmp.3
  181. ret i32 %tmp.6
  182. ; CHECK-LABEL: @test21(
  183. ; CHECK: add i32 %{{[^,]*}}, 2
  184. ; CHECK: ret i32
  185. }
  186. define i32 @test22(i32 %B) {
  187. %ELIM41 = and i32 %B, 1
  188. %ELIM7 = and i32 %B, -2
  189. %ELIM5 = or i32 %ELIM41, %ELIM7
  190. ret i32 %ELIM5
  191. ; CHECK-LABEL: @test22(
  192. ; CHECK: ret i32 %B
  193. }
  194. define i16 @test23(i16 %A) {
  195. %B = lshr i16 %A, 1
  196. ;; fold or into xor
  197. %C = or i16 %B, -32768
  198. %D = xor i16 %C, 8193
  199. ret i16 %D
  200. ; CHECK-LABEL: @test23(
  201. ; CHECK: %B = lshr i16 %A, 1
  202. ; CHECK: %D = xor i16 %B, -24575
  203. ; CHECK: ret i16 %D
  204. }
  205. ; PR1738
  206. define i1 @test24(double %X, double %Y) {
  207. %tmp9 = fcmp uno double %X, 0.000000e+00 ; <i1> [#uses=1]
  208. %tmp13 = fcmp uno double %Y, 0.000000e+00 ; <i1> [#uses=1]
  209. %bothcond = or i1 %tmp13, %tmp9 ; <i1> [#uses=1]
  210. ret i1 %bothcond
  211. ; CHECK-LABEL: @test24(
  212. ; CHECK: = fcmp uno double %Y, %X
  213. ; CHECK: ret i1
  214. }
  215. ; PR3266 & PR5276
  216. define i1 @test25(i32 %A, i32 %B) {
  217. %C = icmp eq i32 %A, 0
  218. %D = icmp eq i32 %B, 57
  219. %E = or i1 %C, %D
  220. %F = xor i1 %E, -1
  221. ret i1 %F
  222. ; CHECK-LABEL: @test25(
  223. ; CHECK: icmp ne i32 %A, 0
  224. ; CHECK-NEXT: icmp ne i32 %B, 57
  225. ; CHECK-NEXT: %F = and i1
  226. ; CHECK-NEXT: ret i1 %F
  227. }
  228. ; PR5634
  229. define i1 @test26(i32 %A, i32 %B) {
  230. %C1 = icmp eq i32 %A, 0
  231. %C2 = icmp eq i32 %B, 0
  232. ; (A == 0) & (A == 0) --> (A|B) == 0
  233. %D = and i1 %C1, %C2
  234. ret i1 %D
  235. ; CHECK-LABEL: @test26(
  236. ; CHECK: or i32 %A, %B
  237. ; CHECK: icmp eq i32 {{.*}}, 0
  238. ; CHECK: ret i1
  239. }
  240. define i1 @test27(i32* %A, i32* %B) {
  241. %C1 = ptrtoint i32* %A to i32
  242. %C2 = ptrtoint i32* %B to i32
  243. %D = or i32 %C1, %C2
  244. %E = icmp eq i32 %D, 0
  245. ret i1 %E
  246. ; CHECK-LABEL: @test27(
  247. ; CHECK: icmp eq i32* %A, null
  248. ; CHECK: icmp eq i32* %B, null
  249. ; CHECK: and i1
  250. ; CHECK: ret i1
  251. }
  252. ; PR5634
  253. define i1 @test28(i32 %A, i32 %B) {
  254. %C1 = icmp ne i32 %A, 0
  255. %C2 = icmp ne i32 %B, 0
  256. ; (A != 0) | (A != 0) --> (A|B) != 0
  257. %D = or i1 %C1, %C2
  258. ret i1 %D
  259. ; CHECK-LABEL: @test28(
  260. ; CHECK: or i32 %A, %B
  261. ; CHECK: icmp ne i32 {{.*}}, 0
  262. ; CHECK: ret i1
  263. }
  264. define i1 @test29(i32* %A, i32* %B) {
  265. %C1 = ptrtoint i32* %A to i32
  266. %C2 = ptrtoint i32* %B to i32
  267. %D = or i32 %C1, %C2
  268. %E = icmp ne i32 %D, 0
  269. ret i1 %E
  270. ; CHECK-LABEL: @test29(
  271. ; CHECK: icmp ne i32* %A, null
  272. ; CHECK: icmp ne i32* %B, null
  273. ; CHECK: or i1
  274. ; CHECK: ret i1
  275. }
  276. ; PR4216
  277. define i32 @test30(i32 %A) {
  278. entry:
  279. %B = or i32 %A, 32962
  280. %C = and i32 %A, -65536
  281. %D = and i32 %B, 40186
  282. %E = or i32 %D, %C
  283. ret i32 %E
  284. ; CHECK-LABEL: @test30(
  285. ; CHECK: %D = and i32 %A, -58312
  286. ; CHECK: %E = or i32 %D, 32962
  287. ; CHECK: ret i32 %E
  288. }
  289. ; PR4216
  290. define i64 @test31(i64 %A) nounwind readnone ssp noredzone {
  291. %B = or i64 %A, 194
  292. %D = and i64 %B, 250
  293. %C = or i64 %A, 32768
  294. %E = and i64 %C, 4294941696
  295. %F = or i64 %D, %E
  296. ret i64 %F
  297. ; CHECK-LABEL: @test31(
  298. ; CHECK-NEXT: %E = and i64 %A, 4294908984
  299. ; CHECK-NEXT: %F = or i64 %E, 32962
  300. ; CHECK-NEXT: ret i64 %F
  301. }
  302. define <4 x i32> @test32(<4 x i1> %and.i1352, <4 x i32> %vecinit6.i176, <4 x i32> %vecinit6.i191) {
  303. %and.i135 = sext <4 x i1> %and.i1352 to <4 x i32> ; <<4 x i32>> [#uses=2]
  304. %and.i129 = and <4 x i32> %vecinit6.i176, %and.i135 ; <<4 x i32>> [#uses=1]
  305. %neg.i = xor <4 x i32> %and.i135, <i32 -1, i32 -1, i32 -1, i32 -1> ; <<4 x i32>> [#uses=1]
  306. %and.i = and <4 x i32> %vecinit6.i191, %neg.i ; <<4 x i32>> [#uses=1]
  307. %or.i = or <4 x i32> %and.i, %and.i129 ; <<4 x i32>> [#uses=1]
  308. ret <4 x i32> %or.i
  309. ; codegen is mature enough to handle vector selects.
  310. ; CHECK-LABEL: @test32(
  311. ; CHECK: select <4 x i1> %and.i1352, <4 x i32> %vecinit6.i176, <4 x i32> %vecinit6.i191
  312. }
  313. define i1 @test33(i1 %X, i1 %Y) {
  314. %a = or i1 %X, %Y
  315. %b = or i1 %a, %X
  316. ret i1 %b
  317. ; CHECK-LABEL: @test33(
  318. ; CHECK-NEXT: or i1 %X, %Y
  319. ; CHECK-NEXT: ret
  320. }
  321. define i32 @test34(i32 %X, i32 %Y) {
  322. %a = or i32 %X, %Y
  323. %b = or i32 %Y, %a
  324. ret i32 %b
  325. ; CHECK-LABEL: @test34(
  326. ; CHECK-NEXT: or i32 %X, %Y
  327. ; CHECK-NEXT: ret
  328. }
  329. define i32 @test35(i32 %a, i32 %b) {
  330. %1 = or i32 %a, 1135
  331. %2 = or i32 %1, %b
  332. ret i32 %2
  333. ; CHECK-LABEL: @test35(
  334. ; CHECK-NEXT: or i32 %a, %b
  335. ; CHECK-NEXT: or i32 %1, 1135
  336. }
  337. define i1 @test36(i32 %x) {
  338. %cmp1 = icmp eq i32 %x, 23
  339. %cmp2 = icmp eq i32 %x, 24
  340. %ret1 = or i1 %cmp1, %cmp2
  341. %cmp3 = icmp eq i32 %x, 25
  342. %ret2 = or i1 %ret1, %cmp3
  343. ret i1 %ret2
  344. ; CHECK-LABEL: @test36(
  345. ; CHECK-NEXT: %x.off = add i32 %x, -23
  346. ; CHECK-NEXT: icmp ult i32 %x.off, 3
  347. ; CHECK-NEXT: ret i1
  348. }
  349. define i32 @test37(i32* %xp, i32 %y) {
  350. ; CHECK-LABEL: @test37(
  351. ; CHECK: select i1 %tobool, i32 -1, i32 %x
  352. %tobool = icmp ne i32 %y, 0
  353. %sext = sext i1 %tobool to i32
  354. %x = load i32, i32* %xp
  355. %or = or i32 %sext, %x
  356. ret i32 %or
  357. }
  358. define i32 @test38(i32* %xp, i32 %y) {
  359. ; CHECK-LABEL: @test38(
  360. ; CHECK: select i1 %tobool, i32 -1, i32 %x
  361. %tobool = icmp ne i32 %y, 0
  362. %sext = sext i1 %tobool to i32
  363. %x = load i32, i32* %xp
  364. %or = or i32 %x, %sext
  365. ret i32 %or
  366. }
  367. define i32 @test39(i32 %a, i32 %b) {
  368. ; CHECK-LABEL: test39(
  369. ; CHECK-NEXT: %or = or i32 %a, %b
  370. %xor = xor i32 %a, -1
  371. %and = and i32 %xor, %b
  372. %or = or i32 %and, %a
  373. ret i32 %or
  374. }
  375. define i32 @test40(i32 %a, i32 %b) {
  376. ; CHECK-LABEL: test40(
  377. ; CHECK-NEXT: %1 = xor i32 %a, -1
  378. ; CHECK-NEXT: %or = or i32 %1, %b
  379. %and = and i32 %a, %b
  380. %xor = xor i32 %a, -1
  381. %or = or i32 %and, %xor
  382. ret i32 %or
  383. }
  384. define i32 @test41(i32 %a, i32 %b) {
  385. ; CHECK-LABEL: test41(
  386. ; CHECK-NEXT: %1 = xor i32 %a, -1
  387. ; CHECK-NEXT: %or = xor i32 %1, %b
  388. %and = and i32 %a, %b
  389. %nega = xor i32 %a, -1
  390. %xor = xor i32 %nega, %b
  391. %or = or i32 %and, %xor
  392. ret i32 %or
  393. }
  394. define i32 @test42(i32 %a, i32 %b) {
  395. ; CHECK-LABEL: test42(
  396. ; CHECK-NEXT: %1 = xor i32 %a, -1
  397. ; CHECK-NEXT: %or = xor i32 %1, %b
  398. %nega = xor i32 %a, -1
  399. %xor = xor i32 %nega, %b
  400. %and = and i32 %a, %b
  401. %or = or i32 %xor, %and
  402. ret i32 %or
  403. }
  404. define i32 @test43(i32 %a, i32 %b) {
  405. ; CHECK-LABEL: test43(
  406. ; CHECK-NEXT: %or = xor i32 %a, %b
  407. %neg = xor i32 %b, -1
  408. %and = and i32 %a, %neg
  409. %xor = xor i32 %a, %b
  410. %or = or i32 %and, %xor
  411. ret i32 %or
  412. }
  413. define i32 @test44(i32 %a, i32 %b) {
  414. ; CHECK-LABEL: test44(
  415. ; CHECK-NEXT: %or = xor i32 %a, %b
  416. %xor = xor i32 %a, %b
  417. %neg = xor i32 %b, -1
  418. %and = and i32 %a, %neg
  419. %or = or i32 %xor, %and
  420. ret i32 %or
  421. }
  422. define i32 @test45(i32 %x, i32 %y, i32 %z) {
  423. ; CHECK-LABEL: test45(
  424. ; CHECK-NEXT: %1 = and i32 %x, %z
  425. ; CHECK-NEXT: %or1 = or i32 %1, %y
  426. ; CHECK-NEXT: ret i32 %or1
  427. %or = or i32 %y, %z
  428. %and = and i32 %x, %or
  429. %or1 = or i32 %and, %y
  430. ret i32 %or1
  431. }
  432. define i1 @test46(i8 signext %c) {
  433. %c.off = add i8 %c, -97
  434. %cmp1 = icmp ult i8 %c.off, 26
  435. %c.off17 = add i8 %c, -65
  436. %cmp2 = icmp ult i8 %c.off17, 26
  437. %or = or i1 %cmp1, %cmp2
  438. ret i1 %or
  439. ; CHECK-LABEL: @test46(
  440. ; CHECK-NEXT: and i8 %c, -33
  441. ; CHECK-NEXT: add i8 %1, -65
  442. ; CHECK-NEXT: icmp ult i8 %2, 26
  443. }
  444. define i1 @test47(i8 signext %c) {
  445. %c.off = add i8 %c, -65
  446. %cmp1 = icmp ule i8 %c.off, 26
  447. %c.off17 = add i8 %c, -97
  448. %cmp2 = icmp ule i8 %c.off17, 26
  449. %or = or i1 %cmp1, %cmp2
  450. ret i1 %or
  451. ; CHECK-LABEL: @test47(
  452. ; CHECK-NEXT: and i8 %c, -33
  453. ; CHECK-NEXT: add i8 %1, -65
  454. ; CHECK-NEXT: icmp ult i8 %2, 27
  455. }
  456. define i1 @test48(i64 %x, i1 %b) {
  457. %1 = icmp ult i64 %x, 2305843009213693952
  458. %2 = icmp ugt i64 %x, 2305843009213693951
  459. %.b = or i1 %2, %b
  460. %3 = or i1 %1, %.b
  461. ret i1 %3
  462. ; CHECK-LABEL: @test48(
  463. ; CHECK-NEXT: ret i1 true
  464. }