Home | History | Annotate | Download | only in Inline
      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