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