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