call.ll 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. ; RUN: opt < %s -basicaa -slp-vectorizer -slp-threshold=-999 -dce -S -mtriple=x86_64-apple-macosx10.8.0 -mcpu=corei7-avx | FileCheck %s
  2. target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
  3. target triple = "x86_64-apple-macosx10.8.0"
  4. declare double @sin(double)
  5. declare double @cos(double)
  6. declare double @pow(double, double)
  7. declare double @exp2(double)
  8. declare i64 @round(i64)
  9. ; CHECK: sin_libm
  10. ; CHECK: call <2 x double> @llvm.sin.v2f64
  11. ; CHECK: ret void
  12. define void @sin_libm(double* %a, double* %b, double* %c) {
  13. entry:
  14. %i0 = load double, double* %a, align 8
  15. %i1 = load double, double* %b, align 8
  16. %mul = fmul double %i0, %i1
  17. %call = tail call double @sin(double %mul) nounwind readnone
  18. %arrayidx3 = getelementptr inbounds double, double* %a, i64 1
  19. %i3 = load double, double* %arrayidx3, align 8
  20. %arrayidx4 = getelementptr inbounds double, double* %b, i64 1
  21. %i4 = load double, double* %arrayidx4, align 8
  22. %mul5 = fmul double %i3, %i4
  23. %call5 = tail call double @sin(double %mul5) nounwind readnone
  24. store double %call, double* %c, align 8
  25. %arrayidx5 = getelementptr inbounds double, double* %c, i64 1
  26. store double %call5, double* %arrayidx5, align 8
  27. ret void
  28. }
  29. ; CHECK: cos_libm
  30. ; CHECK: call <2 x double> @llvm.cos.v2f64
  31. ; CHECK: ret void
  32. define void @cos_libm(double* %a, double* %b, double* %c) {
  33. entry:
  34. %i0 = load double, double* %a, align 8
  35. %i1 = load double, double* %b, align 8
  36. %mul = fmul double %i0, %i1
  37. %call = tail call double @cos(double %mul) nounwind readnone
  38. %arrayidx3 = getelementptr inbounds double, double* %a, i64 1
  39. %i3 = load double, double* %arrayidx3, align 8
  40. %arrayidx4 = getelementptr inbounds double, double* %b, i64 1
  41. %i4 = load double, double* %arrayidx4, align 8
  42. %mul5 = fmul double %i3, %i4
  43. %call5 = tail call double @cos(double %mul5) nounwind readnone
  44. store double %call, double* %c, align 8
  45. %arrayidx5 = getelementptr inbounds double, double* %c, i64 1
  46. store double %call5, double* %arrayidx5, align 8
  47. ret void
  48. }
  49. ; CHECK: pow_libm
  50. ; CHECK: call <2 x double> @llvm.pow.v2f64
  51. ; CHECK: ret void
  52. define void @pow_libm(double* %a, double* %b, double* %c) {
  53. entry:
  54. %i0 = load double, double* %a, align 8
  55. %i1 = load double, double* %b, align 8
  56. %mul = fmul double %i0, %i1
  57. %call = tail call double @pow(double %mul,double %mul) nounwind readnone
  58. %arrayidx3 = getelementptr inbounds double, double* %a, i64 1
  59. %i3 = load double, double* %arrayidx3, align 8
  60. %arrayidx4 = getelementptr inbounds double, double* %b, i64 1
  61. %i4 = load double, double* %arrayidx4, align 8
  62. %mul5 = fmul double %i3, %i4
  63. %call5 = tail call double @pow(double %mul5,double %mul5) nounwind readnone
  64. store double %call, double* %c, align 8
  65. %arrayidx5 = getelementptr inbounds double, double* %c, i64 1
  66. store double %call5, double* %arrayidx5, align 8
  67. ret void
  68. }
  69. ; CHECK: exp2_libm
  70. ; CHECK: call <2 x double> @llvm.exp2.v2f64
  71. ; CHECK: ret void
  72. define void @exp2_libm(double* %a, double* %b, double* %c) {
  73. entry:
  74. %i0 = load double, double* %a, align 8
  75. %i1 = load double, double* %b, align 8
  76. %mul = fmul double %i0, %i1
  77. %call = tail call double @exp2(double %mul) nounwind readnone
  78. %arrayidx3 = getelementptr inbounds double, double* %a, i64 1
  79. %i3 = load double, double* %arrayidx3, align 8
  80. %arrayidx4 = getelementptr inbounds double, double* %b, i64 1
  81. %i4 = load double, double* %arrayidx4, align 8
  82. %mul5 = fmul double %i3, %i4
  83. %call5 = tail call double @exp2(double %mul5) nounwind readnone
  84. store double %call, double* %c, align 8
  85. %arrayidx5 = getelementptr inbounds double, double* %c, i64 1
  86. store double %call5, double* %arrayidx5, align 8
  87. ret void
  88. }
  89. ; Negative test case
  90. ; CHECK: round_custom
  91. ; CHECK-NOT: load <4 x i64>
  92. ; CHECK: ret void
  93. define void @round_custom(i64* %a, i64* %b, i64* %c) {
  94. entry:
  95. %i0 = load i64, i64* %a, align 8
  96. %i1 = load i64, i64* %b, align 8
  97. %mul = mul i64 %i0, %i1
  98. %call = tail call i64 @round(i64 %mul) nounwind readnone
  99. %arrayidx3 = getelementptr inbounds i64, i64* %a, i64 1
  100. %i3 = load i64, i64* %arrayidx3, align 8
  101. %arrayidx4 = getelementptr inbounds i64, i64* %b, i64 1
  102. %i4 = load i64, i64* %arrayidx4, align 8
  103. %mul5 = mul i64 %i3, %i4
  104. %call5 = tail call i64 @round(i64 %mul5) nounwind readnone
  105. store i64 %call, i64* %c, align 8
  106. %arrayidx5 = getelementptr inbounds i64, i64* %c, i64 1
  107. store i64 %call5, i64* %arrayidx5, align 8
  108. ret void
  109. }
  110. ; CHECK: declare <2 x double> @llvm.sin.v2f64(<2 x double>) [[ATTR0:#[0-9]+]]
  111. ; CHECK: declare <2 x double> @llvm.cos.v2f64(<2 x double>) [[ATTR0]]
  112. ; CHECK: declare <2 x double> @llvm.pow.v2f64(<2 x double>, <2 x double>) [[ATTR0]]
  113. ; CHECK: declare <2 x double> @llvm.exp2.v2f64(<2 x double>) [[ATTR0]]
  114. ; CHECK: attributes [[ATTR0]] = { nounwind readnone }