mul.ll 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. ; This test makes sure that mul instructions are properly eliminated.
  2. ; RUN: opt < %s -instcombine -S | FileCheck %s
  3. define i32 @test1(i32 %A) {
  4. ; CHECK-LABEL: @test1(
  5. %B = mul i32 %A, 1 ; <i32> [#uses=1]
  6. ret i32 %B
  7. ; CHECK: ret i32 %A
  8. }
  9. define i32 @test2(i32 %A) {
  10. ; CHECK-LABEL: @test2(
  11. ; Should convert to an add instruction
  12. %B = mul i32 %A, 2 ; <i32> [#uses=1]
  13. ret i32 %B
  14. ; CHECK: shl i32 %A, 1
  15. }
  16. define i32 @test3(i32 %A) {
  17. ; CHECK-LABEL: @test3(
  18. ; This should disappear entirely
  19. %B = mul i32 %A, 0 ; <i32> [#uses=1]
  20. ret i32 %B
  21. ; CHECK: ret i32 0
  22. }
  23. define double @test4(double %A) {
  24. ; CHECK-LABEL: @test4(
  25. ; This is safe for FP
  26. %B = fmul double 1.000000e+00, %A ; <double> [#uses=1]
  27. ret double %B
  28. ; CHECK: ret double %A
  29. }
  30. define i32 @test5(i32 %A) {
  31. ; CHECK-LABEL: @test5(
  32. %B = mul i32 %A, 8 ; <i32> [#uses=1]
  33. ret i32 %B
  34. ; CHECK: shl i32 %A, 3
  35. }
  36. define i8 @test6(i8 %A) {
  37. ; CHECK-LABEL: @test6(
  38. %B = mul i8 %A, 8 ; <i8> [#uses=1]
  39. %C = mul i8 %B, 8 ; <i8> [#uses=1]
  40. ret i8 %C
  41. ; CHECK: shl i8 %A, 6
  42. }
  43. define i32 @test7(i32 %i) {
  44. ; CHECK-LABEL: @test7(
  45. %tmp = mul i32 %i, -1 ; <i32> [#uses=1]
  46. ret i32 %tmp
  47. ; CHECK: sub i32 0, %i
  48. }
  49. define i64 @test8(i64 %i) {
  50. ; CHECK-LABEL: @test8(
  51. %j = mul i64 %i, -1 ; <i64> [#uses=1]
  52. ret i64 %j
  53. ; CHECK: sub i64 0, %i
  54. }
  55. define i32 @test9(i32 %i) {
  56. ; CHECK-LABEL: @test9(
  57. %j = mul i32 %i, -1 ; <i32> [#uses=1]
  58. ret i32 %j
  59. ; CHECK: sub i32 0, %i
  60. }
  61. define i32 @test10(i32 %a, i32 %b) {
  62. ; CHECK-LABEL: @test10(
  63. %c = icmp slt i32 %a, 0 ; <i1> [#uses=1]
  64. %d = zext i1 %c to i32 ; <i32> [#uses=1]
  65. ; e = b & (a >> 31)
  66. %e = mul i32 %d, %b ; <i32> [#uses=1]
  67. ret i32 %e
  68. ; CHECK: [[TEST10:%.*]] = ashr i32 %a, 31
  69. ; CHECK-NEXT: %e = and i32 [[TEST10]], %b
  70. ; CHECK-NEXT: ret i32 %e
  71. }
  72. define i32 @test11(i32 %a, i32 %b) {
  73. ; CHECK-LABEL: @test11(
  74. %c = icmp sle i32 %a, -1 ; <i1> [#uses=1]
  75. %d = zext i1 %c to i32 ; <i32> [#uses=1]
  76. ; e = b & (a >> 31)
  77. %e = mul i32 %d, %b ; <i32> [#uses=1]
  78. ret i32 %e
  79. ; CHECK: [[TEST11:%.*]] = ashr i32 %a, 31
  80. ; CHECK-NEXT: %e = and i32 [[TEST11]], %b
  81. ; CHECK-NEXT: ret i32 %e
  82. }
  83. define i32 @test12(i32 %a, i32 %b) {
  84. ; CHECK-LABEL: @test12(
  85. %c = icmp ugt i32 %a, 2147483647 ; <i1> [#uses=1]
  86. %d = zext i1 %c to i32 ; <i32> [#uses=1]
  87. %e = mul i32 %d, %b ; <i32> [#uses=1]
  88. ret i32 %e
  89. ; CHECK: [[TEST12:%.*]] = ashr i32 %a, 31
  90. ; CHECK-NEXT: %e = and i32 [[TEST12]], %b
  91. ; CHECK-NEXT: ret i32 %e
  92. }
  93. ; PR2642
  94. define internal void @test13(<4 x float>*) {
  95. ; CHECK-LABEL: @test13(
  96. load <4 x float>, <4 x float>* %0, align 1
  97. fmul <4 x float> %2, < float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00 >
  98. store <4 x float> %3, <4 x float>* %0, align 1
  99. ret void
  100. ; CHECK-NEXT: ret void
  101. }
  102. define <16 x i8> @test14(<16 x i8> %a) {
  103. ; CHECK-LABEL: @test14(
  104. %b = mul <16 x i8> %a, zeroinitializer
  105. ret <16 x i8> %b
  106. ; CHECK-NEXT: ret <16 x i8> zeroinitializer
  107. }
  108. ; rdar://7293527
  109. define i32 @test15(i32 %A, i32 %B) {
  110. ; CHECK-LABEL: @test15(
  111. entry:
  112. %shl = shl i32 1, %B
  113. %m = mul i32 %shl, %A
  114. ret i32 %m
  115. ; CHECK: shl i32 %A, %B
  116. }
  117. ; X * Y (when Y is 0 or 1) --> x & (0-Y)
  118. define i32 @test16(i32 %b, i1 %c) {
  119. ; CHECK-LABEL: @test16(
  120. %d = zext i1 %c to i32 ; <i32> [#uses=1]
  121. ; e = b & (a >> 31)
  122. %e = mul i32 %d, %b ; <i32> [#uses=1]
  123. ret i32 %e
  124. ; CHECK: [[TEST16:%.*]] = select i1 %c, i32 %b, i32 0
  125. ; CHECK-NEXT: ret i32 [[TEST16]]
  126. }
  127. ; X * Y (when Y is 0 or 1) --> x & (0-Y)
  128. define i32 @test17(i32 %a, i32 %b) {
  129. ; CHECK-LABEL: @test17(
  130. %a.lobit = lshr i32 %a, 31
  131. %e = mul i32 %a.lobit, %b
  132. ret i32 %e
  133. ; CHECK: [[TEST17:%.*]] = ashr i32 %a, 31
  134. ; CHECK-NEXT: %e = and i32 [[TEST17]], %b
  135. ; CHECK-NEXT: ret i32 %e
  136. }
  137. define i32 @test18(i32 %A, i32 %B) {
  138. ; CHECK-LABEL: @test18(
  139. %C = and i32 %A, 1
  140. %D = and i32 %B, 1
  141. %E = mul i32 %C, %D
  142. %F = and i32 %E, 16
  143. ret i32 %F
  144. ; CHECK-NEXT: ret i32 0
  145. }
  146. declare {i32, i1} @llvm.smul.with.overflow.i32(i32, i32)
  147. declare void @use(i1)
  148. define i32 @test19(i32 %A, i32 %B) {
  149. ; CHECK-LABEL: @test19(
  150. %C = and i32 %A, 1
  151. %D = and i32 %B, 1
  152. ; It would be nice if we also started proving that this doesn't overflow.
  153. %E = call {i32, i1} @llvm.smul.with.overflow.i32(i32 %C, i32 %D)
  154. %F = extractvalue {i32, i1} %E, 0
  155. %G = extractvalue {i32, i1} %E, 1
  156. call void @use(i1 %G)
  157. %H = and i32 %F, 16
  158. ret i32 %H
  159. ; CHECK: ret i32 0
  160. }
  161. define <2 x i64> @test20(<2 x i64> %A) {
  162. ; CHECK-LABEL: @test20(
  163. %B = add <2 x i64> %A, <i64 12, i64 14>
  164. %C = mul <2 x i64> %B, <i64 3, i64 2>
  165. ret <2 x i64> %C
  166. ; CHECK: mul <2 x i64> %A, <i64 3, i64 2>
  167. ; CHECK: add <2 x i64> %{{.}}, <i64 36, i64 28>
  168. }
  169. define <2 x i1> @test21(<2 x i1> %A, <2 x i1> %B) {
  170. ; CHECK-LABEL: @test21(
  171. %C = mul <2 x i1> %A, %B
  172. ret <2 x i1> %C
  173. ; CHECK: %C = and <2 x i1> %A, %B
  174. }
  175. define i32 @test22(i32 %A) {
  176. ; CHECK-LABEL: @test22(
  177. %B = mul nsw i32 %A, -1
  178. ret i32 %B
  179. ; CHECK: sub nsw i32 0, %A
  180. }
  181. define i32 @test23(i32 %A) {
  182. ; CHECK-LABEL: @test23(
  183. %B = shl nuw i32 %A, 1
  184. %C = mul nuw i32 %B, 3
  185. ret i32 %C
  186. ; CHECK: mul nuw i32 %A, 6
  187. }
  188. define i32 @test24(i32 %A) {
  189. ; CHECK-LABEL: @test24(
  190. %B = shl nsw i32 %A, 1
  191. %C = mul nsw i32 %B, 3
  192. ret i32 %C
  193. ; CHECK: mul nsw i32 %A, 6
  194. }
  195. define i32 @test25(i32 %A, i32 %B) {
  196. ; CHECK-LABEL: @test25(
  197. %C = sub nsw i32 0, %A
  198. %D = sub nsw i32 0, %B
  199. %E = mul nsw i32 %C, %D
  200. ret i32 %E
  201. ; CHECK: mul nsw i32 %A, %B
  202. }
  203. define i32 @test26(i32 %A, i32 %B) {
  204. ; CHECK-LABEL: @test26(
  205. %C = shl nsw i32 1, %B
  206. %D = mul nsw i32 %A, %C
  207. ret i32 %D
  208. ; CHECK: shl nsw i32 %A, %B
  209. }
  210. define i32 @test27(i32 %A, i32 %B) {
  211. ; CHECK-LABEL: @test27(
  212. %C = shl i32 1, %B
  213. %D = mul nuw i32 %A, %C
  214. ret i32 %D
  215. ; CHECK: shl nuw i32 %A, %B
  216. }
  217. define i32 @test28(i32 %A) {
  218. ; CHECK-LABEL: @test28(
  219. %B = shl i32 1, %A
  220. %C = mul nsw i32 %B, %B
  221. ret i32 %C
  222. ; CHECK: %[[shl1:.*]] = shl i32 1, %A
  223. ; CHECK-NEXT: %[[shl2:.*]] = shl i32 %[[shl1]], %A
  224. ; CHECK-NEXT: ret i32 %[[shl2]]
  225. }
  226. define i64 @test29(i31 %A, i31 %B) {
  227. ; CHECK-LABEL: @test29(
  228. %C = sext i31 %A to i64
  229. %D = sext i31 %B to i64
  230. %E = mul i64 %C, %D
  231. ret i64 %E
  232. ; CHECK: %[[sext1:.*]] = sext i31 %A to i64
  233. ; CHECK-NEXT: %[[sext2:.*]] = sext i31 %B to i64
  234. ; CHECK-NEXT: %[[mul:.*]] = mul nsw i64 %[[sext1]], %[[sext2]]
  235. ; CHECK-NEXT: ret i64 %[[mul]]
  236. }
  237. define i64 @test30(i32 %A, i32 %B) {
  238. ; CHECK-LABEL: @test30(
  239. %C = zext i32 %A to i64
  240. %D = zext i32 %B to i64
  241. %E = mul i64 %C, %D
  242. ret i64 %E
  243. ; CHECK: %[[zext1:.*]] = zext i32 %A to i64
  244. ; CHECK-NEXT: %[[zext2:.*]] = zext i32 %B to i64
  245. ; CHECK-NEXT: %[[mul:.*]] = mul nuw i64 %[[zext1]], %[[zext2]]
  246. ; CHECK-NEXT: ret i64 %[[mul]]
  247. }
  248. @PR22087 = external global i32
  249. define i32 @test31(i32 %V) {
  250. ; CHECK-LABEL: @test31
  251. %mul = mul i32 %V, shl (i32 1, i32 zext (i1 icmp ne (i32* inttoptr (i64 1 to i32*), i32* @PR22087) to i32))
  252. ret i32 %mul
  253. ; CHECK: %[[mul:.*]] = shl i32 %V, zext (i1 icmp ne (i32* inttoptr (i64 1 to i32*), i32* @PR22087) to i32)
  254. ; CHECK-NEXT: ret i32 %[[mul]]
  255. }
  256. define i32 @test32(i32 %X) {
  257. ; CHECK-LABEL: @test32
  258. %mul = mul nsw i32 %X, -2147483648
  259. ret i32 %mul
  260. ; CHECK: %[[shl:.*]] = shl i32 %X, 31
  261. ; CHECK-NEXT: ret i32 %[[shl]]
  262. }
  263. define i32 @test33(i32 %X) {
  264. ; CHECK-LABEL: @test33
  265. %mul = mul nsw i32 %X, 1073741824
  266. ; CHECK: %[[shl:.*]] = shl nsw i32 %X, 30
  267. ; CHECK-NEXT: ret i32 %[[shl]]
  268. ret i32 %mul
  269. }