minnum.ll 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. ; RUN: opt -S -instcombine < %s | FileCheck %s
  2. declare float @llvm.minnum.f32(float, float) #0
  3. declare float @llvm.minnum.v2f32(<2 x float>, <2 x float>) #0
  4. declare <4 x float> @llvm.minnum.v4f32(<4 x float>, <4 x float>) #0
  5. declare double @llvm.minnum.f64(double, double) #0
  6. declare <2 x double> @llvm.minnum.v2f64(<2 x double>, <2 x double>) #0
  7. declare float @llvm.maxnum.f32(float, float) #0
  8. ; CHECK-LABEL: @constant_fold_minnum_f32
  9. ; CHECK-NEXT: ret float 1.000000e+00
  10. define float @constant_fold_minnum_f32() #0 {
  11. %x = call float @llvm.minnum.f32(float 1.0, float 2.0) #0
  12. ret float %x
  13. }
  14. ; CHECK-LABEL: @constant_fold_minnum_f32_inv
  15. ; CHECK-NEXT: ret float 1.000000e+00
  16. define float @constant_fold_minnum_f32_inv() #0 {
  17. %x = call float @llvm.minnum.f32(float 2.0, float 1.0) #0
  18. ret float %x
  19. }
  20. ; CHECK-LABEL: @constant_fold_minnum_f32_nan0
  21. ; CHECK-NEXT: ret float 2.000000e+00
  22. define float @constant_fold_minnum_f32_nan0() #0 {
  23. %x = call float @llvm.minnum.f32(float 0x7FF8000000000000, float 2.0) #0
  24. ret float %x
  25. }
  26. ; CHECK-LABEL: @constant_fold_minnum_f32_nan1
  27. ; CHECK-NEXT: ret float 2.000000e+00
  28. define float @constant_fold_minnum_f32_nan1() #0 {
  29. %x = call float @llvm.minnum.f32(float 2.0, float 0x7FF8000000000000) #0
  30. ret float %x
  31. }
  32. ; CHECK-LABEL: @constant_fold_minnum_f32_nan_nan
  33. ; CHECK-NEXT: ret float 0x7FF8000000000000
  34. define float @constant_fold_minnum_f32_nan_nan() #0 {
  35. %x = call float @llvm.minnum.f32(float 0x7FF8000000000000, float 0x7FF8000000000000) #0
  36. ret float %x
  37. }
  38. ; CHECK-LABEL: @constant_fold_minnum_f32_p0_p0
  39. ; CHECK-NEXT: ret float 0.000000e+00
  40. define float @constant_fold_minnum_f32_p0_p0() #0 {
  41. %x = call float @llvm.minnum.f32(float 0.0, float 0.0) #0
  42. ret float %x
  43. }
  44. ; CHECK-LABEL: @constant_fold_minnum_f32_p0_n0
  45. ; CHECK-NEXT: ret float 0.000000e+00
  46. define float @constant_fold_minnum_f32_p0_n0() #0 {
  47. %x = call float @llvm.minnum.f32(float 0.0, float -0.0) #0
  48. ret float %x
  49. }
  50. ; CHECK-LABEL: @constant_fold_minnum_f32_n0_p0
  51. ; CHECK-NEXT: ret float -0.000000e+00
  52. define float @constant_fold_minnum_f32_n0_p0() #0 {
  53. %x = call float @llvm.minnum.f32(float -0.0, float 0.0) #0
  54. ret float %x
  55. }
  56. ; CHECK-LABEL: @constant_fold_minnum_f32_n0_n0
  57. ; CHECK-NEXT: ret float -0.000000e+00
  58. define float @constant_fold_minnum_f32_n0_n0() #0 {
  59. %x = call float @llvm.minnum.f32(float -0.0, float -0.0) #0
  60. ret float %x
  61. }
  62. ; CHECK-LABEL: @constant_fold_minnum_v4f32
  63. ; CHECK-NEXT: ret <4 x float> <float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 5.000000e+00>
  64. define <4 x float> @constant_fold_minnum_v4f32() #0 {
  65. %x = call <4 x float> @llvm.minnum.v4f32(<4 x float> <float 1.0, float 8.0, float 3.0, float 9.0>, <4 x float> <float 2.0, float 2.0, float 10.0, float 5.0>)
  66. ret <4 x float> %x
  67. }
  68. ; CHECK-LABEL: @constant_fold_minnum_f64
  69. ; CHECK-NEXT: ret double 1.000000e+00
  70. define double @constant_fold_minnum_f64() #0 {
  71. %x = call double @llvm.minnum.f64(double 1.0, double 2.0) #0
  72. ret double %x
  73. }
  74. ; CHECK-LABEL: @constant_fold_minnum_f64_nan0
  75. ; CHECK-NEXT: ret double 2.000000e+00
  76. define double @constant_fold_minnum_f64_nan0() #0 {
  77. %x = call double @llvm.minnum.f64(double 0x7FF8000000000000, double 2.0) #0
  78. ret double %x
  79. }
  80. ; CHECK-LABEL: @constant_fold_minnum_f64_nan1
  81. ; CHECK-NEXT: ret double 2.000000e+00
  82. define double @constant_fold_minnum_f64_nan1() #0 {
  83. %x = call double @llvm.minnum.f64(double 2.0, double 0x7FF8000000000000) #0
  84. ret double %x
  85. }
  86. ; CHECK-LABEL: @constant_fold_minnum_f64_nan_nan
  87. ; CHECK-NEXT: ret double 0x7FF8000000000000
  88. define double @constant_fold_minnum_f64_nan_nan() #0 {
  89. %x = call double @llvm.minnum.f64(double 0x7FF8000000000000, double 0x7FF8000000000000) #0
  90. ret double %x
  91. }
  92. ; CHECK-LABEL: @canonicalize_constant_minnum_f32
  93. ; CHECK: call float @llvm.minnum.f32(float %x, float 1.000000e+00)
  94. define float @canonicalize_constant_minnum_f32(float %x) #0 {
  95. %y = call float @llvm.minnum.f32(float 1.0, float %x) #0
  96. ret float %y
  97. }
  98. ; CHECK-LABEL: @noop_minnum_f32
  99. ; CHECK-NEXT: ret float %x
  100. define float @noop_minnum_f32(float %x) #0 {
  101. %y = call float @llvm.minnum.f32(float %x, float %x) #0
  102. ret float %y
  103. }
  104. ; CHECK-LABEL: @minnum_f32_nan_val
  105. ; CHECK-NEXT: ret float %x
  106. define float @minnum_f32_nan_val(float %x) #0 {
  107. %y = call float @llvm.minnum.f32(float 0x7FF8000000000000, float %x) #0
  108. ret float %y
  109. }
  110. ; CHECK-LABEL: @minnum_f32_val_nan
  111. ; CHECK-NEXT: ret float %x
  112. define float @minnum_f32_val_nan(float %x) #0 {
  113. %y = call float @llvm.minnum.f32(float %x, float 0x7FF8000000000000) #0
  114. ret float %y
  115. }
  116. ; CHECK-LABEL: @fold_minnum_f32_undef_undef
  117. ; CHECK-NEXT: ret float undef
  118. define float @fold_minnum_f32_undef_undef(float %x) nounwind {
  119. %val = call float @llvm.minnum.f32(float undef, float undef) #0
  120. ret float %val
  121. }
  122. ; CHECK-LABEL: @fold_minnum_f32_val_undef
  123. ; CHECK-NEXT: ret float %x
  124. define float @fold_minnum_f32_val_undef(float %x) nounwind {
  125. %val = call float @llvm.minnum.f32(float %x, float undef) #0
  126. ret float %val
  127. }
  128. ; CHECK-LABEL: @fold_minnum_f32_undef_val
  129. ; CHECK-NEXT: ret float %x
  130. define float @fold_minnum_f32_undef_val(float %x) nounwind {
  131. %val = call float @llvm.minnum.f32(float undef, float %x) #0
  132. ret float %val
  133. }
  134. ; CHECK-LABEL: @minnum_x_minnum_x_y
  135. ; CHECK-NEXT: call float @llvm.minnum.f32(float %x, float %y)
  136. ; CHECK-NEXT: ret float
  137. define float @minnum_x_minnum_x_y(float %x, float %y) #0 {
  138. %a = call float @llvm.minnum.f32(float %x, float %y) #0
  139. %b = call float @llvm.minnum.f32(float %x, float %a) #0
  140. ret float %b
  141. }
  142. ; CHECK-LABEL: @minnum_y_minnum_x_y
  143. ; CHECK-NEXT: call float @llvm.minnum.f32(float %x, float %y)
  144. ; CHECK-NEXT: ret float
  145. define float @minnum_y_minnum_x_y(float %x, float %y) #0 {
  146. %a = call float @llvm.minnum.f32(float %x, float %y) #0
  147. %b = call float @llvm.minnum.f32(float %y, float %a) #0
  148. ret float %b
  149. }
  150. ; CHECK-LABEL: @minnum_z_minnum_x_y
  151. ; CHECK-NEXT: call float @llvm.minnum.f32(float %x, float %y)
  152. ; CHECK-NEXT: call float @llvm.minnum.f32(float %z, float %a)
  153. ; CHECK-NEXT: ret float
  154. define float @minnum_z_minnum_x_y(float %x, float %y, float %z) #0 {
  155. %a = call float @llvm.minnum.f32(float %x, float %y) #0
  156. %b = call float @llvm.minnum.f32(float %z, float %a) #0
  157. ret float %b
  158. }
  159. ; CHECK-LABEL: @minnum_minnum_x_y_z
  160. ; CHECK-NEXT: call float @llvm.minnum.f32(float %x, float %y)
  161. ; CHECK-NEXT: call float @llvm.minnum.f32(float %a, float %z)
  162. ; CHECK-NEXT: ret float
  163. define float @minnum_minnum_x_y_z(float %x, float %y, float %z) #0 {
  164. %a = call float @llvm.minnum.f32(float %x, float %y) #0
  165. %b = call float @llvm.minnum.f32(float %a, float %z) #0
  166. ret float %b
  167. }
  168. ; CHECK-LABEL: @minnum4
  169. ; CHECK-NEXT: call float @llvm.minnum.f32(float %x, float %y)
  170. ; CHECK-NEXT: call float @llvm.minnum.f32(float %z, float %w)
  171. ; CHECK-NEXT: call float @llvm.minnum.f32(float %a, float %b)
  172. ; CHECK-NEXT: ret float
  173. define float @minnum4(float %x, float %y, float %z, float %w) #0 {
  174. %a = call float @llvm.minnum.f32(float %x, float %y) #0
  175. %b = call float @llvm.minnum.f32(float %z, float %w) #0
  176. %c = call float @llvm.minnum.f32(float %a, float %b) #0
  177. ret float %c
  178. }
  179. ; CHECK-LABEL: @minnum_x_maxnum_x_y
  180. ; CHECK-NEXT: call float @llvm.maxnum.f32
  181. ; CHECK-NEXT: call float @llvm.minnum.f32
  182. ; CHECK-NEXT: ret float
  183. define float @minnum_x_maxnum_x_y(float %x, float %y) #0 {
  184. %a = call float @llvm.maxnum.f32(float %x, float %y) #0
  185. %b = call float @llvm.minnum.f32(float %x, float %a) #0
  186. ret float %b
  187. }
  188. ; CHECK-LABEL: @maxnum_x_minnum_x_y
  189. ; CHECK-NEXT: call float @llvm.minnum.f32
  190. ; CHECK-NEXT: call float @llvm.maxnum.f32
  191. ; CHECK-NEXT: ret float
  192. define float @maxnum_x_minnum_x_y(float %x, float %y) #0 {
  193. %a = call float @llvm.minnum.f32(float %x, float %y) #0
  194. %b = call float @llvm.maxnum.f32(float %x, float %a) #0
  195. ret float %b
  196. }
  197. ; CHECK-LABEL: @fold_minnum_f32_inf_val
  198. ; CHECK-NEXT: call float @llvm.minnum.f32(float %x, float 0x7FF0000000000000)
  199. ; CHECK-NEXT: ret float
  200. define float @fold_minnum_f32_inf_val(float %x) nounwind {
  201. %val = call float @llvm.minnum.f32(float 0x7FF0000000000000, float %x) #0
  202. ret float %val
  203. }
  204. ; CHECK-LABEL: @fold_minnum_f32_minf_val
  205. ; CHECK-NEXT: ret float 0xFFF0000000000000
  206. define float @fold_minnum_f32_minf_val(float %x) nounwind {
  207. %val = call float @llvm.minnum.f32(float 0xFFF0000000000000, float %x) #0
  208. ret float %val
  209. }
  210. attributes #0 = { nounwind readnone }