xref: /aosp_15_r20/external/llvm/test/Analysis/BlockFrequencyInfo/double_exit.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -analyze -block-freq | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -passes='print<block-freq>' -disable-output 2>&1 | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Printing analysis {{.*}} for function 'double_exit':
5*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: block-frequency-info: double_exit
6*9880d681SAndroid Build Coastguard Workerdefine i32 @double_exit(i32 %N) {
7*9880d681SAndroid Build Coastguard Worker; Mass = 1
8*9880d681SAndroid Build Coastguard Worker; Frequency = 1
9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry: float = 1.0, int = [[ENTRY:[0-9]+]]
10*9880d681SAndroid Build Coastguard Workerentry:
11*9880d681SAndroid Build Coastguard Worker  br label %outer
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Worker; Mass = 1
14*9880d681SAndroid Build Coastguard Worker; Backedge mass = 1/3, exit mass = 2/3
15*9880d681SAndroid Build Coastguard Worker; Loop scale = 3/2
16*9880d681SAndroid Build Coastguard Worker; Pseudo-edges = exit
17*9880d681SAndroid Build Coastguard Worker; Pseudo-mass = 1
18*9880d681SAndroid Build Coastguard Worker; Frequency = 1*3/2*1 = 3/2
19*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: outer: float = 1.5,
20*9880d681SAndroid Build Coastguard Workerouter:
21*9880d681SAndroid Build Coastguard Worker  %I.0 = phi i32 [ 0, %entry ], [ %inc6, %outer.inc ]
22*9880d681SAndroid Build Coastguard Worker  %Return.0 = phi i32 [ 0, %entry ], [ %Return.1, %outer.inc ]
23*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %I.0, %N
24*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %inner, label %exit, !prof !2 ; 2:1
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Worker; Mass = 1
27*9880d681SAndroid Build Coastguard Worker; Backedge mass = 3/5, exit mass = 2/5
28*9880d681SAndroid Build Coastguard Worker; Loop scale = 5/2
29*9880d681SAndroid Build Coastguard Worker; Pseudo-edges = outer.inc @ 1/5, exit @ 1/5
30*9880d681SAndroid Build Coastguard Worker; Pseudo-mass = 2/3
31*9880d681SAndroid Build Coastguard Worker; Frequency = 3/2*1*5/2*2/3 = 5/2
32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: inner: float = 2.5,
33*9880d681SAndroid Build Coastguard Workerinner:
34*9880d681SAndroid Build Coastguard Worker  %Return.1 = phi i32 [ %Return.0, %outer ], [ %call4, %inner.inc ]
35*9880d681SAndroid Build Coastguard Worker  %J.0 = phi i32 [ %I.0, %outer ], [ %inc, %inner.inc ]
36*9880d681SAndroid Build Coastguard Worker  %cmp2 = icmp slt i32 %J.0, %N
37*9880d681SAndroid Build Coastguard Worker  br i1 %cmp2, label %inner.body, label %outer.inc, !prof !1 ; 4:1
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker; Mass = 4/5
40*9880d681SAndroid Build Coastguard Worker; Frequency = 5/2*4/5 = 2
41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: inner.body: float = 2.0,
42*9880d681SAndroid Build Coastguard Workerinner.body:
43*9880d681SAndroid Build Coastguard Worker  %call = call i32 @c2(i32 %I.0, i32 %J.0)
44*9880d681SAndroid Build Coastguard Worker  %tobool = icmp ne i32 %call, 0
45*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %exit, label %inner.inc, !prof !0 ; 3:1
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker; Mass = 3/5
48*9880d681SAndroid Build Coastguard Worker; Frequency = 5/2*3/5 = 3/2
49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: inner.inc: float = 1.5,
50*9880d681SAndroid Build Coastguard Workerinner.inc:
51*9880d681SAndroid Build Coastguard Worker  %call4 = call i32 @logic2(i32 %Return.1, i32 %I.0, i32 %J.0)
52*9880d681SAndroid Build Coastguard Worker  %inc = add nsw i32 %J.0, 1
53*9880d681SAndroid Build Coastguard Worker  br label %inner
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker; Mass = 1/3
56*9880d681SAndroid Build Coastguard Worker; Frequency = 3/2*1/3 = 1/2
57*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: outer.inc: float = 0.5,
58*9880d681SAndroid Build Coastguard Workerouter.inc:
59*9880d681SAndroid Build Coastguard Worker  %inc6 = add nsw i32 %I.0, 1
60*9880d681SAndroid Build Coastguard Worker  br label %outer
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Worker; Mass = 1
63*9880d681SAndroid Build Coastguard Worker; Frequency = 1
64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: exit: float = 1.0, int = [[ENTRY]]
65*9880d681SAndroid Build Coastguard Workerexit:
66*9880d681SAndroid Build Coastguard Worker  %Return.2 = phi i32 [ %Return.1, %inner.body ], [ %Return.0, %outer ]
67*9880d681SAndroid Build Coastguard Worker  ret i32 %Return.2
68*9880d681SAndroid Build Coastguard Worker}
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Worker!0 = !{!"branch_weights", i32 1, i32 3}
71*9880d681SAndroid Build Coastguard Worker!1 = !{!"branch_weights", i32 4, i32 1}
72*9880d681SAndroid Build Coastguard Worker!2 = !{!"branch_weights", i32 2, i32 1}
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Workerdeclare i32 @c2(i32, i32)
75*9880d681SAndroid Build Coastguard Workerdeclare i32 @logic2(i32, i32, i32)
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Printing analysis {{.*}} for function 'double_exit_in_loop':
78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: block-frequency-info: double_exit_in_loop
79*9880d681SAndroid Build Coastguard Workerdefine i32 @double_exit_in_loop(i32 %N) {
80*9880d681SAndroid Build Coastguard Worker; Mass = 1
81*9880d681SAndroid Build Coastguard Worker; Frequency = 1
82*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry: float = 1.0, int = [[ENTRY:[0-9]+]]
83*9880d681SAndroid Build Coastguard Workerentry:
84*9880d681SAndroid Build Coastguard Worker  br label %outer
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Worker; Mass = 1
87*9880d681SAndroid Build Coastguard Worker; Backedge mass = 1/2, exit mass = 1/2
88*9880d681SAndroid Build Coastguard Worker; Loop scale = 2
89*9880d681SAndroid Build Coastguard Worker; Pseudo-edges = exit
90*9880d681SAndroid Build Coastguard Worker; Pseudo-mass = 1
91*9880d681SAndroid Build Coastguard Worker; Frequency = 1*2*1 = 2
92*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: outer: float = 2.0,
93*9880d681SAndroid Build Coastguard Workerouter:
94*9880d681SAndroid Build Coastguard Worker  %I.0 = phi i32 [ 0, %entry ], [ %inc12, %outer.inc ]
95*9880d681SAndroid Build Coastguard Worker  %Return.0 = phi i32 [ 0, %entry ], [ %Return.3, %outer.inc ]
96*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %I.0, %N
97*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %middle, label %exit, !prof !3 ; 1:1
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Worker; Mass = 1
100*9880d681SAndroid Build Coastguard Worker; Backedge mass = 1/3, exit mass = 2/3
101*9880d681SAndroid Build Coastguard Worker; Loop scale = 3/2
102*9880d681SAndroid Build Coastguard Worker; Pseudo-edges = outer.inc
103*9880d681SAndroid Build Coastguard Worker; Pseudo-mass = 1/2
104*9880d681SAndroid Build Coastguard Worker; Frequency = 2*1*3/2*1/2 = 3/2
105*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: middle: float = 1.5,
106*9880d681SAndroid Build Coastguard Workermiddle:
107*9880d681SAndroid Build Coastguard Worker  %J.0 = phi i32 [ %I.0, %outer ], [ %inc9, %middle.inc ]
108*9880d681SAndroid Build Coastguard Worker  %Return.1 = phi i32 [ %Return.0, %outer ], [ %Return.2, %middle.inc ]
109*9880d681SAndroid Build Coastguard Worker  %cmp2 = icmp slt i32 %J.0, %N
110*9880d681SAndroid Build Coastguard Worker  br i1 %cmp2, label %inner, label %outer.inc, !prof !2 ; 2:1
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Worker; Mass = 1
113*9880d681SAndroid Build Coastguard Worker; Backedge mass = 3/5, exit mass = 2/5
114*9880d681SAndroid Build Coastguard Worker; Loop scale = 5/2
115*9880d681SAndroid Build Coastguard Worker; Pseudo-edges = middle.inc @ 1/5, outer.inc @ 1/5
116*9880d681SAndroid Build Coastguard Worker; Pseudo-mass = 2/3
117*9880d681SAndroid Build Coastguard Worker; Frequency = 3/2*1*5/2*2/3 = 5/2
118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: inner: float = 2.5,
119*9880d681SAndroid Build Coastguard Workerinner:
120*9880d681SAndroid Build Coastguard Worker  %Return.2 = phi i32 [ %Return.1, %middle ], [ %call7, %inner.inc ]
121*9880d681SAndroid Build Coastguard Worker  %K.0 = phi i32 [ %J.0, %middle ], [ %inc, %inner.inc ]
122*9880d681SAndroid Build Coastguard Worker  %cmp5 = icmp slt i32 %K.0, %N
123*9880d681SAndroid Build Coastguard Worker  br i1 %cmp5, label %inner.body, label %middle.inc, !prof !1 ; 4:1
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Worker; Mass = 4/5
126*9880d681SAndroid Build Coastguard Worker; Frequency = 5/2*4/5 = 2
127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: inner.body: float = 2.0,
128*9880d681SAndroid Build Coastguard Workerinner.body:
129*9880d681SAndroid Build Coastguard Worker  %call = call i32 @c3(i32 %I.0, i32 %J.0, i32 %K.0)
130*9880d681SAndroid Build Coastguard Worker  %tobool = icmp ne i32 %call, 0
131*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %outer.inc, label %inner.inc, !prof !0 ; 3:1
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Worker; Mass = 3/5
134*9880d681SAndroid Build Coastguard Worker; Frequency = 5/2*3/5 = 3/2
135*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: inner.inc: float = 1.5,
136*9880d681SAndroid Build Coastguard Workerinner.inc:
137*9880d681SAndroid Build Coastguard Worker  %call7 = call i32 @logic3(i32 %Return.2, i32 %I.0, i32 %J.0, i32 %K.0)
138*9880d681SAndroid Build Coastguard Worker  %inc = add nsw i32 %K.0, 1
139*9880d681SAndroid Build Coastguard Worker  br label %inner
140*9880d681SAndroid Build Coastguard Worker
141*9880d681SAndroid Build Coastguard Worker; Mass = 1/3
142*9880d681SAndroid Build Coastguard Worker; Frequency = 3/2*1/3 = 1/2
143*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: middle.inc: float = 0.5,
144*9880d681SAndroid Build Coastguard Workermiddle.inc:
145*9880d681SAndroid Build Coastguard Worker  %inc9 = add nsw i32 %J.0, 1
146*9880d681SAndroid Build Coastguard Worker  br label %middle
147*9880d681SAndroid Build Coastguard Worker
148*9880d681SAndroid Build Coastguard Worker; Mass = 1/2
149*9880d681SAndroid Build Coastguard Worker; Frequency = 2*1/2 = 1
150*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: outer.inc: float = 1.0,
151*9880d681SAndroid Build Coastguard Workerouter.inc:
152*9880d681SAndroid Build Coastguard Worker  %Return.3 = phi i32 [ %Return.2, %inner.body ], [ %Return.1, %middle ]
153*9880d681SAndroid Build Coastguard Worker  %inc12 = add nsw i32 %I.0, 1
154*9880d681SAndroid Build Coastguard Worker  br label %outer
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Worker; Mass = 1
157*9880d681SAndroid Build Coastguard Worker; Frequency = 1
158*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: exit: float = 1.0, int = [[ENTRY]]
159*9880d681SAndroid Build Coastguard Workerexit:
160*9880d681SAndroid Build Coastguard Worker  ret i32 %Return.0
161*9880d681SAndroid Build Coastguard Worker}
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Worker!3 = !{!"branch_weights", i32 1, i32 1}
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Workerdeclare i32 @c3(i32, i32, i32)
166*9880d681SAndroid Build Coastguard Workerdeclare i32 @logic3(i32, i32, i32, i32)
167