inline-byval-bonus.ll 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. ; RUN: opt -S -inline -inline-threshold=275 < %s | FileCheck %s
  2. ; PR13095
  3. ; The performance of the c-ray benchmark largely depends on the inlining of a
  4. ; specific call to @ray_sphere. This test case is designed to verify that it's
  5. ; inlined at -O3.
  6. 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"
  7. target triple = "x86_64-apple-macosx10.8.0"
  8. %struct.sphere = type { %struct.vec3, double, %struct.material, %struct.sphere* }
  9. %struct.vec3 = type { double, double, double }
  10. %struct.material = type { %struct.vec3, double, double }
  11. %struct.ray = type { %struct.vec3, %struct.vec3 }
  12. %struct.spoint = type { %struct.vec3, %struct.vec3, %struct.vec3, double }
  13. define i32 @caller(%struct.sphere* %i) {
  14. %shadow_ray = alloca %struct.ray, align 8
  15. call void @fix(%struct.ray* %shadow_ray)
  16. %call = call i32 @ray_sphere(%struct.sphere* %i, %struct.ray* byval align 8 %shadow_ray, %struct.spoint* null)
  17. ret i32 %call
  18. ; CHECK-LABEL: @caller(
  19. ; CHECK-NOT: call i32 @ray_sphere
  20. ; CHECK: ret i32
  21. }
  22. declare void @fix(%struct.ray*)
  23. define i32 @ray_sphere(%struct.sphere* nocapture %sph, %struct.ray* nocapture byval align 8 %ray, %struct.spoint* %sp) nounwind uwtable ssp {
  24. %1 = getelementptr inbounds %struct.ray, %struct.ray* %ray, i64 0, i32 1, i32 0
  25. %2 = load double, double* %1, align 8
  26. %3 = fmul double %2, %2
  27. %4 = getelementptr inbounds %struct.ray, %struct.ray* %ray, i64 0, i32 1, i32 1
  28. %5 = load double, double* %4, align 8
  29. %6 = fmul double %5, %5
  30. %7 = fadd double %3, %6
  31. %8 = getelementptr inbounds %struct.ray, %struct.ray* %ray, i64 0, i32 1, i32 2
  32. %9 = load double, double* %8, align 8
  33. %10 = fmul double %9, %9
  34. %11 = fadd double %7, %10
  35. %12 = fmul double %2, 2.000000e+00
  36. %13 = getelementptr inbounds %struct.ray, %struct.ray* %ray, i64 0, i32 0, i32 0
  37. %14 = load double, double* %13, align 8
  38. %15 = getelementptr inbounds %struct.sphere, %struct.sphere* %sph, i64 0, i32 0, i32 0
  39. %16 = load double, double* %15, align 8
  40. %17 = fsub double %14, %16
  41. %18 = fmul double %12, %17
  42. %19 = fmul double %5, 2.000000e+00
  43. %20 = getelementptr inbounds %struct.ray, %struct.ray* %ray, i64 0, i32 0, i32 1
  44. %21 = load double, double* %20, align 8
  45. %22 = getelementptr inbounds %struct.sphere, %struct.sphere* %sph, i64 0, i32 0, i32 1
  46. %23 = load double, double* %22, align 8
  47. %24 = fsub double %21, %23
  48. %25 = fmul double %19, %24
  49. %26 = fadd double %18, %25
  50. %27 = fmul double %9, 2.000000e+00
  51. %28 = getelementptr inbounds %struct.ray, %struct.ray* %ray, i64 0, i32 0, i32 2
  52. %29 = load double, double* %28, align 8
  53. %30 = getelementptr inbounds %struct.sphere, %struct.sphere* %sph, i64 0, i32 0, i32 2
  54. %31 = load double, double* %30, align 8
  55. %32 = fsub double %29, %31
  56. %33 = fmul double %27, %32
  57. %34 = fadd double %26, %33
  58. %35 = fmul double %16, %16
  59. %36 = fmul double %23, %23
  60. %37 = fadd double %35, %36
  61. %38 = fmul double %31, %31
  62. %39 = fadd double %37, %38
  63. %40 = fmul double %14, %14
  64. %41 = fadd double %40, %39
  65. %42 = fmul double %21, %21
  66. %43 = fadd double %42, %41
  67. %44 = fmul double %29, %29
  68. %45 = fadd double %44, %43
  69. %46 = fsub double -0.000000e+00, %16
  70. %47 = fmul double %14, %46
  71. %48 = fmul double %21, %23
  72. %49 = fsub double %47, %48
  73. %50 = fmul double %29, %31
  74. %51 = fsub double %49, %50
  75. %52 = fmul double %51, 2.000000e+00
  76. %53 = fadd double %52, %45
  77. %54 = getelementptr inbounds %struct.sphere, %struct.sphere* %sph, i64 0, i32 1
  78. %55 = load double, double* %54, align 8
  79. %56 = fmul double %55, %55
  80. %57 = fsub double %53, %56
  81. %58 = fmul double %34, %34
  82. %59 = fmul double %11, 4.000000e+00
  83. %60 = fmul double %59, %57
  84. %61 = fsub double %58, %60
  85. %62 = fcmp olt double %61, 0.000000e+00
  86. br i1 %62, label %130, label %63
  87. ; <label>:63 ; preds = %0
  88. %64 = tail call double @sqrt(double %61) nounwind readnone
  89. %65 = fsub double -0.000000e+00, %34
  90. %66 = fsub double %64, %34
  91. %67 = fmul double %11, 2.000000e+00
  92. %68 = fdiv double %66, %67
  93. %69 = fsub double %65, %64
  94. %70 = fdiv double %69, %67
  95. %71 = fcmp olt double %68, 1.000000e-06
  96. %72 = fcmp olt double %70, 1.000000e-06
  97. %or.cond = and i1 %71, %72
  98. br i1 %or.cond, label %130, label %73
  99. ; <label>:73 ; preds = %63
  100. %74 = fcmp ogt double %68, 1.000000e+00
  101. %75 = fcmp ogt double %70, 1.000000e+00
  102. %or.cond1 = and i1 %74, %75
  103. br i1 %or.cond1, label %130, label %76
  104. ; <label>:76 ; preds = %73
  105. %77 = icmp eq %struct.spoint* %sp, null
  106. br i1 %77, label %130, label %78
  107. ; <label>:78 ; preds = %76
  108. %t1.0 = select i1 %71, double %70, double %68
  109. %t2.0 = select i1 %72, double %t1.0, double %70
  110. %79 = fcmp olt double %t1.0, %t2.0
  111. %80 = select i1 %79, double %t1.0, double %t2.0
  112. %81 = getelementptr inbounds %struct.spoint, %struct.spoint* %sp, i64 0, i32 3
  113. store double %80, double* %81, align 8
  114. %82 = fmul double %80, %2
  115. %83 = fadd double %14, %82
  116. %84 = getelementptr inbounds %struct.spoint, %struct.spoint* %sp, i64 0, i32 0, i32 0
  117. store double %83, double* %84, align 8
  118. %85 = fmul double %5, %80
  119. %86 = fadd double %21, %85
  120. %87 = getelementptr inbounds %struct.spoint, %struct.spoint* %sp, i64 0, i32 0, i32 1
  121. store double %86, double* %87, align 8
  122. %88 = fmul double %9, %80
  123. %89 = fadd double %29, %88
  124. %90 = getelementptr inbounds %struct.spoint, %struct.spoint* %sp, i64 0, i32 0, i32 2
  125. store double %89, double* %90, align 8
  126. %91 = load double, double* %15, align 8
  127. %92 = fsub double %83, %91
  128. %93 = load double, double* %54, align 8
  129. %94 = fdiv double %92, %93
  130. %95 = getelementptr inbounds %struct.spoint, %struct.spoint* %sp, i64 0, i32 1, i32 0
  131. store double %94, double* %95, align 8
  132. %96 = load double, double* %22, align 8
  133. %97 = fsub double %86, %96
  134. %98 = load double, double* %54, align 8
  135. %99 = fdiv double %97, %98
  136. %100 = getelementptr inbounds %struct.spoint, %struct.spoint* %sp, i64 0, i32 1, i32 1
  137. store double %99, double* %100, align 8
  138. %101 = load double, double* %30, align 8
  139. %102 = fsub double %89, %101
  140. %103 = load double, double* %54, align 8
  141. %104 = fdiv double %102, %103
  142. %105 = getelementptr inbounds %struct.spoint, %struct.spoint* %sp, i64 0, i32 1, i32 2
  143. store double %104, double* %105, align 8
  144. %106 = fmul double %2, %94
  145. %107 = fmul double %5, %99
  146. %108 = fadd double %106, %107
  147. %109 = fmul double %9, %104
  148. %110 = fadd double %108, %109
  149. %111 = fmul double %110, 2.000000e+00
  150. %112 = fmul double %94, %111
  151. %113 = fsub double %112, %2
  152. %114 = fsub double -0.000000e+00, %113
  153. %115 = fmul double %99, %111
  154. %116 = fsub double %115, %5
  155. %117 = fsub double -0.000000e+00, %116
  156. %118 = fmul double %104, %111
  157. %119 = fsub double %118, %9
  158. %120 = fsub double -0.000000e+00, %119
  159. %.06 = getelementptr inbounds %struct.spoint, %struct.spoint* %sp, i64 0, i32 2, i32 0
  160. %.18 = getelementptr inbounds %struct.spoint, %struct.spoint* %sp, i64 0, i32 2, i32 1
  161. %.210 = getelementptr inbounds %struct.spoint, %struct.spoint* %sp, i64 0, i32 2, i32 2
  162. %121 = fmul double %113, %113
  163. %122 = fmul double %116, %116
  164. %123 = fadd double %121, %122
  165. %124 = fmul double %119, %119
  166. %125 = fadd double %123, %124
  167. %126 = tail call double @sqrt(double %125) nounwind readnone
  168. %127 = fdiv double %114, %126
  169. store double %127, double* %.06, align 8
  170. %128 = fdiv double %117, %126
  171. store double %128, double* %.18, align 8
  172. %129 = fdiv double %120, %126
  173. store double %129, double* %.210, align 8
  174. br label %130
  175. ; <label>:130 ; preds = %78, %76, %73, %63, %0
  176. %.0 = phi i32 [ 0, %0 ], [ 0, %73 ], [ 0, %63 ], [ 1, %76 ], [ 1, %78 ]
  177. ret i32 %.0
  178. }
  179. declare double @sqrt(double) nounwind readnone