div.ll 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. ; This test makes sure that div instructions are properly eliminated.
  2. ; RUN: opt < %s -instcombine -S | FileCheck %s
  3. define i32 @test1(i32 %A) {
  4. %B = sdiv i32 %A, 1 ; <i32> [#uses=1]
  5. ret i32 %B
  6. ; CHECK-LABEL: @test1(
  7. ; CHECK-NEXT: ret i32 %A
  8. }
  9. define i32 @test2(i32 %A) {
  10. ; => Shift
  11. %B = udiv i32 %A, 8 ; <i32> [#uses=1]
  12. ret i32 %B
  13. ; CHECK-LABEL: @test2(
  14. ; CHECK-NEXT: lshr i32 %A, 3
  15. }
  16. define i32 @test3(i32 %A) {
  17. ; => 0, don't need to keep traps
  18. %B = sdiv i32 0, %A ; <i32> [#uses=1]
  19. ret i32 %B
  20. ; CHECK-LABEL: @test3(
  21. ; CHECK-NEXT: ret i32 0
  22. }
  23. define i32 @test4(i32 %A) {
  24. ; 0-A
  25. %B = sdiv i32 %A, -1 ; <i32> [#uses=1]
  26. ret i32 %B
  27. ; CHECK-LABEL: @test4(
  28. ; CHECK-NEXT: sub i32 0, %A
  29. }
  30. define i32 @test5(i32 %A) {
  31. %B = udiv i32 %A, -16 ; <i32> [#uses=1]
  32. %C = udiv i32 %B, -4 ; <i32> [#uses=1]
  33. ret i32 %C
  34. ; CHECK-LABEL: @test5(
  35. ; CHECK-NEXT: ret i32 0
  36. }
  37. define i1 @test6(i32 %A) {
  38. %B = udiv i32 %A, 123 ; <i32> [#uses=1]
  39. ; A < 123
  40. %C = icmp eq i32 %B, 0 ; <i1> [#uses=1]
  41. ret i1 %C
  42. ; CHECK-LABEL: @test6(
  43. ; CHECK-NEXT: icmp ult i32 %A, 123
  44. }
  45. define i1 @test7(i32 %A) {
  46. %B = udiv i32 %A, 10 ; <i32> [#uses=1]
  47. ; A >= 20 && A < 30
  48. %C = icmp eq i32 %B, 2 ; <i1> [#uses=1]
  49. ret i1 %C
  50. ; CHECK-LABEL: @test7(
  51. ; CHECK-NEXT: add i32 %A, -20
  52. ; CHECK-NEXT: icmp ult i32
  53. }
  54. define i1 @test8(i8 %A) {
  55. %B = udiv i8 %A, 123 ; <i8> [#uses=1]
  56. ; A >= 246
  57. %C = icmp eq i8 %B, 2 ; <i1> [#uses=1]
  58. ret i1 %C
  59. ; CHECK-LABEL: @test8(
  60. ; CHECK-NEXT: icmp ugt i8 %A, -11
  61. }
  62. define i1 @test9(i8 %A) {
  63. %B = udiv i8 %A, 123 ; <i8> [#uses=1]
  64. ; A < 246
  65. %C = icmp ne i8 %B, 2 ; <i1> [#uses=1]
  66. ret i1 %C
  67. ; CHECK-LABEL: @test9(
  68. ; CHECK-NEXT: icmp ult i8 %A, -10
  69. }
  70. define i32 @test10(i32 %X, i1 %C) {
  71. %V = select i1 %C, i32 64, i32 8 ; <i32> [#uses=1]
  72. %R = udiv i32 %X, %V ; <i32> [#uses=1]
  73. ret i32 %R
  74. ; CHECK-LABEL: @test10(
  75. ; CHECK-NEXT: select i1 %C, i32 6, i32 3
  76. ; CHECK-NEXT: lshr i32 %X
  77. }
  78. define i32 @test11(i32 %X, i1 %C) {
  79. %A = select i1 %C, i32 1024, i32 32 ; <i32> [#uses=1]
  80. %B = udiv i32 %X, %A ; <i32> [#uses=1]
  81. ret i32 %B
  82. ; CHECK-LABEL: @test11(
  83. ; CHECK-NEXT: select i1 %C, i32 10, i32 5
  84. ; CHECK-NEXT: lshr i32 %X
  85. }
  86. ; PR2328
  87. define i32 @test12(i32 %x) nounwind {
  88. %tmp3 = udiv i32 %x, %x ; 1
  89. ret i32 %tmp3
  90. ; CHECK-LABEL: @test12(
  91. ; CHECK-NEXT: ret i32 1
  92. }
  93. define i32 @test13(i32 %x) nounwind {
  94. %tmp3 = sdiv i32 %x, %x ; 1
  95. ret i32 %tmp3
  96. ; CHECK-LABEL: @test13(
  97. ; CHECK-NEXT: ret i32 1
  98. }
  99. define i32 @test14(i8 %x) nounwind {
  100. %zext = zext i8 %x to i32
  101. %div = udiv i32 %zext, 257 ; 0
  102. ret i32 %div
  103. ; CHECK-LABEL: @test14(
  104. ; CHECK-NEXT: ret i32 0
  105. }
  106. ; PR9814
  107. define i32 @test15(i32 %a, i32 %b) nounwind {
  108. %shl = shl i32 1, %b
  109. %div = lshr i32 %shl, 2
  110. %div2 = udiv i32 %a, %div
  111. ret i32 %div2
  112. ; CHECK-LABEL: @test15(
  113. ; CHECK-NEXT: add i32 %b, -2
  114. ; CHECK-NEXT: lshr i32 %a,
  115. ; CHECK-NEXT: ret i32
  116. }
  117. define <2 x i64> @test16(<2 x i64> %x) nounwind {
  118. %shr = lshr <2 x i64> %x, <i64 5, i64 5>
  119. %div = udiv <2 x i64> %shr, <i64 6, i64 6>
  120. ret <2 x i64> %div
  121. ; CHECK-LABEL: @test16(
  122. ; CHECK-NEXT: udiv <2 x i64> %x, <i64 192, i64 192>
  123. ; CHECK-NEXT: ret <2 x i64>
  124. }
  125. define <2 x i64> @test17(<2 x i64> %x) nounwind {
  126. %neg = sub nsw <2 x i64> zeroinitializer, %x
  127. %div = sdiv <2 x i64> %neg, <i64 3, i64 4>
  128. ret <2 x i64> %div
  129. ; CHECK-LABEL: @test17(
  130. ; CHECK-NEXT: sdiv <2 x i64> %x, <i64 -3, i64 -4>
  131. ; CHECK-NEXT: ret <2 x i64>
  132. }
  133. define <2 x i64> @test18(<2 x i64> %x) nounwind {
  134. %div = sdiv <2 x i64> %x, <i64 -1, i64 -1>
  135. ret <2 x i64> %div
  136. ; CHECK-LABEL: @test18(
  137. ; CHECK-NEXT: sub <2 x i64> zeroinitializer, %x
  138. ; CHECK-NEXT: ret <2 x i64>
  139. }
  140. define i32 @test19(i32 %x) {
  141. %A = udiv i32 1, %x
  142. ret i32 %A
  143. ; CHECK-LABEL: @test19(
  144. ; CHECK-NEXT: icmp eq i32 %x, 1
  145. ; CHECK-NEXT: zext i1 %{{.*}} to i32
  146. ; CHECK-NEXT ret i32
  147. }
  148. define i32 @test20(i32 %x) {
  149. %A = sdiv i32 1, %x
  150. ret i32 %A
  151. ; CHECK-LABEL: @test20(
  152. ; CHECK-NEXT: add i32 %x, 1
  153. ; CHECK-NEXT: icmp ult i32 %{{.*}}, 3
  154. ; CHECK-NEXT: select i1 %{{.*}}, i32 %x, i32 {{.*}}
  155. ; CHECK-NEXT: ret i32
  156. }
  157. define i32 @test21(i32 %a) {
  158. %shl = shl nsw i32 %a, 2
  159. %div = sdiv i32 %shl, 12
  160. ret i32 %div
  161. ; CHECK-LABEL: @test21(
  162. ; CHECK-NEXT: %div = sdiv i32 %a, 3
  163. ; CHECK-NEXT: ret i32 %div
  164. }
  165. define i32 @test22(i32 %a) {
  166. %mul = mul nsw i32 %a, 3
  167. %div = sdiv i32 %mul, 12
  168. ret i32 %div
  169. ; CHECK-LABEL: @test22(
  170. ; CHECK-NEXT: %div = sdiv i32 %a, 4
  171. ; CHECK-NEXT: ret i32 %div
  172. }
  173. define i32 @test23(i32 %a) {
  174. %shl = shl nuw i32 %a, 2
  175. %div = udiv i32 %shl, 12
  176. ret i32 %div
  177. ; CHECK-LABEL: @test23(
  178. ; CHECK-NEXT: %div = udiv i32 %a, 3
  179. ; CHECK-NEXT: ret i32 %div
  180. }
  181. define i32 @test24(i32 %a) {
  182. %mul = mul nuw i32 %a, 3
  183. %div = udiv i32 %mul, 12
  184. ret i32 %div
  185. ; CHECK-LABEL: @test24(
  186. ; CHECK-NEXT: %div = lshr i32 %a, 2
  187. ; CHECK-NEXT: ret i32 %div
  188. }
  189. define i32 @test25(i32 %a) {
  190. %shl = shl nsw i32 %a, 2
  191. %div = sdiv i32 %shl, 2
  192. ret i32 %div
  193. ; CHECK-LABEL: @test25(
  194. ; CHECK-NEXT: %div = shl nsw i32 %a, 1
  195. ; CHECK-NEXT: ret i32 %div
  196. }
  197. define i32 @test26(i32 %a) {
  198. %mul = mul nsw i32 %a, 12
  199. %div = sdiv i32 %mul, 3
  200. ret i32 %div
  201. ; CHECK-LABEL: @test26(
  202. ; CHECK-NEXT: %div = shl nsw i32 %a, 2
  203. ; CHECK-NEXT: ret i32 %div
  204. }
  205. define i32 @test27(i32 %a) {
  206. %shl = shl nuw i32 %a, 2
  207. %div = udiv i32 %shl, 2
  208. ret i32 %div
  209. ; CHECK-LABEL: @test27(
  210. ; CHECK-NEXT: %div = shl nuw i32 %a, 1
  211. ; CHECK-NEXT: ret i32 %div
  212. }
  213. define i32 @test28(i32 %a) {
  214. %mul = mul nuw i32 %a, 36
  215. %div = udiv i32 %mul, 3
  216. ret i32 %div
  217. ; CHECK-LABEL: @test28(
  218. ; CHECK-NEXT: %div = mul nuw i32 %a, 12
  219. ; CHECK-NEXT: ret i32 %div
  220. }
  221. define i32 @test29(i32 %a) {
  222. %mul = shl nsw i32 %a, 31
  223. %div = sdiv i32 %mul, -2147483648
  224. ret i32 %div
  225. ; CHECK-LABEL: @test29(
  226. ; CHECK-NEXT: %[[and:.*]] = and i32 %a, 1
  227. ; CHECK-NEXT: ret i32 %[[and]]
  228. }
  229. define i32 @test30(i32 %a) {
  230. %mul = shl nuw i32 %a, 31
  231. %div = udiv i32 %mul, -2147483648
  232. ret i32 %div
  233. ; CHECK-LABEL: @test30(
  234. ; CHECK-NEXT: ret i32 %a
  235. }
  236. define <2 x i32> @test31(<2 x i32> %x) {
  237. %shr = lshr <2 x i32> %x, <i32 31, i32 31>
  238. %div = udiv <2 x i32> %shr, <i32 2147483647, i32 2147483647>
  239. ret <2 x i32> %div
  240. ; CHECK-LABEL: @test31(
  241. ; CHECK-NEXT: %[[shr:.*]] = lshr <2 x i32> %x, <i32 31, i32 31>
  242. ; CHECK-NEXT: udiv <2 x i32> %[[shr]], <i32 2147483647, i32 2147483647>
  243. ; CHECK-NEXT: ret <2 x i32>
  244. }
  245. define i32 @test32(i32 %a, i32 %b) {
  246. %shl = shl i32 2, %b
  247. %div = lshr i32 %shl, 2
  248. %div2 = udiv i32 %a, %div
  249. ret i32 %div2
  250. ; CHECK-LABEL: @test32(
  251. ; CHECK-NEXT: %[[shl:.*]] = shl i32 2, %b
  252. ; CHECK-NEXT: %[[shr:.*]] = lshr i32 %[[shl]], 2
  253. ; CHECK-NEXT: %[[div:.*]] = udiv i32 %a, %[[shr]]
  254. ; CHECK-NEXT: ret i32
  255. }
  256. define <2 x i64> @test33(<2 x i64> %x) nounwind {
  257. %shr = lshr exact <2 x i64> %x, <i64 5, i64 5>
  258. %div = udiv exact <2 x i64> %shr, <i64 6, i64 6>
  259. ret <2 x i64> %div
  260. ; CHECK-LABEL: @test33(
  261. ; CHECK-NEXT: udiv exact <2 x i64> %x, <i64 192, i64 192>
  262. ; CHECK-NEXT: ret <2 x i64>
  263. }
  264. define <2 x i64> @test34(<2 x i64> %x) nounwind {
  265. %neg = sub nsw <2 x i64> zeroinitializer, %x
  266. %div = sdiv exact <2 x i64> %neg, <i64 3, i64 4>
  267. ret <2 x i64> %div
  268. ; CHECK-LABEL: @test34(
  269. ; CHECK-NEXT: sdiv exact <2 x i64> %x, <i64 -3, i64 -4>
  270. ; CHECK-NEXT: ret <2 x i64>
  271. }
  272. define i32 @test35(i32 %A) {
  273. %and = and i32 %A, 2147483647
  274. %mul = sdiv exact i32 %and, 2147483647
  275. ret i32 %mul
  276. ; CHECK-LABEL: @test35(
  277. ; CHECK-NEXT: %[[and:.*]] = and i32 %A, 2147483647
  278. ; CHECK-NEXT: %[[udiv:.*]] = udiv exact i32 %[[and]], 2147483647
  279. ; CHECK-NEXT: ret i32 %[[udiv]]
  280. }
  281. define i32 @test36(i32 %A) {
  282. %and = and i32 %A, 2147483647
  283. %shl = shl nsw i32 1, %A
  284. %mul = sdiv exact i32 %and, %shl
  285. ret i32 %mul
  286. ; CHECK-LABEL: @test36(
  287. ; CHECK-NEXT: %[[and:.*]] = and i32 %A, 2147483647
  288. ; CHECK-NEXT: %[[shr:.*]] = lshr exact i32 %[[and]], %A
  289. ; CHECK-NEXT: ret i32 %[[shr]]
  290. }