fabs.ll 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. ; RUN: opt < %s -instcombine -S | FileCheck %s
  2. ; Make sure all library calls are eliminated when the input is known positive.
  3. declare float @fabsf(float)
  4. declare double @fabs(double)
  5. declare fp128 @fabsl(fp128)
  6. define float @square_fabs_call_f32(float %x) {
  7. %mul = fmul float %x, %x
  8. %fabsf = tail call float @fabsf(float %mul)
  9. ret float %fabsf
  10. ; CHECK-LABEL: square_fabs_call_f32(
  11. ; CHECK-NEXT: %mul = fmul float %x, %x
  12. ; CHECK-NEXT: ret float %mul
  13. }
  14. define double @square_fabs_call_f64(double %x) {
  15. %mul = fmul double %x, %x
  16. %fabs = tail call double @fabs(double %mul)
  17. ret double %fabs
  18. ; CHECK-LABEL: square_fabs_call_f64(
  19. ; CHECK-NEXT: %mul = fmul double %x, %x
  20. ; CHECK-NEXT: ret double %mul
  21. }
  22. define fp128 @square_fabs_call_f128(fp128 %x) {
  23. %mul = fmul fp128 %x, %x
  24. %fabsl = tail call fp128 @fabsl(fp128 %mul)
  25. ret fp128 %fabsl
  26. ; CHECK-LABEL: square_fabs_call_f128(
  27. ; CHECK-NEXT: %mul = fmul fp128 %x, %x
  28. ; CHECK-NEXT: ret fp128 %mul
  29. }
  30. ; Make sure all intrinsic calls are eliminated when the input is known positive.
  31. declare float @llvm.fabs.f32(float)
  32. declare double @llvm.fabs.f64(double)
  33. declare fp128 @llvm.fabs.f128(fp128)
  34. define float @square_fabs_intrinsic_f32(float %x) {
  35. %mul = fmul float %x, %x
  36. %fabsf = tail call float @llvm.fabs.f32(float %mul)
  37. ret float %fabsf
  38. ; CHECK-LABEL: square_fabs_intrinsic_f32(
  39. ; CHECK-NEXT: %mul = fmul float %x, %x
  40. ; CHECK-NEXT: ret float %mul
  41. }
  42. define double @square_fabs_intrinsic_f64(double %x) {
  43. %mul = fmul double %x, %x
  44. %fabs = tail call double @llvm.fabs.f64(double %mul)
  45. ret double %fabs
  46. ; CHECK-LABEL: square_fabs_intrinsic_f64(
  47. ; CHECK-NEXT: %mul = fmul double %x, %x
  48. ; CHECK-NEXT: ret double %mul
  49. }
  50. define fp128 @square_fabs_intrinsic_f128(fp128 %x) {
  51. %mul = fmul fp128 %x, %x
  52. %fabsl = tail call fp128 @llvm.fabs.f128(fp128 %mul)
  53. ret fp128 %fabsl
  54. ; CHECK-LABEL: square_fabs_intrinsic_f128(
  55. ; CHECK-NEXT: %mul = fmul fp128 %x, %x
  56. ; CHECK-NEXT: ret fp128 %mul
  57. }
  58. ; Shrinking a library call to a smaller type should not be inhibited by nor inhibit the square optimization.
  59. define float @square_fabs_shrink_call1(float %x) {
  60. %ext = fpext float %x to double
  61. %sq = fmul double %ext, %ext
  62. %fabs = call double @fabs(double %sq)
  63. %trunc = fptrunc double %fabs to float
  64. ret float %trunc
  65. ; CHECK-LABEL: square_fabs_shrink_call1(
  66. ; CHECK-NEXT: %trunc = fmul float %x, %x
  67. ; CHECK-NEXT: ret float %trunc
  68. }
  69. define float @square_fabs_shrink_call2(float %x) {
  70. %sq = fmul float %x, %x
  71. %ext = fpext float %sq to double
  72. %fabs = call double @fabs(double %ext)
  73. %trunc = fptrunc double %fabs to float
  74. ret float %trunc
  75. ; CHECK-LABEL: square_fabs_shrink_call2(
  76. ; CHECK-NEXT: %sq = fmul float %x, %x
  77. ; CHECK-NEXT: ret float %sq
  78. }