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