Home | History | Annotate | Download | only in PGOProfile
      1 ; RUN: llvm-profdata merge %S/Inputs/irreducible.proftext -o %t.profdata
      2 ; RUN: opt < %s -pgo-instr-use -pgo-test-profile-file=%t.profdata -S | FileCheck %s --check-prefix=USE
      3 ; RUN: opt < %s -passes=pgo-instr-use -pgo-test-profile-file=%t.profdata -S | FileCheck %s --check-prefix=USE
      4 
      5 ; GEN: $__llvm_profile_raw_version = comdat any
      6 
      7 ; Function Attrs: noinline norecurse nounwind readnone uwtable
      8 define i32 @_Z11irreducibleii(i32 %iter_outer, i32 %iter_inner) local_unnamed_addr #0 {
      9 entry:
     10   %cmp24 = icmp sgt i32 %iter_outer, 0
     11   br i1 %cmp24, label %for.body, label %entry.for.cond.cleanup_crit_edge
     12 
     13 entry.for.cond.cleanup_crit_edge:                 ; preds = %entry
     14   br label %for.cond.cleanup
     15 
     16 for.cond.cleanup:                                 ; preds = %entry.for.cond.cleanup_crit_edge, %for.end
     17   %sum.0.lcssa = phi i32 [ 0, %entry.for.cond.cleanup_crit_edge ], [ %sum.1, %for.end ]
     18   ret i32 %sum.0.lcssa
     19 
     20 for.body:                                         ; preds = %entry, %for.end
     21   %k.026 = phi i32 [ %inc12, %for.end ], [ 0, %entry ]
     22   %sum.025 = phi i32 [ %sum.1, %for.end ], [ 0, %entry ]
     23   %rem23 = and i32 %k.026, 1
     24   %cmp1 = icmp eq i32 %rem23, 0
     25   br i1 %cmp1, label %entry8, label %for.cond2
     26 
     27 for.cond2:                                        ; preds = %for.body, %if.end9
     28   %sum.1 = phi i32 [ %add10, %if.end9 ], [ %sum.025, %for.body ]
     29   %i.0 = phi i32 [ %inc, %if.end9 ], [ 0, %for.body ]
     30   %cmp3 = icmp slt i32 %i.0, %iter_inner
     31   br i1 %cmp3, label %for.body4, label %for.end
     32 ; USE: br i1 %cmp3, label %for.body4, label %for.end, !prof !{{[0-9]+}},
     33 ; USE-SAME: !irr_loop ![[FOR_COND2_IRR_LOOP:[0-9]+]]
     34 
     35 for.body4:                                        ; preds = %for.cond2
     36   %rem5 = srem i32 %k.026, 3
     37   %cmp6 = icmp eq i32 %rem5, 0
     38   br i1 %cmp6, label %entry8, label %if.end9
     39 
     40 entry8:                                           ; preds = %for.body4, %for.body
     41   %sum.2 = phi i32 [ %sum.025, %for.body ], [ %sum.1, %for.body4 ]
     42   %i.1 = phi i32 [ 0, %for.body ], [ %i.0, %for.body4 ]
     43   %add = add nsw i32 %sum.2, 4
     44   br label %if.end9
     45 ; USE: br label %if.end9,
     46 ; USE-SAME: !irr_loop ![[ENTRY8_IRR_LOOP:[0-9]+]]
     47 
     48 if.end9:                                          ; preds = %entry8, %for.body4
     49   %sum.3 = phi i32 [ %add, %entry8 ], [ %sum.1, %for.body4 ]
     50   %i.2 = phi i32 [ %i.1, %entry8 ], [ %i.0, %for.body4 ]
     51   %add10 = add nsw i32 %sum.3, 1
     52   %inc = add nsw i32 %i.2, 1
     53   br label %for.cond2
     54 ; USE: br label %for.cond2,
     55 ; USE-SAME: !irr_loop ![[IF_END9_IRR_LOOP:[0-9]+]]
     56 
     57 for.end:                                          ; preds = %for.cond2
     58   %inc12 = add nuw nsw i32 %k.026, 1
     59   %exitcond = icmp eq i32 %inc12, %iter_outer
     60   br i1 %exitcond, label %for.cond.cleanup, label %for.body
     61 }
     62 
     63 
     64 
     65 @targets = local_unnamed_addr global [256 x i8*] zeroinitializer, align 16
     66 @tracing = local_unnamed_addr global i32 0, align 4
     67 
     68 ; Function Attrs: noinline norecurse nounwind uwtable
     69 define i32 @_Z11irreduciblePh(i8* nocapture readonly %p) {
     70 entry:
     71   %0 = load i32, i32* @tracing, align 4
     72   %1 = trunc i32 %0 to i8
     73   %tobool = icmp eq i32 %0, 0
     74   br label %for.cond1
     75 
     76 for.cond1:                                        ; preds = %sw.default, %entry
     77   br label %dispatch_op
     78 
     79 dispatch_op:                                      ; preds = %sw.bb6, %for.cond1
     80   switch i8 %1, label %sw.default [
     81     i8 0, label %sw.bb
     82     i8 1, label %dispatch_op.sw.bb6_crit_edge
     83     i8 2, label %sw.bb15
     84   ]
     85 
     86 dispatch_op.sw.bb6_crit_edge:                     ; preds = %dispatch_op
     87   br label %sw.bb6
     88 
     89 sw.bb:                                            ; preds = %indirectgoto, %dispatch_op
     90   br label %exit
     91 
     92 TARGET_1:                                         ; preds = %indirectgoto
     93   br label %sw.bb6
     94 ; USE: br label %sw.bb6, !irr_loop {{.*}}
     95 
     96 sw.bb6:                                           ; preds = %TARGET_1, %dispatch_op.sw.bb6_crit_edge
     97   br i1 %tobool, label %dispatch_op, label %if.then
     98 ; USE: br i1 %tobool, label %dispatch_op, label %if.then, !prof !{{[0-9]+}},
     99 ; USE-SAME: !irr_loop ![[SW_BB6_IRR_LOOP:[0-9]+]]
    100 
    101 if.then:                                          ; preds = %sw.bb6
    102   br label %indirectgoto
    103 
    104 TARGET_2:                                         ; preds = %indirectgoto
    105   br label %sw.bb15
    106 ; USE: br label %sw.bb15, !irr_loop {{.*}}
    107 
    108 sw.bb15:                                          ; preds = %TARGET_2, %dispatch_op
    109   br i1 %tobool, label %if.then18, label %exit
    110 ; USE: br i1 %tobool, label %if.then18, label %exit, !prof !{{[0-9]+}},
    111 ; USE-SAME: !irr_loop ![[SW_BB15_IRR_LOOP:[0-9]+]]
    112 
    113 if.then18:                                        ; preds = %sw.bb15
    114   br label %indirectgoto
    115 
    116 unknown_op:                                       ; preds = %indirectgoto
    117   br label %sw.default
    118 
    119 sw.default:                                       ; preds = %unknown_op, %dispatch_op
    120   br label %for.cond1
    121 
    122 exit:                                             ; preds = %sw.bb15, %sw.bb
    123   ret i32 0
    124 
    125 indirectgoto:                                     ; preds = %if.then18, %if.then
    126   %idxprom21 = zext i32 %0 to i64
    127   %arrayidx22 = getelementptr inbounds [256 x i8*], [256 x i8*]* @targets, i64 0, i64 %idxprom21
    128   %target = load i8*, i8** %arrayidx22, align 8
    129   indirectbr i8* %target, [label %unknown_op, label %sw.bb, label %TARGET_1, label %TARGET_2]
    130 ; USE: indirectbr i8* %target, [label %unknown_op, label %sw.bb, label %TARGET_1, label %TARGET_2], !prof !{{[0-9]+}},
    131 ; USE-SAME: !irr_loop ![[INDIRECTGOTO_IRR_LOOP:[0-9]+]]
    132 }
    133 
    134 ; USE: ![[FOR_COND2_IRR_LOOP]] = !{!"loop_header_weight", i64 1050}
    135 ; USE: ![[ENTRY8_IRR_LOOP]] = !{!"loop_header_weight", i64 373}
    136 ; USE: ![[IF_END9_IRR_LOOP]] = !{!"loop_header_weight", i64 1000}
    137 ; USE: ![[SW_BB6_IRR_LOOP]] = !{!"loop_header_weight", i64 501}
    138 ; USE: ![[SW_BB15_IRR_LOOP]] = !{!"loop_header_weight", i64 100}
    139 ; USE: ![[INDIRECTGOTO_IRR_LOOP]] = !{!"loop_header_weight", i64 400}
    140