Home | History | Annotate | Download | only in BlockFrequencyInfo
      1 ; RUN: opt < %s -analyze -block-freq | FileCheck %s
      2 ; RUN: opt < %s -passes='print<block-freq>' -disable-output 2>&1 | FileCheck %s
      3 
      4 ; Function Attrs: noinline norecurse nounwind readnone uwtable
      5 define i32 @_Z11irreducibleii(i32 %iter_outer, i32 %iter_inner) local_unnamed_addr !prof !27 {
      6 entry:
      7   %cmp24 = icmp sgt i32 %iter_outer, 0
      8   br i1 %cmp24, label %for.body, label %entry.for.cond.cleanup_crit_edge, !prof !28
      9 
     10 entry.for.cond.cleanup_crit_edge:                 ; preds = %entry
     11   br label %for.cond.cleanup
     12 
     13 for.cond.cleanup:                                 ; preds = %for.end, %entry.for.cond.cleanup_crit_edge
     14   %sum.0.lcssa = phi i32 [ 0, %entry.for.cond.cleanup_crit_edge ], [ %sum.1, %for.end ]
     15   ret i32 %sum.0.lcssa
     16 
     17 for.body:                                         ; preds = %for.end, %entry
     18   %k.026 = phi i32 [ %inc12, %for.end ], [ 0, %entry ]
     19   %sum.025 = phi i32 [ %sum.1, %for.end ], [ 0, %entry ]
     20   %rem23 = and i32 %k.026, 1
     21   %cmp1 = icmp eq i32 %rem23, 0
     22   br i1 %cmp1, label %entry8, label %for.cond2, !prof !29
     23 
     24 for.cond2:                                        ; preds = %if.end9, %for.body
     25   %sum.1 = phi i32 [ %add10, %if.end9 ], [ %sum.025, %for.body ]
     26   %i.0 = phi i32 [ %inc, %if.end9 ], [ 0, %for.body ]
     27   %cmp3 = icmp slt i32 %i.0, %iter_inner
     28   br i1 %cmp3, label %for.body4, label %for.end, !prof !30, !irr_loop !31
     29 
     30 for.body4:                                        ; preds = %for.cond2
     31   %rem5 = srem i32 %k.026, 3
     32   %cmp6 = icmp eq i32 %rem5, 0
     33   br i1 %cmp6, label %entry8, label %if.end9, !prof !32
     34 
     35 entry8:                                           ; preds = %for.body4, %for.body
     36   %sum.2 = phi i32 [ %sum.025, %for.body ], [ %sum.1, %for.body4 ]
     37   %i.1 = phi i32 [ 0, %for.body ], [ %i.0, %for.body4 ]
     38   %add = add nsw i32 %sum.2, 4
     39   br label %if.end9, !irr_loop !33
     40 
     41 if.end9:                                          ; preds = %entry8, %for.body4
     42   %sum.3 = phi i32 [ %add, %entry8 ], [ %sum.1, %for.body4 ]
     43   %i.2 = phi i32 [ %i.1, %entry8 ], [ %i.0, %for.body4 ]
     44   %add10 = add nsw i32 %sum.3, 1
     45   %inc = add nsw i32 %i.2, 1
     46   br label %for.cond2, !irr_loop !34
     47 
     48 for.end:                                          ; preds = %for.cond2
     49   %inc12 = add nuw nsw i32 %k.026, 1
     50   %exitcond = icmp eq i32 %inc12, %iter_outer
     51   br i1 %exitcond, label %for.cond.cleanup, label %for.body, !prof !35
     52 }
     53 
     54 !27 = !{!"function_entry_count", i64 1}
     55 !28 = !{!"branch_weights", i32 1, i32 0}
     56 !29 = !{!"branch_weights", i32 50, i32 50}
     57 !30 = !{!"branch_weights", i32 950, i32 100}
     58 !31 = !{!"loop_header_weight", i64 1050}
     59 !32 = !{!"branch_weights", i32 323, i32 627}
     60 !33 = !{!"loop_header_weight", i64 373}
     61 !34 = !{!"loop_header_weight", i64 1000}
     62 !35 = !{!"branch_weights", i32 1, i32 99}
     63 
     64 ; CHECK-LABEL: Printing analysis {{.*}} for function '_Z11irreducibleii':
     65 ; CHECK-NEXT: block-frequency-info: _Z11irreducibleii
     66 ; CHECK-NEXT: - entry: {{.*}} count = 1
     67 ; CHECK-NEXT: - entry.for.cond.cleanup_crit_edge: {{.*}} count = 0
     68 ; CHECK-NEXT: - for.cond.cleanup: {{.*}} count = 1
     69 ; CHECK-NEXT: - for.body: {{.*}} count = 100
     70 ; CHECK-NEXT: - for.cond2: {{.*}} count = 1050, irr_loop_header_weight = 1050
     71 ; CHECK-NEXT: - for.body4: {{.*}} count = 950
     72 ; CHECK-NEXT: - entry8: {{.*}} count = 373, irr_loop_header_weight = 373
     73 ; CHECK-NEXT: - if.end9: {{.*}} count = 1000, irr_loop_header_weight = 1000
     74 ; CHECK-NEXT: - for.end: {{.*}} count = 100
     75 
     76 @targets = local_unnamed_addr global [256 x i8*] zeroinitializer, align 16
     77 @tracing = local_unnamed_addr global i32 0, align 4
     78 
     79 ; Function Attrs: noinline norecurse nounwind uwtable
     80 define i32 @_Z11irreduciblePh(i8* nocapture readonly %p) !prof !27 {
     81 entry:
     82   %0 = load i32, i32* @tracing, align 4
     83   %1 = trunc i32 %0 to i8
     84   %tobool = icmp eq i32 %0, 0
     85   br label %for.cond1
     86 
     87 for.cond1:                                        ; preds = %sw.default, %entry
     88   br label %dispatch_op
     89 
     90 dispatch_op:                                      ; preds = %sw.bb6, %for.cond1
     91   switch i8 %1, label %sw.default [
     92     i8 0, label %sw.bb
     93     i8 1, label %dispatch_op.sw.bb6_crit_edge
     94     i8 2, label %sw.bb15
     95   ], !prof !36
     96 
     97 dispatch_op.sw.bb6_crit_edge:                     ; preds = %dispatch_op
     98   br label %sw.bb6
     99 
    100 sw.bb:                                            ; preds = %indirectgoto, %dispatch_op
    101   br label %exit
    102 
    103 TARGET_1:                                         ; preds = %indirectgoto
    104   br label %sw.bb6
    105 
    106 sw.bb6:                                           ; preds = %TARGET_1, %dispatch_op.sw.bb6_crit_edge
    107   br i1 %tobool, label %dispatch_op, label %if.then, !prof !37, !irr_loop !38
    108 
    109 if.then:                                          ; preds = %sw.bb6
    110   br label %indirectgoto
    111 
    112 TARGET_2:                                         ; preds = %indirectgoto
    113   br label %sw.bb15
    114 
    115 sw.bb15:                                          ; preds = %TARGET_2, %dispatch_op
    116   br i1 %tobool, label %if.then18, label %exit, !prof !39, !irr_loop !40
    117 
    118 if.then18:                                        ; preds = %sw.bb15
    119   br label %indirectgoto
    120 
    121 unknown_op:                                       ; preds = %indirectgoto
    122   br label %sw.default
    123 
    124 sw.default:                                       ; preds = %unknown_op, %dispatch_op
    125   br label %for.cond1
    126 
    127 exit:                                             ; preds = %sw.bb15, %sw.bb
    128   ret i32 0
    129 
    130 indirectgoto:                                     ; preds = %if.then18, %if.then
    131   %idxprom21 = zext i32 %0 to i64
    132   %arrayidx22 = getelementptr inbounds [256 x i8*], [256 x i8*]* @targets, i64 0, i64 %idxprom21
    133   %target = load i8*, i8** %arrayidx22, align 8
    134   indirectbr i8* %target, [label %unknown_op, label %sw.bb, label %TARGET_1, label %TARGET_2], !prof !41, !irr_loop !42
    135 }
    136 
    137 !36 = !{!"branch_weights", i32 0, i32 0, i32 201, i32 1}
    138 !37 = !{!"branch_weights", i32 201, i32 300}
    139 !38 = !{!"loop_header_weight", i64 501}
    140 !39 = !{!"branch_weights", i32 100, i32 0}
    141 !40 = !{!"loop_header_weight", i64 100}
    142 !41 = !{!"branch_weights", i32 0, i32 1, i32 300, i32 99}
    143 !42 = !{!"loop_header_weight", i64 400}
    144 
    145 ; CHECK-LABEL: Printing analysis {{.*}} for function '_Z11irreduciblePh':
    146 ; CHECK-NEXT: block-frequency-info: _Z11irreduciblePh
    147 ; CHECK-NEXT: - entry: {{.*}} count = 1
    148 ; CHECK-NEXT: - for.cond1: {{.*}} count = 1
    149 ; CHECK-NEXT: - dispatch_op: {{.*}} count = 201
    150 ; CHECK-NEXT: - dispatch_op.sw.bb6_crit_edge: {{.*}} count = 200
    151 ; CHECK-NEXT: - sw.bb: {{.*}} count = 0
    152 ; CHECK-NEXT: - TARGET_1: {{.*}} count = 299
    153 ; CHECK-NEXT: - sw.bb6: {{.*}} count = 500, irr_loop_header_weight = 501
    154 ; CHECK-NEXT: - if.then: {{.*}} count = 299
    155 ; CHECK-NEXT: - TARGET_2: {{.*}} count = 98
    156 ; CHECK-NEXT: - sw.bb15: {{.*}} count = 99, irr_loop_header_weight = 100
    157 ; CHECK-NEXT: - if.then18: {{.*}} count = 99
    158 ; CHECK-NEXT: - unknown_op: {{.*}} count = 0
    159 ; CHECK-NEXT: - sw.default: {{.*}} count = 0
    160 ; CHECK-NEXT: - exit: {{.*}} count = 1
    161 ; CHECK-NEXT: - indirectgoto: {{.*}} count = 399, irr_loop_header_weight = 400
    162 
    163 ; Missing some irr loop annotations.
    164 ; Function Attrs: noinline norecurse nounwind uwtable
    165 define i32 @_Z11irreduciblePh2(i8* nocapture readonly %p) !prof !27 {
    166 entry:
    167   %0 = load i32, i32* @tracing, align 4
    168   %1 = trunc i32 %0 to i8
    169   %tobool = icmp eq i32 %0, 0
    170   br label %for.cond1
    171 
    172 for.cond1:                                        ; preds = %sw.default, %entry
    173   br label %dispatch_op
    174 
    175 dispatch_op:                                      ; preds = %sw.bb6, %for.cond1
    176 switch i8 %1, label %sw.default [
    177     i8 0, label %sw.bb
    178     i8 1, label %dispatch_op.sw.bb6_crit_edge
    179     i8 2, label %sw.bb15
    180   ], !prof !36
    181 
    182 dispatch_op.sw.bb6_crit_edge:                     ; preds = %dispatch_op
    183   br label %sw.bb6
    184 
    185 sw.bb:                                            ; preds = %indirectgoto, %dispatch_op
    186   br label %exit
    187 
    188 TARGET_1:                                         ; preds = %indirectgoto
    189   br label %sw.bb6
    190 
    191 sw.bb6:                                           ; preds = %TARGET_1, %dispatch_op.sw.bb6_crit_edge
    192   br i1 %tobool, label %dispatch_op, label %if.then, !prof !37  ; Missing !irr_loop !38
    193 
    194 if.then:                                          ; preds = %sw.bb6
    195   br label %indirectgoto
    196 
    197 TARGET_2:                                         ; preds = %indirectgoto
    198   br label %sw.bb15
    199 
    200 sw.bb15:                                          ; preds = %TARGET_2, %dispatch_op
    201   br i1 %tobool, label %if.then18, label %exit, !prof !39, !irr_loop !40
    202 
    203 if.then18:                                        ; preds = %sw.bb15
    204   br label %indirectgoto
    205 
    206 unknown_op:                                       ; preds = %indirectgoto
    207   br label %sw.default
    208 
    209 sw.default:                                       ; preds = %unknown_op, %dispatch_op
    210   br label %for.cond1
    211 
    212 exit:                                             ; preds = %sw.bb15, %sw.bb
    213   ret i32 0
    214 
    215 indirectgoto:                                     ; preds = %if.then18, %if.then
    216   %idxprom21 = zext i32 %0 to i64
    217   %arrayidx22 = getelementptr inbounds [256 x i8*], [256 x i8*]* @targets, i64 0, i64 %idxprom21
    218   %target = load i8*, i8** %arrayidx22, align 8
    219   indirectbr i8* %target, [label %unknown_op, label %sw.bb, label %TARGET_1, label %TARGET_2], !prof !41, !irr_loop !42
    220 }
    221 
    222 ; CHECK-LABEL: Printing analysis {{.*}} for function '_Z11irreduciblePh2':
    223 ; CHECK: block-frequency-info: _Z11irreduciblePh2
    224 ; CHECK: - sw.bb6: {{.*}} count = 100
    225 ; CHECK: - sw.bb15: {{.*}} count = 100, irr_loop_header_weight = 100
    226 ; CHECK: - indirectgoto: {{.*}} count = 400, irr_loop_header_weight = 400
    227