Home | History | Annotate | Download | only in Profiling
      1 ; RUN: opt -insert-edge-profiling -o %t1 < %s
      2 ; RUN: rm -f %t1.prof_data
      3 ; RUN: lli %defaultjit -load %llvmshlibdir/libprofile_rt%shlibext %t1 \
      4 ; RUN:     -llvmprof-output %t1.prof_data
      5 ; RUN: opt -profile-file %t1.prof_data -profile-metadata-loader -S -o - < %s \
      6 ; RUN:     | FileCheck %s
      7 ; RUN: rm -f %t1.prof_data
      8 
      9 ; FIXME: profile_rt.dll could be built on win32.
     10 ; REQUIRES: loadable_module
     11 
     12 ;; func_for - Test branch probabilities for a vanilla for loop.
     13 define i32 @func_for(i32 %N) nounwind uwtable {
     14 entry:
     15   %N.addr = alloca i32, align 4
     16   %ret = alloca i32, align 4
     17   %loop = alloca i32, align 4
     18   store i32 %N, i32* %N.addr, align 4
     19   store i32 0, i32* %ret, align 4
     20   store i32 0, i32* %loop, align 4
     21   br label %for.cond
     22 
     23 for.cond:
     24   %0 = load i32* %loop, align 4
     25   %1 = load i32* %N.addr, align 4
     26   %cmp = icmp slt i32 %0, %1
     27   br i1 %cmp, label %for.body, label %for.end
     28 ; CHECK: br i1 %cmp, label %for.body, label %for.end, !prof !0
     29 
     30 for.body:
     31   %2 = load i32* %N.addr, align 4
     32   %3 = load i32* %ret, align 4
     33   %add = add nsw i32 %3, %2
     34   store i32 %add, i32* %ret, align 4
     35   br label %for.inc
     36 
     37 for.inc:
     38   %4 = load i32* %loop, align 4
     39   %inc = add nsw i32 %4, 1
     40   store i32 %inc, i32* %loop, align 4
     41   br label %for.cond
     42 
     43 for.end:
     44   %5 = load i32* %ret, align 4
     45   ret i32 %5
     46 }
     47 
     48 ;; func_for_odd - Test branch probabilities for a for loop with a continue and
     49 ;; a break.
     50 define i32 @func_for_odd(i32 %N) nounwind uwtable {
     51 entry:
     52   %N.addr = alloca i32, align 4
     53   %ret = alloca i32, align 4
     54   %loop = alloca i32, align 4
     55   store i32 %N, i32* %N.addr, align 4
     56   store i32 0, i32* %ret, align 4
     57   store i32 0, i32* %loop, align 4
     58   br label %for.cond
     59 
     60 for.cond:
     61   %0 = load i32* %loop, align 4
     62   %1 = load i32* %N.addr, align 4
     63   %cmp = icmp slt i32 %0, %1
     64   br i1 %cmp, label %for.body, label %for.end
     65 ; CHECK: br i1 %cmp, label %for.body, label %for.end, !prof !1
     66 
     67 for.body:
     68   %2 = load i32* %loop, align 4
     69   %rem = srem i32 %2, 10
     70   %tobool = icmp ne i32 %rem, 0
     71   br i1 %tobool, label %if.then, label %if.end
     72 ; CHECK: br i1 %tobool, label %if.then, label %if.end, !prof !2
     73 
     74 if.then:
     75   br label %for.inc
     76 
     77 if.end:
     78   %3 = load i32* %loop, align 4
     79   %cmp1 = icmp eq i32 %3, 500
     80   br i1 %cmp1, label %if.then2, label %if.end3
     81 ; CHECK: br i1 %cmp1, label %if.then2, label %if.end3, !prof !3
     82 
     83 if.then2:
     84   br label %for.end
     85 
     86 if.end3:
     87   %4 = load i32* %N.addr, align 4
     88   %5 = load i32* %ret, align 4
     89   %add = add nsw i32 %5, %4
     90   store i32 %add, i32* %ret, align 4
     91   br label %for.inc
     92 
     93 for.inc:
     94   %6 = load i32* %loop, align 4
     95   %inc = add nsw i32 %6, 1
     96   store i32 %inc, i32* %loop, align 4
     97   br label %for.cond
     98 
     99 for.end:
    100   %7 = load i32* %ret, align 4
    101   ret i32 %7
    102 }
    103 
    104 ;; func_while - Test branch probability in a vanilla while loop.
    105 define i32 @func_while(i32 %N) nounwind uwtable {
    106 entry:
    107   %N.addr = alloca i32, align 4
    108   %ret = alloca i32, align 4
    109   %loop = alloca i32, align 4
    110   store i32 %N, i32* %N.addr, align 4
    111   store i32 0, i32* %ret, align 4
    112   store i32 0, i32* %loop, align 4
    113   br label %while.cond
    114 
    115 while.cond:
    116   %0 = load i32* %loop, align 4
    117   %1 = load i32* %N.addr, align 4
    118   %cmp = icmp slt i32 %0, %1
    119   br i1 %cmp, label %while.body, label %while.end
    120 ; CHECK: br i1 %cmp, label %while.body, label %while.end, !prof !0
    121 
    122 while.body:
    123   %2 = load i32* %N.addr, align 4
    124   %3 = load i32* %ret, align 4
    125   %add = add nsw i32 %3, %2
    126   store i32 %add, i32* %ret, align 4
    127   %4 = load i32* %loop, align 4
    128   %inc = add nsw i32 %4, 1
    129   store i32 %inc, i32* %loop, align 4
    130   br label %while.cond
    131 
    132 while.end:
    133   %5 = load i32* %ret, align 4
    134   ret i32 %5
    135 }
    136 
    137 ;; func_while - Test branch probability in a vanilla do-while loop.
    138 define i32 @func_do_while(i32 %N) nounwind uwtable {
    139 entry:
    140   %N.addr = alloca i32, align 4
    141   %ret = alloca i32, align 4
    142   %loop = alloca i32, align 4
    143   store i32 %N, i32* %N.addr, align 4
    144   store i32 0, i32* %ret, align 4
    145   store i32 0, i32* %loop, align 4
    146   br label %do.body
    147 
    148 do.body:
    149   %0 = load i32* %N.addr, align 4
    150   %1 = load i32* %ret, align 4
    151   %add = add nsw i32 %1, %0
    152   store i32 %add, i32* %ret, align 4
    153   %2 = load i32* %loop, align 4
    154   %inc = add nsw i32 %2, 1
    155   store i32 %inc, i32* %loop, align 4
    156   br label %do.cond
    157 
    158 do.cond:
    159   %3 = load i32* %loop, align 4
    160   %4 = load i32* %N.addr, align 4
    161   %cmp = icmp slt i32 %3, %4
    162   br i1 %cmp, label %do.body, label %do.end
    163 ; CHECK: br i1 %cmp, label %do.body, label %do.end, !prof !4
    164 
    165 do.end:
    166   %5 = load i32* %ret, align 4
    167   ret i32 %5
    168 }
    169 
    170 define i32 @main(i32 %argc, i8** %argv) nounwind uwtable {
    171 entry:
    172   %retval = alloca i32, align 4
    173   %argc.addr = alloca i32, align 4
    174   %argv.addr = alloca i8**, align 8
    175   store i32 0, i32* %retval
    176   %call = call i32 @func_for(i32 1000)
    177   %call1 = call i32 @func_for_odd(i32 1000)
    178   %call2 = call i32 @func_while(i32 1000)
    179   %call3 = call i32 @func_do_while(i32 1000)
    180   ret i32 0
    181 }
    182 
    183 !0 = metadata !{metadata !"branch_weights", i32 1000, i32 1}
    184 !1 = metadata !{metadata !"branch_weights", i32 501, i32 0}
    185 !2 = metadata !{metadata !"branch_weights", i32 450, i32 51}
    186 !3 = metadata !{metadata !"branch_weights", i32 1, i32 50}
    187 !4 = metadata !{metadata !"branch_weights", i32 999, i32 1}
    188 ; CHECK-NOT: !5
    189