sincospi.ll 4.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. ; RUN: opt -instcombine -S < %s -mtriple=x86_64-apple-macosx10.9 | FileCheck %s --check-prefix=CHECK-FLOAT-IN-VEC
  2. ; RUN: opt -instcombine -S < %s -mtriple=arm-apple-ios7.0 | FileCheck %s
  3. ; RUN: opt -instcombine -S < %s -mtriple=arm64-apple-ios7.0 | FileCheck %s
  4. ; RUN: opt -instcombine -S < %s -mtriple=x86_64-apple-macosx10.8 | FileCheck %s --check-prefix=CHECK-NO-SINCOS
  5. ; RUN: opt -instcombine -S < %s -mtriple=arm-apple-ios6.0 | FileCheck %s --check-prefix=CHECK-NO-SINCOS
  6. ; RUN: opt -instcombine -S < %s -mtriple=x86_64-none-linux-gnu | FileCheck %s --check-prefix=CHECK-NO-SINCOS
  7. attributes #0 = { readnone nounwind }
  8. declare float @__sinpif(float %x) #0
  9. declare float @__cospif(float %x) #0
  10. declare double @__sinpi(double %x) #0
  11. declare double @__cospi(double %x) #0
  12. @var32 = global float 0.0
  13. @var64 = global double 0.0
  14. define float @test_instbased_f32() {
  15. %val = load float, float* @var32
  16. %sin = call float @__sinpif(float %val) #0
  17. %cos = call float @__cospif(float %val) #0
  18. %res = fadd float %sin, %cos
  19. ret float %res
  20. ; CHECK-FLOAT-IN-VEC: [[VAL:%[a-z0-9]+]] = load float, float* @var32
  21. ; CHECK-FLOAT-IN-VEC: [[SINCOS:%[a-z0-9]+]] = call <2 x float> @__sincospif_stret(float [[VAL]])
  22. ; CHECK-FLOAT-IN-VEC: extractelement <2 x float> [[SINCOS]], i32 0
  23. ; CHECK-FLOAT-IN-VEC: extractelement <2 x float> [[SINCOS]], i32 1
  24. ; CHECK: [[VAL:%[a-z0-9]+]] = load float, float* @var32
  25. ; CHECK: [[SINCOS:%[a-z0-9]+]] = call { float, float } @__sincospif_stret(float [[VAL]])
  26. ; CHECK: extractvalue { float, float } [[SINCOS]], 0
  27. ; CHECK: extractvalue { float, float } [[SINCOS]], 1
  28. ; CHECK-NO-SINCOS: call float @__sinpif
  29. ; CHECK-NO-SINCOS: call float @__cospif
  30. }
  31. define float @test_constant_f32() {
  32. %sin = call float @__sinpif(float 1.0) #0
  33. %cos = call float @__cospif(float 1.0) #0
  34. %res = fadd float %sin, %cos
  35. ret float %res
  36. ; CHECK-FLOAT-IN-VEC: [[SINCOS:%[a-z0-9]+]] = call <2 x float> @__sincospif_stret(float 1.000000e+00)
  37. ; CHECK-FLOAT-IN-VEC: extractelement <2 x float> [[SINCOS]], i32 0
  38. ; CHECK-FLOAT-IN-VEC: extractelement <2 x float> [[SINCOS]], i32 1
  39. ; CHECK: [[SINCOS:%[a-z0-9]+]] = call { float, float } @__sincospif_stret(float 1.000000e+00)
  40. ; CHECK: extractvalue { float, float } [[SINCOS]], 0
  41. ; CHECK: extractvalue { float, float } [[SINCOS]], 1
  42. ; CHECK-NO-SINCOS: call float @__sinpif
  43. ; CHECK-NO-SINCOS: call float @__cospif
  44. }
  45. define double @test_instbased_f64() {
  46. %val = load double, double* @var64
  47. %sin = call double @__sinpi(double %val) #0
  48. %cos = call double @__cospi(double %val) #0
  49. %res = fadd double %sin, %cos
  50. ret double %res
  51. ; CHECK-FLOAT-IN-VEC: [[VAL:%[a-z0-9]+]] = load double, double* @var64
  52. ; CHECK-FLOAT-IN-VEC: [[SINCOS:%[a-z0-9]+]] = call { double, double } @__sincospi_stret(double [[VAL]])
  53. ; CHECK-FLOAT-IN-VEC: extractvalue { double, double } [[SINCOS]], 0
  54. ; CHECK-FLOAT-IN-VEC: extractvalue { double, double } [[SINCOS]], 1
  55. ; CHECK: [[VAL:%[a-z0-9]+]] = load double, double* @var64
  56. ; CHECK: [[SINCOS:%[a-z0-9]+]] = call { double, double } @__sincospi_stret(double [[VAL]])
  57. ; CHECK: extractvalue { double, double } [[SINCOS]], 0
  58. ; CHECK: extractvalue { double, double } [[SINCOS]], 1
  59. ; CHECK-NO-SINCOS: call double @__sinpi
  60. ; CHECK-NO-SINCOS: call double @__cospi
  61. }
  62. define double @test_constant_f64() {
  63. %sin = call double @__sinpi(double 1.0) #0
  64. %cos = call double @__cospi(double 1.0) #0
  65. %res = fadd double %sin, %cos
  66. ret double %res
  67. ; CHECK-FLOAT-IN-VEC: [[SINCOS:%[a-z0-9]+]] = call { double, double } @__sincospi_stret(double 1.000000e+00)
  68. ; CHECK-FLOAT-IN-VEC: extractvalue { double, double } [[SINCOS]], 0
  69. ; CHECK-FLOAT-IN-VEC: extractvalue { double, double } [[SINCOS]], 1
  70. ; CHECK: [[SINCOS:%[a-z0-9]+]] = call { double, double } @__sincospi_stret(double 1.000000e+00)
  71. ; CHECK: extractvalue { double, double } [[SINCOS]], 0
  72. ; CHECK: extractvalue { double, double } [[SINCOS]], 1
  73. ; CHECK-NO-SINCOS: call double @__sinpi
  74. ; CHECK-NO-SINCOS: call double @__cospi
  75. }