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