• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
8define i32 @_Z11irreducibleii(i32 %iter_outer, i32 %iter_inner) local_unnamed_addr #0 {
9entry:
10  %cmp24 = icmp sgt i32 %iter_outer, 0
11  br i1 %cmp24, label %for.body, label %entry.for.cond.cleanup_crit_edge
12
13entry.for.cond.cleanup_crit_edge:                 ; preds = %entry
14  br label %for.cond.cleanup
15
16for.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
20for.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
27for.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
35for.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
40entry8:                                           ; 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
48if.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
57for.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
69define i32 @_Z11irreduciblePh(i8* nocapture readonly %p) {
70entry:
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
76for.cond1:                                        ; preds = %sw.default, %entry
77  br label %dispatch_op
78
79dispatch_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
86dispatch_op.sw.bb6_crit_edge:                     ; preds = %dispatch_op
87  br label %sw.bb6
88
89sw.bb:                                            ; preds = %indirectgoto, %dispatch_op
90  br label %exit
91
92TARGET_1:                                         ; preds = %indirectgoto
93  br label %sw.bb6
94; USE: br label %sw.bb6, !irr_loop {{.*}}
95
96sw.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
101if.then:                                          ; preds = %sw.bb6
102  br label %indirectgoto
103
104TARGET_2:                                         ; preds = %indirectgoto
105  br label %sw.bb15
106; USE: br label %sw.bb15, !irr_loop {{.*}}
107
108sw.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
113if.then18:                                        ; preds = %sw.bb15
114  br label %indirectgoto
115
116unknown_op:                                       ; preds = %indirectgoto
117  br label %sw.default
118
119sw.default:                                       ; preds = %unknown_op, %dispatch_op
120  br label %for.cond1
121
122exit:                                             ; preds = %sw.bb15, %sw.bb
123  ret i32 0
124
125indirectgoto:                                     ; 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