maxnum.ll 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. ; RUN: opt -S -instcombine < %s | FileCheck %s
  2. declare float @llvm.maxnum.f32(float, float) #0
  3. declare float @llvm.maxnum.v2f32(<2 x float>, <2 x float>) #0
  4. declare <4 x float> @llvm.maxnum.v4f32(<4 x float>, <4 x float>) #0
  5. declare double @llvm.maxnum.f64(double, double) #0
  6. declare <2 x double> @llvm.maxnum.v2f64(<2 x double>, <2 x double>) #0
  7. ; CHECK-LABEL: @constant_fold_maxnum_f32
  8. ; CHECK-NEXT: ret float 2.000000e+00
  9. define float @constant_fold_maxnum_f32() #0 {
  10. %x = call float @llvm.maxnum.f32(float 1.0, float 2.0) #0
  11. ret float %x
  12. }
  13. ; CHECK-LABEL: @constant_fold_maxnum_f32_inv
  14. ; CHECK-NEXT: ret float 2.000000e+00
  15. define float @constant_fold_maxnum_f32_inv() #0 {
  16. %x = call float @llvm.maxnum.f32(float 2.0, float 1.0) #0
  17. ret float %x
  18. }
  19. ; CHECK-LABEL: @constant_fold_maxnum_f32_nan0
  20. ; CHECK-NEXT: ret float 2.000000e+00
  21. define float @constant_fold_maxnum_f32_nan0() #0 {
  22. %x = call float @llvm.maxnum.f32(float 0x7FF8000000000000, float 2.0) #0
  23. ret float %x
  24. }
  25. ; CHECK-LABEL: @constant_fold_maxnum_f32_nan1
  26. ; CHECK-NEXT: ret float 2.000000e+00
  27. define float @constant_fold_maxnum_f32_nan1() #0 {
  28. %x = call float @llvm.maxnum.f32(float 2.0, float 0x7FF8000000000000) #0
  29. ret float %x
  30. }
  31. ; CHECK-LABEL: @constant_fold_maxnum_f32_nan_nan
  32. ; CHECK-NEXT: ret float 0x7FF8000000000000
  33. define float @constant_fold_maxnum_f32_nan_nan() #0 {
  34. %x = call float @llvm.maxnum.f32(float 0x7FF8000000000000, float 0x7FF8000000000000) #0
  35. ret float %x
  36. }
  37. ; CHECK-LABEL: @constant_fold_maxnum_f32_p0_p0
  38. ; CHECK-NEXT: ret float 0.000000e+00
  39. define float @constant_fold_maxnum_f32_p0_p0() #0 {
  40. %x = call float @llvm.maxnum.f32(float 0.0, float 0.0) #0
  41. ret float %x
  42. }
  43. ; CHECK-LABEL: @constant_fold_maxnum_f32_p0_n0
  44. ; CHECK-NEXT: ret float 0.000000e+00
  45. define float @constant_fold_maxnum_f32_p0_n0() #0 {
  46. %x = call float @llvm.maxnum.f32(float 0.0, float -0.0) #0
  47. ret float %x
  48. }
  49. ; CHECK-LABEL: @constant_fold_maxnum_f32_n0_p0
  50. ; CHECK-NEXT: ret float -0.000000e+00
  51. define float @constant_fold_maxnum_f32_n0_p0() #0 {
  52. %x = call float @llvm.maxnum.f32(float -0.0, float 0.0) #0
  53. ret float %x
  54. }
  55. ; CHECK-LABEL: @constant_fold_maxnum_f32_n0_n0
  56. ; CHECK-NEXT: ret float -0.000000e+00
  57. define float @constant_fold_maxnum_f32_n0_n0() #0 {
  58. %x = call float @llvm.maxnum.f32(float -0.0, float -0.0) #0
  59. ret float %x
  60. }
  61. ; CHECK-LABEL: @constant_fold_maxnum_v4f32
  62. ; CHECK-NEXT: ret <4 x float> <float 2.000000e+00, float 8.000000e+00, float 1.000000e+01, float 9.000000e+00>
  63. define <4 x float> @constant_fold_maxnum_v4f32() #0 {
  64. %x = call <4 x float> @llvm.maxnum.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>)
  65. ret <4 x float> %x
  66. }
  67. ; CHECK-LABEL: @constant_fold_maxnum_f64
  68. ; CHECK-NEXT: ret double 2.000000e+00
  69. define double @constant_fold_maxnum_f64() #0 {
  70. %x = call double @llvm.maxnum.f64(double 1.0, double 2.0) #0
  71. ret double %x
  72. }
  73. ; CHECK-LABEL: @constant_fold_maxnum_f64_nan0
  74. ; CHECK-NEXT: ret double 2.000000e+00
  75. define double @constant_fold_maxnum_f64_nan0() #0 {
  76. %x = call double @llvm.maxnum.f64(double 0x7FF8000000000000, double 2.0) #0
  77. ret double %x
  78. }
  79. ; CHECK-LABEL: @constant_fold_maxnum_f64_nan1
  80. ; CHECK-NEXT: ret double 2.000000e+00
  81. define double @constant_fold_maxnum_f64_nan1() #0 {
  82. %x = call double @llvm.maxnum.f64(double 2.0, double 0x7FF8000000000000) #0
  83. ret double %x
  84. }
  85. ; CHECK-LABEL: @constant_fold_maxnum_f64_nan_nan
  86. ; CHECK-NEXT: ret double 0x7FF8000000000000
  87. define double @constant_fold_maxnum_f64_nan_nan() #0 {
  88. %x = call double @llvm.maxnum.f64(double 0x7FF8000000000000, double 0x7FF8000000000000) #0
  89. ret double %x
  90. }
  91. ; CHECK-LABEL: @canonicalize_constant_maxnum_f32
  92. ; CHECK: call float @llvm.maxnum.f32(float %x, float 1.000000e+00)
  93. define float @canonicalize_constant_maxnum_f32(float %x) #0 {
  94. %y = call float @llvm.maxnum.f32(float 1.0, float %x) #0
  95. ret float %y
  96. }
  97. ; CHECK-LABEL: @noop_maxnum_f32
  98. ; CHECK-NEXT: ret float %x
  99. define float @noop_maxnum_f32(float %x) #0 {
  100. %y = call float @llvm.maxnum.f32(float %x, float %x) #0
  101. ret float %y
  102. }
  103. ; CHECK-LABEL: @maxnum_f32_nan_val
  104. ; CHECK-NEXT: ret float %x
  105. define float @maxnum_f32_nan_val(float %x) #0 {
  106. %y = call float @llvm.maxnum.f32(float 0x7FF8000000000000, float %x) #0
  107. ret float %y
  108. }
  109. ; CHECK-LABEL: @maxnum_f32_val_nan
  110. ; CHECK-NEXT: ret float %x
  111. define float @maxnum_f32_val_nan(float %x) #0 {
  112. %y = call float @llvm.maxnum.f32(float %x, float 0x7FF8000000000000) #0
  113. ret float %y
  114. }
  115. ; CHECK-LABEL: @fold_maxnum_f32_undef_undef
  116. ; CHECK-NEXT: ret float undef
  117. define float @fold_maxnum_f32_undef_undef(float %x) nounwind {
  118. %val = call float @llvm.maxnum.f32(float undef, float undef) #0
  119. ret float %val
  120. }
  121. ; CHECK-LABEL: @fold_maxnum_f32_val_undef
  122. ; CHECK-NEXT: ret float %x
  123. define float @fold_maxnum_f32_val_undef(float %x) nounwind {
  124. %val = call float @llvm.maxnum.f32(float %x, float undef) #0
  125. ret float %val
  126. }
  127. ; CHECK-LABEL: @fold_maxnum_f32_undef_val
  128. ; CHECK-NEXT: ret float %x
  129. define float @fold_maxnum_f32_undef_val(float %x) nounwind {
  130. %val = call float @llvm.maxnum.f32(float undef, float %x) #0
  131. ret float %val
  132. }
  133. ; CHECK-LABEL: @maxnum_x_maxnum_x_y
  134. ; CHECK-NEXT: call float @llvm.maxnum.f32(float %x, float %y)
  135. ; CHECK-NEXT: ret float
  136. define float @maxnum_x_maxnum_x_y(float %x, float %y) #0 {
  137. %a = call float @llvm.maxnum.f32(float %x, float %y) #0
  138. %b = call float @llvm.maxnum.f32(float %x, float %a) #0
  139. ret float %b
  140. }
  141. ; CHECK-LABEL: @maxnum_y_maxnum_x_y
  142. ; CHECK-NEXT: call float @llvm.maxnum.f32(float %x, float %y)
  143. ; CHECK-NEXT: ret float
  144. define float @maxnum_y_maxnum_x_y(float %x, float %y) #0 {
  145. %a = call float @llvm.maxnum.f32(float %x, float %y) #0
  146. %b = call float @llvm.maxnum.f32(float %y, float %a) #0
  147. ret float %b
  148. }
  149. ; CHECK-LABEL: @maxnum_z_maxnum_x_y
  150. ; CHECK-NEXT: call float @llvm.maxnum.f32(float %x, float %y)
  151. ; CHECK-NEXT: call float @llvm.maxnum.f32(float %z, float %a)
  152. ; CHECK-NEXT: ret float
  153. define float @maxnum_z_maxnum_x_y(float %x, float %y, float %z) #0 {
  154. %a = call float @llvm.maxnum.f32(float %x, float %y) #0
  155. %b = call float @llvm.maxnum.f32(float %z, float %a) #0
  156. ret float %b
  157. }
  158. ; CHECK-LABEL: @maxnum_maxnum_x_y_z
  159. ; CHECK-NEXT: call float @llvm.maxnum.f32(float %x, float %y)
  160. ; CHECK-NEXT: call float @llvm.maxnum.f32(float %a, float %z)
  161. ; CHECK-NEXT: ret float
  162. define float @maxnum_maxnum_x_y_z(float %x, float %y, float %z) #0 {
  163. %a = call float @llvm.maxnum.f32(float %x, float %y) #0
  164. %b = call float @llvm.maxnum.f32(float %a, float %z) #0
  165. ret float %b
  166. }
  167. ; CHECK-LABEL: @maxnum4
  168. ; CHECK-NEXT: call float @llvm.maxnum.f32(float %x, float %y)
  169. ; CHECK-NEXT: call float @llvm.maxnum.f32(float %z, float %w)
  170. ; CHECK-NEXT: call float @llvm.maxnum.f32(float %a, float %b)
  171. ; CHECK-NEXT: ret float
  172. define float @maxnum4(float %x, float %y, float %z, float %w) #0 {
  173. %a = call float @llvm.maxnum.f32(float %x, float %y) #0
  174. %b = call float @llvm.maxnum.f32(float %z, float %w) #0
  175. %c = call float @llvm.maxnum.f32(float %a, float %b) #0
  176. ret float %c
  177. }
  178. ; CHECK-LABEL: @fold_maxnum_f32_inf_val
  179. ; CHECK-NEXT: ret float 0x7FF0000000000000
  180. define float @fold_maxnum_f32_inf_val(float %x) nounwind {
  181. %val = call float @llvm.maxnum.f32(float 0x7FF0000000000000, float %x) #0
  182. ret float %val
  183. }
  184. ; CHECK-LABEL: @fold_maxnum_f32_neginf_val
  185. ; CHECK-NEXT: call float @llvm.maxnum.f32(float %x, float 0xFFF0000000000000)
  186. ; CHECK-NEXT: ret float
  187. define float @fold_maxnum_f32_neginf_val(float %x) nounwind {
  188. %val = call float @llvm.maxnum.f32(float 0xFFF0000000000000, float %x) #0
  189. ret float %val
  190. }
  191. attributes #0 = { nounwind readnone }