195 lines · plain
1; RUN: opt -S -passes=inline -inline-threshold=275 < %s | FileCheck %s2; RUN: opt -S -passes='cgscc(inline)' -inline-threshold=275 < %s | FileCheck %s3; PR130954 5; The performance of the c-ray benchmark largely depends on the inlining of a6; specific call to @ray_sphere. This test case is designed to verify that it's7; inlined at -O3.8 9target 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"10target triple = "x86_64-apple-macosx10.8.0"11 12%struct.sphere = type { %struct.vec3, double, %struct.material, ptr }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 18define i32 @caller(ptr %i) ssp {19 %shadow_ray = alloca %struct.ray, align 820 call void @fix(ptr %shadow_ray)21 22 %call = call i32 @ray_sphere(ptr %i, ptr byval(%struct.ray) align 8 %shadow_ray, ptr null)23 ret i32 %call24 25; CHECK-LABEL: @caller(26; CHECK-NOT: call i32 @ray_sphere27; CHECK: ret i3228}29 30declare void @fix(ptr)31 32define i32 @ray_sphere(ptr nocapture %sph, ptr nocapture byval(%struct.ray) align 8 %ray, ptr %sp) nounwind uwtable ssp {33 %1 = getelementptr inbounds %struct.ray, ptr %ray, i64 0, i32 1, i32 034 %2 = load double, ptr %1, align 835 %3 = fmul double %2, %236 %4 = getelementptr inbounds %struct.ray, ptr %ray, i64 0, i32 1, i32 137 %5 = load double, ptr %4, align 838 %6 = fmul double %5, %539 %7 = fadd double %3, %640 %8 = getelementptr inbounds %struct.ray, ptr %ray, i64 0, i32 1, i32 241 %9 = load double, ptr %8, align 842 %10 = fmul double %9, %943 %11 = fadd double %7, %1044 %12 = fmul double %2, 2.000000e+0045 %13 = getelementptr inbounds %struct.ray, ptr %ray, i64 0, i32 0, i32 046 %14 = load double, ptr %13, align 847 %15 = getelementptr inbounds %struct.sphere, ptr %sph, i64 0, i32 0, i32 048 %16 = load double, ptr %15, align 849 %17 = fsub double %14, %1650 %18 = fmul double %12, %1751 %19 = fmul double %5, 2.000000e+0052 %20 = getelementptr inbounds %struct.ray, ptr %ray, i64 0, i32 0, i32 153 %21 = load double, ptr %20, align 854 %22 = getelementptr inbounds %struct.sphere, ptr %sph, i64 0, i32 0, i32 155 %23 = load double, ptr %22, align 856 %24 = fsub double %21, %2357 %25 = fmul double %19, %2458 %26 = fadd double %18, %2559 %27 = fmul double %9, 2.000000e+0060 %28 = getelementptr inbounds %struct.ray, ptr %ray, i64 0, i32 0, i32 261 %29 = load double, ptr %28, align 862 %30 = getelementptr inbounds %struct.sphere, ptr %sph, i64 0, i32 0, i32 263 %31 = load double, ptr %30, align 864 %32 = fsub double %29, %3165 %33 = fmul double %27, %3266 %34 = fadd double %26, %3367 %35 = fmul double %16, %1668 %36 = fmul double %23, %2369 %37 = fadd double %35, %3670 %38 = fmul double %31, %3171 %39 = fadd double %37, %3872 %40 = fmul double %14, %1473 %41 = fadd double %40, %3974 %42 = fmul double %21, %2175 %43 = fadd double %42, %4176 %44 = fmul double %29, %2977 %45 = fadd double %44, %4378 %46 = fsub double -0.000000e+00, %1679 %47 = fmul double %14, %4680 %48 = fmul double %21, %2381 %49 = fsub double %47, %4882 %50 = fmul double %29, %3183 %51 = fsub double %49, %5084 %52 = fmul double %51, 2.000000e+0085 %53 = fadd double %52, %4586 %54 = getelementptr inbounds %struct.sphere, ptr %sph, i64 0, i32 187 %55 = load double, ptr %54, align 888 %56 = fmul double %55, %5589 %57 = fsub double %53, %5690 %58 = fmul double %34, %3491 %59 = fmul double %11, 4.000000e+0092 %60 = fmul double %59, %5793 %61 = fsub double %58, %6094 %62 = fcmp olt double %61, 0.000000e+0095 br i1 %62, label %130, label %6396 97; <label>:63 ; preds = %098 %64 = tail call double @sqrt(double %61) nounwind readnone99 %65 = fsub double -0.000000e+00, %34100 %66 = fsub double %64, %34101 %67 = fmul double %11, 2.000000e+00102 %68 = fdiv double %66, %67103 %69 = fsub double %65, %64104 %70 = fdiv double %69, %67105 %71 = fcmp olt double %68, 1.000000e-06106 %72 = fcmp olt double %70, 1.000000e-06107 %or.cond = and i1 %71, %72108 br i1 %or.cond, label %130, label %73109 110; <label>:73 ; preds = %63111 %74 = fcmp ogt double %68, 1.000000e+00112 %75 = fcmp ogt double %70, 1.000000e+00113 %or.cond1 = and i1 %74, %75114 br i1 %or.cond1, label %130, label %76115 116; <label>:76 ; preds = %73117 %77 = icmp eq ptr %sp, null118 br i1 %77, label %130, label %78119 120; <label>:78 ; preds = %76121 %t1.0 = select i1 %71, double %70, double %68122 %t2.0 = select i1 %72, double %t1.0, double %70123 %79 = fcmp olt double %t1.0, %t2.0124 %80 = select i1 %79, double %t1.0, double %t2.0125 %81 = getelementptr inbounds %struct.spoint, ptr %sp, i64 0, i32 3126 store double %80, ptr %81, align 8127 %82 = fmul double %80, %2128 %83 = fadd double %14, %82129 %84 = getelementptr inbounds %struct.spoint, ptr %sp, i64 0, i32 0, i32 0130 store double %83, ptr %84, align 8131 %85 = fmul double %5, %80132 %86 = fadd double %21, %85133 %87 = getelementptr inbounds %struct.spoint, ptr %sp, i64 0, i32 0, i32 1134 store double %86, ptr %87, align 8135 %88 = fmul double %9, %80136 %89 = fadd double %29, %88137 %90 = getelementptr inbounds %struct.spoint, ptr %sp, i64 0, i32 0, i32 2138 store double %89, ptr %90, align 8139 %91 = load double, ptr %15, align 8140 %92 = fsub double %83, %91141 %93 = load double, ptr %54, align 8142 %94 = fdiv double %92, %93143 %95 = getelementptr inbounds %struct.spoint, ptr %sp, i64 0, i32 1, i32 0144 store double %94, ptr %95, align 8145 %96 = load double, ptr %22, align 8146 %97 = fsub double %86, %96147 %98 = load double, ptr %54, align 8148 %99 = fdiv double %97, %98149 %100 = getelementptr inbounds %struct.spoint, ptr %sp, i64 0, i32 1, i32 1150 store double %99, ptr %100, align 8151 %101 = load double, ptr %30, align 8152 %102 = fsub double %89, %101153 %103 = load double, ptr %54, align 8154 %104 = fdiv double %102, %103155 %105 = getelementptr inbounds %struct.spoint, ptr %sp, i64 0, i32 1, i32 2156 store double %104, ptr %105, align 8157 %106 = fmul double %2, %94158 %107 = fmul double %5, %99159 %108 = fadd double %106, %107160 %109 = fmul double %9, %104161 %110 = fadd double %108, %109162 %111 = fmul double %110, 2.000000e+00163 %112 = fmul double %94, %111164 %113 = fsub double %112, %2165 %114 = fsub double -0.000000e+00, %113166 %115 = fmul double %99, %111167 %116 = fsub double %115, %5168 %117 = fsub double -0.000000e+00, %116169 %118 = fmul double %104, %111170 %119 = fsub double %118, %9171 %120 = fsub double -0.000000e+00, %119172 %.06 = getelementptr inbounds %struct.spoint, ptr %sp, i64 0, i32 2, i32 0173 %.18 = getelementptr inbounds %struct.spoint, ptr %sp, i64 0, i32 2, i32 1174 %.210 = getelementptr inbounds %struct.spoint, ptr %sp, i64 0, i32 2, i32 2175 %121 = fmul double %113, %113176 %122 = fmul double %116, %116177 %123 = fadd double %121, %122178 %124 = fmul double %119, %119179 %125 = fadd double %123, %124180 %126 = tail call double @sqrt(double %125) nounwind readnone181 %127 = fdiv double %114, %126182 store double %127, ptr %.06, align 8183 %128 = fdiv double %117, %126184 store double %128, ptr %.18, align 8185 %129 = fdiv double %120, %126186 store double %129, ptr %.210, align 8187 br label %130188 189; <label>:130 ; preds = %78, %76, %73, %63, %0190 %.0 = phi i32 [ 0, %0 ], [ 0, %73 ], [ 0, %63 ], [ 1, %76 ], [ 1, %78 ]191 ret i32 %.0192}193 194declare double @sqrt(double) nounwind readnone195