and.ll 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. ; This test makes sure that these instructions are properly eliminated.
  2. ;
  3. ; RUN: opt < %s -instcombine -S | not grep and
  4. define i32 @test1(i32 %A) {
  5. ; zero result
  6. %B = and i32 %A, 0 ; <i32> [#uses=1]
  7. ret i32 %B
  8. }
  9. define i32 @test2(i32 %A) {
  10. ; noop
  11. %B = and i32 %A, -1 ; <i32> [#uses=1]
  12. ret i32 %B
  13. }
  14. define i1 @test3(i1 %A) {
  15. ; always = false
  16. %B = and i1 %A, false ; <i1> [#uses=1]
  17. ret i1 %B
  18. }
  19. define i1 @test4(i1 %A) {
  20. ; noop
  21. %B = and i1 %A, true ; <i1> [#uses=1]
  22. ret i1 %B
  23. }
  24. define i32 @test5(i32 %A) {
  25. %B = and i32 %A, %A ; <i32> [#uses=1]
  26. ret i32 %B
  27. }
  28. define i1 @test6(i1 %A) {
  29. %B = and i1 %A, %A ; <i1> [#uses=1]
  30. ret i1 %B
  31. }
  32. ; A & ~A == 0
  33. define i32 @test7(i32 %A) {
  34. %NotA = xor i32 %A, -1 ; <i32> [#uses=1]
  35. %B = and i32 %A, %NotA ; <i32> [#uses=1]
  36. ret i32 %B
  37. }
  38. ; AND associates
  39. define i8 @test8(i8 %A) {
  40. %B = and i8 %A, 3 ; <i8> [#uses=1]
  41. %C = and i8 %B, 4 ; <i8> [#uses=1]
  42. ret i8 %C
  43. }
  44. define i1 @test9(i32 %A) {
  45. ; Test of sign bit, convert to setle %A, 0
  46. %B = and i32 %A, -2147483648 ; <i32> [#uses=1]
  47. %C = icmp ne i32 %B, 0 ; <i1> [#uses=1]
  48. ret i1 %C
  49. }
  50. define i1 @test9a(i32 %A) {
  51. ; Test of sign bit, convert to setle %A, 0
  52. %B = and i32 %A, -2147483648 ; <i32> [#uses=1]
  53. %C = icmp ne i32 %B, 0 ; <i1> [#uses=1]
  54. ret i1 %C
  55. }
  56. define i32 @test10(i32 %A) {
  57. %B = and i32 %A, 12 ; <i32> [#uses=1]
  58. %C = xor i32 %B, 15 ; <i32> [#uses=1]
  59. ; (X ^ C1) & C2 --> (X & C2) ^ (C1&C2)
  60. %D = and i32 %C, 1 ; <i32> [#uses=1]
  61. ret i32 %D
  62. }
  63. define i32 @test11(i32 %A, i32* %P) {
  64. %B = or i32 %A, 3 ; <i32> [#uses=1]
  65. %C = xor i32 %B, 12 ; <i32> [#uses=2]
  66. ; additional use of C
  67. store i32 %C, i32* %P
  68. ; %C = and uint %B, 3 --> 3
  69. %D = and i32 %C, 3 ; <i32> [#uses=1]
  70. ret i32 %D
  71. }
  72. define i1 @test12(i32 %A, i32 %B) {
  73. %C1 = icmp ult i32 %A, %B ; <i1> [#uses=1]
  74. %C2 = icmp ule i32 %A, %B ; <i1> [#uses=1]
  75. ; (A < B) & (A <= B) === (A < B)
  76. %D = and i1 %C1, %C2 ; <i1> [#uses=1]
  77. ret i1 %D
  78. }
  79. define i1 @test13(i32 %A, i32 %B) {
  80. %C1 = icmp ult i32 %A, %B ; <i1> [#uses=1]
  81. %C2 = icmp ugt i32 %A, %B ; <i1> [#uses=1]
  82. ; (A < B) & (A > B) === false
  83. %D = and i1 %C1, %C2 ; <i1> [#uses=1]
  84. ret i1 %D
  85. }
  86. define i1 @test14(i8 %A) {
  87. %B = and i8 %A, -128 ; <i8> [#uses=1]
  88. %C = icmp ne i8 %B, 0 ; <i1> [#uses=1]
  89. ret i1 %C
  90. }
  91. define i8 @test15(i8 %A) {
  92. %B = lshr i8 %A, 7 ; <i8> [#uses=1]
  93. ; Always equals zero
  94. %C = and i8 %B, 2 ; <i8> [#uses=1]
  95. ret i8 %C
  96. }
  97. define i8 @test16(i8 %A) {
  98. %B = shl i8 %A, 2 ; <i8> [#uses=1]
  99. %C = and i8 %B, 3 ; <i8> [#uses=1]
  100. ret i8 %C
  101. }
  102. ;; ~(~X & Y) --> (X | ~Y)
  103. define i8 @test17(i8 %X, i8 %Y) {
  104. %B = xor i8 %X, -1 ; <i8> [#uses=1]
  105. %C = and i8 %B, %Y ; <i8> [#uses=1]
  106. %D = xor i8 %C, -1 ; <i8> [#uses=1]
  107. ret i8 %D
  108. }
  109. define i1 @test18(i32 %A) {
  110. %B = and i32 %A, -128 ; <i32> [#uses=1]
  111. ;; C >= 128
  112. %C = icmp ne i32 %B, 0 ; <i1> [#uses=1]
  113. ret i1 %C
  114. }
  115. define i1 @test18a(i8 %A) {
  116. %B = and i8 %A, -2 ; <i8> [#uses=1]
  117. %C = icmp eq i8 %B, 0 ; <i1> [#uses=1]
  118. ret i1 %C
  119. }
  120. define i32 @test19(i32 %A) {
  121. %B = shl i32 %A, 3 ; <i32> [#uses=1]
  122. ;; Clearing a zero bit
  123. %C = and i32 %B, -2 ; <i32> [#uses=1]
  124. ret i32 %C
  125. }
  126. define i8 @test20(i8 %A) {
  127. %C = lshr i8 %A, 7 ; <i8> [#uses=1]
  128. ;; Unneeded
  129. %D = and i8 %C, 1 ; <i8> [#uses=1]
  130. ret i8 %D
  131. }
  132. define i1 @test22(i32 %A) {
  133. %B = icmp eq i32 %A, 1 ; <i1> [#uses=1]
  134. %C = icmp sge i32 %A, 3 ; <i1> [#uses=1]
  135. ;; false
  136. %D = and i1 %B, %C ; <i1> [#uses=1]
  137. ret i1 %D
  138. }
  139. define i1 @test23(i32 %A) {
  140. %B = icmp sgt i32 %A, 1 ; <i1> [#uses=1]
  141. %C = icmp sle i32 %A, 2 ; <i1> [#uses=1]
  142. ;; A == 2
  143. %D = and i1 %B, %C ; <i1> [#uses=1]
  144. ret i1 %D
  145. }
  146. define i1 @test24(i32 %A) {
  147. %B = icmp sgt i32 %A, 1 ; <i1> [#uses=1]
  148. %C = icmp ne i32 %A, 2 ; <i1> [#uses=1]
  149. ;; A > 2
  150. %D = and i1 %B, %C ; <i1> [#uses=1]
  151. ret i1 %D
  152. }
  153. define i1 @test25(i32 %A) {
  154. %B = icmp sge i32 %A, 50 ; <i1> [#uses=1]
  155. %C = icmp slt i32 %A, 100 ; <i1> [#uses=1]
  156. ;; (A-50) <u 50
  157. %D = and i1 %B, %C ; <i1> [#uses=1]
  158. ret i1 %D
  159. }
  160. define i1 @test26(i32 %A) {
  161. %B = icmp ne i32 %A, 49 ; <i1> [#uses=1]
  162. %C = icmp ne i32 %A, 50 ; <i1> [#uses=1]
  163. ;; (A-49) > 1
  164. %D = and i1 %B, %C ; <i1> [#uses=1]
  165. ret i1 %D
  166. }
  167. define i8 @test27(i8 %A) {
  168. %B = and i8 %A, 4 ; <i8> [#uses=1]
  169. %C = sub i8 %B, 16 ; <i8> [#uses=1]
  170. ;; 0xF0
  171. %D = and i8 %C, -16 ; <i8> [#uses=1]
  172. %E = add i8 %D, 16 ; <i8> [#uses=1]
  173. ret i8 %E
  174. }
  175. ;; This is juse a zero extending shr.
  176. define i32 @test28(i32 %X) {
  177. ;; Sign extend
  178. %Y = ashr i32 %X, 24 ; <i32> [#uses=1]
  179. ;; Mask out sign bits
  180. %Z = and i32 %Y, 255 ; <i32> [#uses=1]
  181. ret i32 %Z
  182. }
  183. define i32 @test29(i8 %X) {
  184. %Y = zext i8 %X to i32 ; <i32> [#uses=1]
  185. ;; Zero extend makes this unneeded.
  186. %Z = and i32 %Y, 255 ; <i32> [#uses=1]
  187. ret i32 %Z
  188. }
  189. define i32 @test30(i1 %X) {
  190. %Y = zext i1 %X to i32 ; <i32> [#uses=1]
  191. %Z = and i32 %Y, 1 ; <i32> [#uses=1]
  192. ret i32 %Z
  193. }
  194. define i32 @test31(i1 %X) {
  195. %Y = zext i1 %X to i32 ; <i32> [#uses=1]
  196. %Z = shl i32 %Y, 4 ; <i32> [#uses=1]
  197. %A = and i32 %Z, 16 ; <i32> [#uses=1]
  198. ret i32 %A
  199. }
  200. define i32 @test32(i32 %In) {
  201. %Y = and i32 %In, 16 ; <i32> [#uses=1]
  202. %Z = lshr i32 %Y, 2 ; <i32> [#uses=1]
  203. %A = and i32 %Z, 1 ; <i32> [#uses=1]
  204. ret i32 %A
  205. }
  206. ;; Code corresponding to one-bit bitfield ^1.
  207. define i32 @test33(i32 %b) {
  208. %tmp.4.mask = and i32 %b, 1 ; <i32> [#uses=1]
  209. %tmp.10 = xor i32 %tmp.4.mask, 1 ; <i32> [#uses=1]
  210. %tmp.12 = and i32 %b, -2 ; <i32> [#uses=1]
  211. %tmp.13 = or i32 %tmp.12, %tmp.10 ; <i32> [#uses=1]
  212. ret i32 %tmp.13
  213. }
  214. define i32 @test34(i32 %A, i32 %B) {
  215. %tmp.2 = or i32 %B, %A ; <i32> [#uses=1]
  216. %tmp.4 = and i32 %tmp.2, %B ; <i32> [#uses=1]
  217. ret i32 %tmp.4
  218. }