fast-math.ll 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. ; RUN: opt < %s -instsimplify -S | FileCheck %s
  2. ;; x * 0 ==> 0 when no-nans and no-signed-zero
  3. ; CHECK: mul_zero_1
  4. define float @mul_zero_1(float %a) {
  5. %b = fmul nsz nnan float %a, 0.0
  6. ; CHECK: ret float 0.0
  7. ret float %b
  8. }
  9. ; CHECK: mul_zero_2
  10. define float @mul_zero_2(float %a) {
  11. %b = fmul fast float 0.0, %a
  12. ; CHECK: ret float 0.0
  13. ret float %b
  14. }
  15. ;; x * 0 =/=> 0 when there could be nans or -0
  16. ; CHECK: no_mul_zero_1
  17. define float @no_mul_zero_1(float %a) {
  18. %b = fmul nsz float %a, 0.0
  19. ; CHECK: ret float %b
  20. ret float %b
  21. }
  22. ; CHECK: no_mul_zero_2
  23. define float @no_mul_zero_2(float %a) {
  24. %b = fmul nnan float %a, 0.0
  25. ; CHECK: ret float %b
  26. ret float %b
  27. }
  28. ; CHECK: no_mul_zero_3
  29. define float @no_mul_zero_3(float %a) {
  30. %b = fmul float %a, 0.0
  31. ; CHECK: ret float %b
  32. ret float %b
  33. }
  34. ; fadd [nnan ninf] X, (fsub [nnan ninf] 0, X) ==> 0
  35. ; where nnan and ninf have to occur at least once somewhere in this
  36. ; expression
  37. ; CHECK: fadd_fsub_0
  38. define float @fadd_fsub_0(float %a) {
  39. ; X + -X ==> 0
  40. %t1 = fsub nnan ninf float 0.0, %a
  41. %zero1 = fadd nnan ninf float %t1, %a
  42. %t2 = fsub nnan float 0.0, %a
  43. %zero2 = fadd ninf float %t2, %a
  44. %t3 = fsub nnan ninf float 0.0, %a
  45. %zero3 = fadd float %t3, %a
  46. %t4 = fsub float 0.0, %a
  47. %zero4 = fadd nnan ninf float %t4, %a
  48. ; Dont fold this
  49. ; CHECK: %nofold = fsub float 0.0
  50. %nofold = fsub float 0.0, %a
  51. ; CHECK: %no_zero = fadd nnan float %nofold, %a
  52. %no_zero = fadd nnan float %nofold, %a
  53. ; Coalesce the folded zeros
  54. %zero5 = fadd float %zero1, %zero2
  55. %zero6 = fadd float %zero3, %zero4
  56. %zero7 = fadd float %zero5, %zero6
  57. ; Should get folded
  58. %ret = fadd nsz float %no_zero, %zero7
  59. ; CHECK: ret float %no_zero
  60. ret float %ret
  61. }
  62. ; fsub nnan x, x ==> 0.0
  63. ; CHECK-LABEL: @fsub_x_x(
  64. define float @fsub_x_x(float %a) {
  65. ; X - X ==> 0
  66. %zero1 = fsub nnan float %a, %a
  67. ; Dont fold
  68. ; CHECK: %no_zero1 = fsub
  69. %no_zero1 = fsub ninf float %a, %a
  70. ; CHECK: %no_zero2 = fsub
  71. %no_zero2 = fsub float %a, %a
  72. ; CHECK: %no_zero = fadd
  73. %no_zero = fadd float %no_zero1, %no_zero2
  74. ; Should get folded
  75. %ret = fadd nsz float %no_zero, %zero1
  76. ; CHECK: ret float %no_zero
  77. ret float %ret
  78. }
  79. ; fadd nsz X, 0 ==> X
  80. ; CHECK-LABEL: @nofold_fadd_x_0(
  81. define float @nofold_fadd_x_0(float %a) {
  82. ; Dont fold
  83. ; CHECK: %no_zero1 = fadd
  84. %no_zero1 = fadd ninf float %a, 0.0
  85. ; CHECK: %no_zero2 = fadd
  86. %no_zero2 = fadd nnan float %a, 0.0
  87. ; CHECK: %no_zero = fadd
  88. %no_zero = fadd float %no_zero1, %no_zero2
  89. ; CHECK: ret float %no_zero
  90. ret float %no_zero
  91. }
  92. ; fdiv nsz nnan 0, X ==> 0
  93. define double @fdiv_zero_by_x(double %X) {
  94. ; CHECK-LABEL: @fdiv_zero_by_x(
  95. ; 0 / X -> 0
  96. %r = fdiv nnan nsz double 0.0, %X
  97. ret double %r
  98. ; CHECK: ret double 0
  99. }
  100. define float @fdiv_self(float %f) {
  101. %div = fdiv nnan float %f, %f
  102. ret float %div
  103. ; CHECK-LABEL: fdiv_self
  104. ; CHECK: ret float 1.000000e+00
  105. }
  106. define float @fdiv_self_invalid(float %f) {
  107. %div = fdiv float %f, %f
  108. ret float %div
  109. ; CHECK-LABEL: fdiv_self_invalid
  110. ; CHECK: %div = fdiv float %f, %f
  111. ; CHECK-NEXT: ret float %div
  112. }
  113. define float @fdiv_neg1(float %f) {
  114. %neg = fsub fast float -0.000000e+00, %f
  115. %div = fdiv nnan float %neg, %f
  116. ret float %div
  117. ; CHECK-LABEL: fdiv_neg1
  118. ; CHECK: ret float -1.000000e+00
  119. }
  120. define float @fdiv_neg2(float %f) {
  121. %neg = fsub fast float 0.000000e+00, %f
  122. %div = fdiv nnan float %neg, %f
  123. ret float %div
  124. ; CHECK-LABEL: fdiv_neg2
  125. ; CHECK: ret float -1.000000e+00
  126. }
  127. define float @fdiv_neg_invalid(float %f) {
  128. %neg = fsub fast float -0.000000e+00, %f
  129. %div = fdiv float %neg, %f
  130. ret float %div
  131. ; CHECK-LABEL: fdiv_neg_invalid
  132. ; CHECK: %neg = fsub fast float -0.000000e+00, %f
  133. ; CHECK-NEXT: %div = fdiv float %neg, %f
  134. ; CHECK-NEXT: ret float %div
  135. }
  136. define float @fdiv_neg_swapped1(float %f) {
  137. %neg = fsub float -0.000000e+00, %f
  138. %div = fdiv nnan float %f, %neg
  139. ret float %div
  140. ; CHECK-LABEL: fdiv_neg_swapped1
  141. ; CHECK: ret float -1.000000e+00
  142. }
  143. define float @fdiv_neg_swapped2(float %f) {
  144. %neg = fsub float 0.000000e+00, %f
  145. %div = fdiv nnan float %f, %neg
  146. ret float %div
  147. ; CHECK-LABEL: fdiv_neg_swapped2
  148. ; CHECK: ret float -1.000000e+00
  149. }