exp2-1.ll 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. ; Test that the exp2 library call simplifier works correctly.
  2. ;
  3. ; RUN: opt < %s -instcombine -S | FileCheck %s
  4. ; RUN: opt < %s -instcombine -S -mtriple=i386-pc-win32 | FileCheck %s -check-prefix=CHECK-WIN
  5. target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
  6. declare double @exp2(double)
  7. declare float @exp2f(float)
  8. ; Check exp2(sitofp(x)) -> ldexp(1.0, sext(x)).
  9. define double @test_simplify1(i32 %x) {
  10. ; CHECK-LABEL: @test_simplify1(
  11. %conv = sitofp i32 %x to double
  12. %ret = call double @exp2(double %conv)
  13. ; CHECK: call double @ldexp
  14. ret double %ret
  15. }
  16. define double @test_simplify2(i16 signext %x) {
  17. ; CHECK-LABEL: @test_simplify2(
  18. %conv = sitofp i16 %x to double
  19. %ret = call double @exp2(double %conv)
  20. ; CHECK: call double @ldexp
  21. ret double %ret
  22. }
  23. define double @test_simplify3(i8 signext %x) {
  24. ; CHECK-LABEL: @test_simplify3(
  25. %conv = sitofp i8 %x to double
  26. %ret = call double @exp2(double %conv)
  27. ; CHECK: call double @ldexp
  28. ret double %ret
  29. }
  30. define float @test_simplify4(i32 %x) {
  31. ; CHECK-LABEL: @test_simplify4(
  32. %conv = sitofp i32 %x to float
  33. %ret = call float @exp2f(float %conv)
  34. ; CHECK: call float @ldexpf
  35. ret float %ret
  36. }
  37. ; Check exp2(uitofp(x)) -> ldexp(1.0, zext(x)).
  38. define double @test_no_simplify1(i32 %x) {
  39. ; CHECK-LABEL: @test_no_simplify1(
  40. %conv = uitofp i32 %x to double
  41. %ret = call double @exp2(double %conv)
  42. ; CHECK: call double @exp2
  43. ret double %ret
  44. }
  45. define double @test_simplify6(i16 zeroext %x) {
  46. ; CHECK-LABEL: @test_simplify6(
  47. %conv = uitofp i16 %x to double
  48. %ret = call double @exp2(double %conv)
  49. ; CHECK: call double @ldexp
  50. ret double %ret
  51. }
  52. define double @test_simplify7(i8 zeroext %x) {
  53. ; CHECK-LABEL: @test_simplify7(
  54. %conv = uitofp i8 %x to double
  55. %ret = call double @exp2(double %conv)
  56. ; CHECK: call double @ldexp
  57. ret double %ret
  58. }
  59. define float @test_simplify8(i8 zeroext %x) {
  60. ; CHECK-LABEL: @test_simplify8(
  61. %conv = uitofp i8 %x to float
  62. %ret = call float @exp2f(float %conv)
  63. ; CHECK: call float @ldexpf
  64. ret float %ret
  65. }
  66. declare double @llvm.exp2.f64(double)
  67. declare float @llvm.exp2.f32(float)
  68. define double @test_simplify9(i8 zeroext %x) {
  69. ; CHECK-LABEL: @test_simplify9(
  70. ; CHECK-WIN-LABEL: @test_simplify9(
  71. %conv = uitofp i8 %x to double
  72. %ret = call double @llvm.exp2.f64(double %conv)
  73. ; CHECK: call double @ldexp
  74. ; CHECK-WIN: call double @ldexp
  75. ret double %ret
  76. }
  77. define float @test_simplify10(i8 zeroext %x) {
  78. ; CHECK-LABEL: @test_simplify10(
  79. ; CHECK-WIN-LABEL: @test_simplify10(
  80. %conv = uitofp i8 %x to float
  81. %ret = call float @llvm.exp2.f32(float %conv)
  82. ; CHECK: call float @ldexpf
  83. ; CHECK-WIN-NOT: call float @ldexpf
  84. ret float %ret
  85. }