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