fast-basictest.ll 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. ; RUN: opt < %s -reassociate -gvn -instcombine -S | FileCheck %s
  2. ; With reassociation, constant folding can eliminate the 12 and -12 constants.
  3. define float @test1(float %arg) {
  4. ; CHECK-LABEL: @test1
  5. ; CHECK-NEXT: fsub fast float -0.000000e+00, %arg
  6. ; CHECK-NEXT: ret float
  7. %tmp1 = fsub fast float -1.200000e+01, %arg
  8. %tmp2 = fadd fast float %tmp1, 1.200000e+01
  9. ret float %tmp2
  10. }
  11. define float @test2(float %reg109, float %reg1111) {
  12. ; CHECK-LABEL: @test2
  13. ; CHECK-NEXT: fadd float %reg109, -3.000000e+01
  14. ; CHECK-NEXT: fadd float %reg115, %reg1111
  15. ; CHECK-NEXT: fadd float %reg116, 3.000000e+01
  16. ; CHECK-NEXT: ret float
  17. %reg115 = fadd float %reg109, -3.000000e+01
  18. %reg116 = fadd float %reg115, %reg1111
  19. %reg117 = fadd float %reg116, 3.000000e+01
  20. ret float %reg117
  21. }
  22. define float @test3(float %reg109, float %reg1111) {
  23. ; CHECK-LABEL: @test3
  24. ; CHECK-NEXT: %reg117 = fadd fast float %reg109, %reg1111
  25. ; CHECK-NEXT: ret float %reg117
  26. %reg115 = fadd fast float %reg109, -3.000000e+01
  27. %reg116 = fadd fast float %reg115, %reg1111
  28. %reg117 = fadd fast float %reg116, 3.000000e+01
  29. ret float %reg117
  30. }
  31. @fe = external global float
  32. @fa = external global float
  33. @fb = external global float
  34. @fc = external global float
  35. @ff = external global float
  36. define void @test4() {
  37. ; CHECK-LABEL: @test4
  38. ; CHECK: fadd fast float
  39. ; CHECK: fadd fast float
  40. ; CHECK-NOT: fadd fast float
  41. ; CHECK: ret void
  42. %A = load float, float* @fa
  43. %B = load float, float* @fb
  44. %C = load float, float* @fc
  45. %t1 = fadd fast float %A, %B
  46. %t2 = fadd fast float %t1, %C
  47. %t3 = fadd fast float %C, %A
  48. %t4 = fadd fast float %t3, %B
  49. ; e = (a+b)+c;
  50. store float %t2, float* @fe
  51. ; f = (a+c)+b
  52. store float %t4, float* @ff
  53. ret void
  54. }
  55. define void @test5() {
  56. ; CHECK-LABEL: @test5
  57. ; CHECK: fadd fast float
  58. ; CHECK: fadd fast float
  59. ; CHECK-NOT: fadd
  60. ; CHECK: ret void
  61. %A = load float, float* @fa
  62. %B = load float, float* @fb
  63. %C = load float, float* @fc
  64. %t1 = fadd fast float %A, %B
  65. %t2 = fadd fast float %t1, %C
  66. %t3 = fadd fast float %C, %A
  67. %t4 = fadd fast float %t3, %B
  68. ; e = c+(a+b)
  69. store float %t2, float* @fe
  70. ; f = (c+a)+b
  71. store float %t4, float* @ff
  72. ret void
  73. }
  74. define void @test6() {
  75. ; CHECK-LABEL: @test6
  76. ; CHECK: fadd fast float
  77. ; CHECK: fadd fast float
  78. ; CHECK-NOT: fadd
  79. ; CHECK: ret void
  80. %A = load float, float* @fa
  81. %B = load float, float* @fb
  82. %C = load float, float* @fc
  83. %t1 = fadd fast float %B, %A
  84. %t2 = fadd fast float %t1, %C
  85. %t3 = fadd fast float %C, %A
  86. %t4 = fadd fast float %t3, %B
  87. ; e = c+(b+a)
  88. store float %t2, float* @fe
  89. ; f = (c+a)+b
  90. store float %t4, float* @ff
  91. ret void
  92. }
  93. define float @test7(float %A, float %B, float %C) {
  94. ; CHECK-LABEL: @test7
  95. ; CHECK-NEXT: fadd fast float %C, %B
  96. ; CHECK-NEXT: fmul fast float %A, %A
  97. ; CHECK-NEXT: fmul fast float %1, %tmp2
  98. ; CHECK-NEXT: ret float
  99. %aa = fmul fast float %A, %A
  100. %aab = fmul fast float %aa, %B
  101. %ac = fmul fast float %A, %C
  102. %aac = fmul fast float %ac, %A
  103. %r = fadd fast float %aab, %aac
  104. ret float %r
  105. }
  106. define float @test8(float %X, float %Y, float %Z) {
  107. ; CHECK-LABEL: @test8
  108. ; CHECK-NEXT: fmul fast float %Y, %X
  109. ; CHECK-NEXT: fsub fast float %Z
  110. ; CHECK-NEXT: ret float
  111. %A = fsub fast float 0.0, %X
  112. %B = fmul fast float %A, %Y
  113. ; (-X)*Y + Z -> Z-X*Y
  114. %C = fadd fast float %B, %Z
  115. ret float %C
  116. }
  117. define float @test9(float %X) {
  118. ; CHECK-LABEL: @test9
  119. ; CHECK-NEXT: fmul fast float %X, 9.400000e+01
  120. ; CHECK-NEXT: ret float
  121. %Y = fmul fast float %X, 4.700000e+01
  122. %Z = fadd fast float %Y, %Y
  123. ret float %Z
  124. }
  125. define float @test10(float %X) {
  126. ; CHECK-LABEL: @test10
  127. ; CHECK-NEXT: fmul fast float %X, 3.000000e+00
  128. ; CHECK-NEXT: ret float
  129. %Y = fadd fast float %X ,%X
  130. %Z = fadd fast float %Y, %X
  131. ret float %Z
  132. }
  133. define float @test11(float %W) {
  134. ; CHECK-LABEL: test11
  135. ; CHECK-NEXT: fmul fast float %W, 3.810000e+02
  136. ; CHECK-NEXT: ret float
  137. %X = fmul fast float %W, 127.0
  138. %Y = fadd fast float %X ,%X
  139. %Z = fadd fast float %Y, %X
  140. ret float %Z
  141. }
  142. define float @test12(float %X) {
  143. ; CHECK-LABEL: @test12
  144. ; CHECK-NEXT: fmul fast float %X, -3.000000e+00
  145. ; CHECK-NEXT: fadd fast float %factor, 6.000000e+00
  146. ; CHECK-NEXT: ret float
  147. %A = fsub fast float 1.000000e+00, %X
  148. %B = fsub fast float 2.000000e+00, %X
  149. %C = fsub fast float 3.000000e+00, %X
  150. %Y = fadd fast float %A ,%B
  151. %Z = fadd fast float %Y, %C
  152. ret float %Z
  153. }
  154. define float @test13(float %X1, float %X2, float %X3) {
  155. ; CHECK-LABEL: @test13
  156. ; CHECK-NEXT: fsub fast float %X3, %X2
  157. ; CHECK-NEXT: fmul fast float {{.*}}, %X1
  158. ; CHECK-NEXT: ret float
  159. %A = fsub fast float 0.000000e+00, %X1
  160. %B = fmul fast float %A, %X2 ; -X1*X2
  161. %C = fmul fast float %X1, %X3 ; X1*X3
  162. %D = fadd fast float %B, %C ; -X1*X2 + X1*X3 -> X1*(X3-X2)
  163. ret float %D
  164. }
  165. define float @test14(float %X1, float %X2) {
  166. ; CHECK-LABEL: @test14
  167. ; CHECK-NEXT: fsub fast float %X1, %X2
  168. ; CHECK-NEXT: fmul fast float %1, 4.700000e+01
  169. ; CHECK-NEXT: ret float
  170. %B = fmul fast float %X1, 47. ; X1*47
  171. %C = fmul fast float %X2, -47. ; X2*-47
  172. %D = fadd fast float %B, %C ; X1*47 + X2*-47 -> 47*(X1-X2)
  173. ret float %D
  174. }
  175. define float @test15(float %arg) {
  176. ; CHECK-LABEL: test15
  177. ; CHECK-NEXT: fmul fast float %arg, 1.440000e+02
  178. ; CHECK-NEXT: ret float %tmp2
  179. %tmp1 = fmul fast float 1.200000e+01, %arg
  180. %tmp2 = fmul fast float %tmp1, 1.200000e+01
  181. ret float %tmp2
  182. }
  183. ; (b+(a+1234))+-a -> b+1234
  184. define float @test16(float %b, float %a) {
  185. ; CHECK-LABEL: @test16
  186. ; CHECK-NEXT: fadd fast float %b, 1.234000e+03
  187. ; CHECK-NEXT: ret float
  188. %1 = fadd fast float %a, 1234.0
  189. %2 = fadd fast float %b, %1
  190. %3 = fsub fast float 0.0, %a
  191. %4 = fadd fast float %2, %3
  192. ret float %4
  193. }
  194. ; Test that we can turn things like X*-(Y*Z) -> X*-1*Y*Z.
  195. define float @test17(float %a, float %b, float %z) {
  196. ; CHECK-LABEL: test17
  197. ; CHECK-NEXT: fmul fast float %a, 1.234500e+04
  198. ; CHECK-NEXT: fmul fast float %e, %b
  199. ; CHECK-NEXT: fmul fast float %f, %z
  200. ; CHECK-NEXT: ret float
  201. %c = fsub fast float 0.000000e+00, %z
  202. %d = fmul fast float %a, %b
  203. %e = fmul fast float %c, %d
  204. %f = fmul fast float %e, 1.234500e+04
  205. %g = fsub fast float 0.000000e+00, %f
  206. ret float %g
  207. }
  208. define float @test18(float %a, float %b, float %z) {
  209. ; CHECK-LABEL: test18
  210. ; CHECK-NEXT: fmul fast float %a, 4.000000e+01
  211. ; CHECK-NEXT: fmul fast float %e, %z
  212. ; CHECK-NEXT: ret float
  213. %d = fmul fast float %z, 4.000000e+01
  214. %c = fsub fast float 0.000000e+00, %d
  215. %e = fmul fast float %a, %c
  216. %f = fsub fast float 0.000000e+00, %e
  217. ret float %f
  218. }
  219. ; With sub reassociation, constant folding can eliminate the 12 and -12 constants.
  220. define float @test19(float %A, float %B) {
  221. ; CHECK-LABEL: @test19
  222. ; CHECK-NEXT: fsub fast float %A, %B
  223. ; CHECK-NEXT: ret float
  224. %X = fadd fast float -1.200000e+01, %A
  225. %Y = fsub fast float %X, %B
  226. %Z = fadd fast float %Y, 1.200000e+01
  227. ret float %Z
  228. }
  229. ; With sub reassociation, constant folding can eliminate the uses of %a.
  230. define float @test20(float %a, float %b, float %c) nounwind {
  231. ; CHECK-LABEL: @test20
  232. ; CHECK-NEXT: fsub fast float -0.000000e+00, %b
  233. ; CHECK-NEXT: fsub fast float %b.neg, %c
  234. ; CHECK-NEXT: ret float
  235. ; FIXME: Should be able to generate the below, which may expose more
  236. ; opportunites for FAdd reassociation.
  237. ; %sum = fadd fast float %c, %b
  238. ; %tmp7 = fsub fast float 0, %sum
  239. %tmp3 = fsub fast float %a, %b
  240. %tmp5 = fsub fast float %tmp3, %c
  241. %tmp7 = fsub fast float %tmp5, %a
  242. ret float %tmp7
  243. }