bswap-fold.ll 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. ; RUN: opt < %s -instcombine -S | FileCheck %s
  2. define i1 @test1(i16 %tmp2) {
  3. ; CHECK-LABEL: @test1
  4. ; CHECK-NEXT: %tmp = icmp eq i16 %tmp2, 256
  5. ; CHECK-NEXT: ret i1 %tmp
  6. %tmp10 = call i16 @llvm.bswap.i16( i16 %tmp2 )
  7. %tmp = icmp eq i16 %tmp10, 1
  8. ret i1 %tmp
  9. }
  10. define i1 @test2(i32 %tmp) {
  11. ; CHECK-LABEL: @test2
  12. ; CHECK-NEXT: %tmp.upgrd.1 = icmp eq i32 %tmp, 16777216
  13. ; CHECK-NEXT: ret i1 %tmp.upgrd.1
  14. %tmp34 = tail call i32 @llvm.bswap.i32( i32 %tmp )
  15. %tmp.upgrd.1 = icmp eq i32 %tmp34, 1
  16. ret i1 %tmp.upgrd.1
  17. }
  18. define i1 @test3(i64 %tmp) {
  19. ; CHECK-LABEL: @test3
  20. ; CHECK-NEXT: %tmp.upgrd.2 = icmp eq i64 %tmp, 72057594037927936
  21. ; CHECK-NEXT: ret i1 %tmp.upgrd.2
  22. %tmp34 = tail call i64 @llvm.bswap.i64( i64 %tmp )
  23. %tmp.upgrd.2 = icmp eq i64 %tmp34, 1
  24. ret i1 %tmp.upgrd.2
  25. }
  26. ; rdar://5992453
  27. ; A & 255
  28. define i32 @test4(i32 %a) nounwind {
  29. ; CHECK-LABEL: @test4
  30. ; CHECK-NEXT: %tmp2 = and i32 %a, 255
  31. ; CHECK-NEXT: ret i32 %tmp2
  32. %tmp2 = tail call i32 @llvm.bswap.i32( i32 %a )
  33. %tmp4 = lshr i32 %tmp2, 24
  34. ret i32 %tmp4
  35. }
  36. ; A
  37. define i32 @test5(i32 %a) nounwind {
  38. ; CHECK-LABEL: @test5
  39. ; CHECK-NEXT: ret i32 %a
  40. %tmp2 = tail call i32 @llvm.bswap.i32( i32 %a )
  41. %tmp4 = tail call i32 @llvm.bswap.i32( i32 %tmp2 )
  42. ret i32 %tmp4
  43. }
  44. ; a >> 24
  45. define i32 @test6(i32 %a) nounwind {
  46. ; CHECK-LABEL: @test6
  47. ; CHECK-NEXT: %tmp2 = lshr i32 %a, 24
  48. ; CHECK-NEXT ret i32 %tmp4
  49. %tmp2 = tail call i32 @llvm.bswap.i32( i32 %a )
  50. %tmp4 = and i32 %tmp2, 255
  51. ret i32 %tmp4
  52. }
  53. ; PR5284
  54. define i16 @test7(i32 %A) {
  55. ; CHECK-LABEL: @test7
  56. ; CHECK-NEXT: %1 = lshr i32 %A, 16
  57. ; CHECK-NEXT: %D = trunc i32 %1 to i16
  58. ; CHECK-NEXT ret i16 %D
  59. %B = tail call i32 @llvm.bswap.i32(i32 %A) nounwind
  60. %C = trunc i32 %B to i16
  61. %D = tail call i16 @llvm.bswap.i16(i16 %C) nounwind
  62. ret i16 %D
  63. }
  64. define i16 @test8(i64 %A) {
  65. ; CHECK-LABEL: @test8
  66. ; CHECK-NEXT: %1 = lshr i64 %A, 48
  67. ; CHECK-NEXT: %D = trunc i64 %1 to i16
  68. ; CHECK-NEXT ret i16 %D
  69. %B = tail call i64 @llvm.bswap.i64(i64 %A) nounwind
  70. %C = trunc i64 %B to i16
  71. %D = tail call i16 @llvm.bswap.i16(i16 %C) nounwind
  72. ret i16 %D
  73. }
  74. ; Misc: Fold bswap(undef) to undef.
  75. define i64 @foo() {
  76. ; CHECK-LABEL: @foo
  77. ; CHECK-NEXT: ret i64 undef
  78. %a = call i64 @llvm.bswap.i64(i64 undef)
  79. ret i64 %a
  80. }
  81. ; PR15782
  82. ; Fold: OP( BSWAP(x), BSWAP(y) ) -> BSWAP( OP(x, y) )
  83. ; Fold: OP( BSWAP(x), CONSTANT ) -> BSWAP( OP(x, BSWAP(CONSTANT) ) )
  84. define i16 @bs_and16i(i16 %a, i16 %b) #0 {
  85. ; CHECK-LABEL: @bs_and16i
  86. ; CHECK-NEXT: %1 = and i16 %a, 4391
  87. ; CHECK-NEXT: %2 = call i16 @llvm.bswap.i16(i16 %1)
  88. ; CHECK-NEXT: ret i16 %2
  89. %1 = tail call i16 @llvm.bswap.i16(i16 %a)
  90. %2 = and i16 %1, 10001
  91. ret i16 %2
  92. }
  93. define i16 @bs_and16(i16 %a, i16 %b) #0 {
  94. ; CHECK-LABEL: @bs_and16
  95. ; CHECK-NEXT: %1 = and i16 %a, %b
  96. ; CHECK-NEXT: %2 = call i16 @llvm.bswap.i16(i16 %1)
  97. ; CHECK-NEXT: ret i16 %2
  98. %tmp1 = tail call i16 @llvm.bswap.i16(i16 %a)
  99. %tmp2 = tail call i16 @llvm.bswap.i16(i16 %b)
  100. %tmp3 = and i16 %tmp1, %tmp2
  101. ret i16 %tmp3
  102. }
  103. define i16 @bs_or16(i16 %a, i16 %b) #0 {
  104. ; CHECK-LABEL: @bs_or16
  105. ; CHECK-NEXT: %1 = or i16 %a, %b
  106. ; CHECK-NEXT: %2 = call i16 @llvm.bswap.i16(i16 %1)
  107. ; CHECK-NEXT: ret i16 %2
  108. %tmp1 = tail call i16 @llvm.bswap.i16(i16 %a)
  109. %tmp2 = tail call i16 @llvm.bswap.i16(i16 %b)
  110. %tmp3 = or i16 %tmp1, %tmp2
  111. ret i16 %tmp3
  112. }
  113. define i16 @bs_xor16(i16 %a, i16 %b) #0 {
  114. ; CHECK-LABEL: @bs_xor16
  115. ; CHECK-NEXT: %1 = xor i16 %a, %b
  116. ; CHECK-NEXT: %2 = call i16 @llvm.bswap.i16(i16 %1)
  117. ; CHECK-NEXT: ret i16 %2
  118. %tmp1 = tail call i16 @llvm.bswap.i16(i16 %a)
  119. %tmp2 = tail call i16 @llvm.bswap.i16(i16 %b)
  120. %tmp3 = xor i16 %tmp1, %tmp2
  121. ret i16 %tmp3
  122. }
  123. define i32 @bs_and32i(i32 %a, i32 %b) #0 {
  124. ; CHECK-LABEL: @bs_and32i
  125. ; CHECK-NEXT: %1 = and i32 %a, -1585053440
  126. ; CHECK-NEXT: %2 = call i32 @llvm.bswap.i32(i32 %1)
  127. ; CHECK-NEXT: ret i32 %2
  128. %tmp1 = tail call i32 @llvm.bswap.i32(i32 %a)
  129. %tmp2 = and i32 %tmp1, 100001
  130. ret i32 %tmp2
  131. }
  132. define i32 @bs_and32(i32 %a, i32 %b) #0 {
  133. ; CHECK-LABEL: @bs_and32
  134. ; CHECK-NEXT: %1 = and i32 %a, %b
  135. ; CHECK-NEXT: %2 = call i32 @llvm.bswap.i32(i32 %1)
  136. ; CHECK-NEXT: ret i32 %2
  137. %tmp1 = tail call i32 @llvm.bswap.i32(i32 %a)
  138. %tmp2 = tail call i32 @llvm.bswap.i32(i32 %b)
  139. %tmp3 = and i32 %tmp1, %tmp2
  140. ret i32 %tmp3
  141. }
  142. define i32 @bs_or32(i32 %a, i32 %b) #0 {
  143. ; CHECK-LABEL: @bs_or32
  144. ; CHECK-NEXT: %1 = or i32 %a, %b
  145. ; CHECK-NEXT: %2 = call i32 @llvm.bswap.i32(i32 %1)
  146. ; CHECK-NEXT: ret i32 %2
  147. %tmp1 = tail call i32 @llvm.bswap.i32(i32 %a)
  148. %tmp2 = tail call i32 @llvm.bswap.i32(i32 %b)
  149. %tmp3 = or i32 %tmp1, %tmp2
  150. ret i32 %tmp3
  151. }
  152. define i32 @bs_xor32(i32 %a, i32 %b) #0 {
  153. ; CHECK-LABEL: @bs_xor32
  154. ; CHECK-NEXT: %1 = xor i32 %a, %b
  155. ; CHECK-NEXT: %2 = call i32 @llvm.bswap.i32(i32 %1)
  156. ; CHECK-NEXT: ret i32 %2
  157. %tmp1 = tail call i32 @llvm.bswap.i32(i32 %a)
  158. %tmp2 = tail call i32 @llvm.bswap.i32(i32 %b)
  159. %tmp3 = xor i32 %tmp1, %tmp2
  160. ret i32 %tmp3
  161. }
  162. define i64 @bs_and64i(i64 %a, i64 %b) #0 {
  163. ; CHECK-LABEL: @bs_and64i
  164. ; CHECK-NEXT: %1 = and i64 %a, 129085117527228416
  165. ; CHECK-NEXT: %2 = call i64 @llvm.bswap.i64(i64 %1)
  166. ; CHECK-NEXT: ret i64 %2
  167. %tmp1 = tail call i64 @llvm.bswap.i64(i64 %a)
  168. %tmp2 = and i64 %tmp1, 1000000001
  169. ret i64 %tmp2
  170. }
  171. define i64 @bs_and64(i64 %a, i64 %b) #0 {
  172. ; CHECK-LABEL: @bs_and64
  173. ; CHECK-NEXT: %1 = and i64 %a, %b
  174. ; CHECK-NEXT: %2 = call i64 @llvm.bswap.i64(i64 %1)
  175. ; CHECK-NEXT: ret i64 %2
  176. %tmp1 = tail call i64 @llvm.bswap.i64(i64 %a)
  177. %tmp2 = tail call i64 @llvm.bswap.i64(i64 %b)
  178. %tmp3 = and i64 %tmp1, %tmp2
  179. ret i64 %tmp3
  180. }
  181. define i64 @bs_or64(i64 %a, i64 %b) #0 {
  182. ; CHECK-LABEL: @bs_or64
  183. ; CHECK-NEXT: %1 = or i64 %a, %b
  184. ; CHECK-NEXT: %2 = call i64 @llvm.bswap.i64(i64 %1)
  185. ; CHECK-NEXT: ret i64 %2
  186. %tmp1 = tail call i64 @llvm.bswap.i64(i64 %a)
  187. %tmp2 = tail call i64 @llvm.bswap.i64(i64 %b)
  188. %tmp3 = or i64 %tmp1, %tmp2
  189. ret i64 %tmp3
  190. }
  191. define i64 @bs_xor64(i64 %a, i64 %b) #0 {
  192. ; CHECK-LABEL: @bs_xor64
  193. ; CHECK-NEXT: %1 = xor i64 %a, %b
  194. ; CHECK-NEXT: %2 = call i64 @llvm.bswap.i64(i64 %1)
  195. ; CHECK-NEXT: ret i64 %2
  196. %tmp1 = tail call i64 @llvm.bswap.i64(i64 %a)
  197. %tmp2 = tail call i64 @llvm.bswap.i64(i64 %b)
  198. %tmp3 = xor i64 %tmp1, %tmp2
  199. ret i64 %tmp3
  200. }
  201. declare i16 @llvm.bswap.i16(i16)
  202. declare i32 @llvm.bswap.i32(i32)
  203. declare i64 @llvm.bswap.i64(i64)