xref: /aosp_15_r20/external/llvm/test/Analysis/BlockFrequencyInfo/basic.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -analyze -block-freq | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -analyze -lazy-block-freq | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -passes='print<block-freq>' -disable-output 2>&1 | FileCheck %s
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i32 %i, i32* %a) {
6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Printing analysis {{.*}} for function 'test1':
7*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: block-frequency-info: test1
8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry: float = 1.0, int = [[ENTRY:[0-9]+]]
9*9880d681SAndroid Build Coastguard Workerentry:
10*9880d681SAndroid Build Coastguard Worker  br label %body
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Worker; Loop backedges are weighted and thus their bodies have a greater frequency.
13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: body: float = 32.0,
14*9880d681SAndroid Build Coastguard Workerbody:
15*9880d681SAndroid Build Coastguard Worker  %iv = phi i32 [ 0, %entry ], [ %next, %body ]
16*9880d681SAndroid Build Coastguard Worker  %base = phi i32 [ 0, %entry ], [ %sum, %body ]
17*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %a, i32 %iv
18*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %arrayidx
19*9880d681SAndroid Build Coastguard Worker  %sum = add nsw i32 %0, %base
20*9880d681SAndroid Build Coastguard Worker  %next = add i32 %iv, 1
21*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp eq i32 %next, %i
22*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %exit, label %body
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: exit: float = 1.0, int = [[ENTRY]]
25*9880d681SAndroid Build Coastguard Workerexit:
26*9880d681SAndroid Build Coastguard Worker  ret i32 %sum
27*9880d681SAndroid Build Coastguard Worker}
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i32 %i, i32 %a, i32 %b) {
30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Printing analysis {{.*}} for function 'test2':
31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: block-frequency-info: test2
32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry: float = 1.0, int = [[ENTRY:[0-9]+]]
33*9880d681SAndroid Build Coastguard Workerentry:
34*9880d681SAndroid Build Coastguard Worker  %cond = icmp ult i32 %i, 42
35*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %then, label %else, !prof !0
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker; The 'then' branch is predicted more likely via branch weight metadata.
38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: then: float = 0.9411{{[0-9]*}},
39*9880d681SAndroid Build Coastguard Workerthen:
40*9880d681SAndroid Build Coastguard Worker  br label %exit
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: else: float = 0.05882{{[0-9]*}},
43*9880d681SAndroid Build Coastguard Workerelse:
44*9880d681SAndroid Build Coastguard Worker  br label %exit
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: exit: float = 1.0, int = [[ENTRY]]
47*9880d681SAndroid Build Coastguard Workerexit:
48*9880d681SAndroid Build Coastguard Worker  %result = phi i32 [ %a, %then ], [ %b, %else ]
49*9880d681SAndroid Build Coastguard Worker  ret i32 %result
50*9880d681SAndroid Build Coastguard Worker}
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Worker!0 = !{!"branch_weights", i32 64, i32 4}
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Workerdefine i32 @test3(i32 %i, i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) {
55*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Printing analysis {{.*}} for function 'test3':
56*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: block-frequency-info: test3
57*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry: float = 1.0, int = [[ENTRY:[0-9]+]]
58*9880d681SAndroid Build Coastguard Workerentry:
59*9880d681SAndroid Build Coastguard Worker  switch i32 %i, label %case_a [ i32 1, label %case_b
60*9880d681SAndroid Build Coastguard Worker                                 i32 2, label %case_c
61*9880d681SAndroid Build Coastguard Worker                                 i32 3, label %case_d
62*9880d681SAndroid Build Coastguard Worker                                 i32 4, label %case_e ], !prof !1
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: case_a: float = 0.05,
65*9880d681SAndroid Build Coastguard Workercase_a:
66*9880d681SAndroid Build Coastguard Worker  br label %exit
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: case_b: float = 0.05,
69*9880d681SAndroid Build Coastguard Workercase_b:
70*9880d681SAndroid Build Coastguard Worker  br label %exit
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Worker; The 'case_c' branch is predicted more likely via branch weight metadata.
73*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: case_c: float = 0.8,
74*9880d681SAndroid Build Coastguard Workercase_c:
75*9880d681SAndroid Build Coastguard Worker  br label %exit
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: case_d: float = 0.05,
78*9880d681SAndroid Build Coastguard Workercase_d:
79*9880d681SAndroid Build Coastguard Worker  br label %exit
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: case_e: float = 0.05,
82*9880d681SAndroid Build Coastguard Workercase_e:
83*9880d681SAndroid Build Coastguard Worker  br label %exit
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: exit: float = 1.0, int = [[ENTRY]]
86*9880d681SAndroid Build Coastguard Workerexit:
87*9880d681SAndroid Build Coastguard Worker  %result = phi i32 [ %a, %case_a ],
88*9880d681SAndroid Build Coastguard Worker                    [ %b, %case_b ],
89*9880d681SAndroid Build Coastguard Worker                    [ %c, %case_c ],
90*9880d681SAndroid Build Coastguard Worker                    [ %d, %case_d ],
91*9880d681SAndroid Build Coastguard Worker                    [ %e, %case_e ]
92*9880d681SAndroid Build Coastguard Worker  ret i32 %result
93*9880d681SAndroid Build Coastguard Worker}
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Worker!1 = !{!"branch_weights", i32 4, i32 4, i32 64, i32 4, i32 4}
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Workerdefine void @nested_loops(i32 %a) {
98*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Printing analysis {{.*}} for function 'nested_loops':
99*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: block-frequency-info: nested_loops
100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry: float = 1.0, int = [[ENTRY:[0-9]+]]
101*9880d681SAndroid Build Coastguard Workerentry:
102*9880d681SAndroid Build Coastguard Worker  br label %for.cond1.preheader
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: for.cond1.preheader: float = 4001.0,
105*9880d681SAndroid Build Coastguard Workerfor.cond1.preheader:
106*9880d681SAndroid Build Coastguard Worker  %x.024 = phi i32 [ 0, %entry ], [ %inc12, %for.inc11 ]
107*9880d681SAndroid Build Coastguard Worker  br label %for.cond4.preheader
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: for.cond4.preheader: float = 16007984.8,
110*9880d681SAndroid Build Coastguard Workerfor.cond4.preheader:
111*9880d681SAndroid Build Coastguard Worker  %y.023 = phi i32 [ 0, %for.cond1.preheader ], [ %inc9, %for.inc8 ]
112*9880d681SAndroid Build Coastguard Worker  %add = add i32 %y.023, %x.024
113*9880d681SAndroid Build Coastguard Worker  br label %for.body6
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: for.body6: float = 64047914563.9,
116*9880d681SAndroid Build Coastguard Workerfor.body6:
117*9880d681SAndroid Build Coastguard Worker  %z.022 = phi i32 [ 0, %for.cond4.preheader ], [ %inc, %for.body6 ]
118*9880d681SAndroid Build Coastguard Worker  %add7 = add i32 %add, %z.022
119*9880d681SAndroid Build Coastguard Worker  tail call void @g(i32 %add7)
120*9880d681SAndroid Build Coastguard Worker  %inc = add i32 %z.022, 1
121*9880d681SAndroid Build Coastguard Worker  %cmp5 = icmp ugt i32 %inc, %a
122*9880d681SAndroid Build Coastguard Worker  br i1 %cmp5, label %for.inc8, label %for.body6, !prof !2
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: for.inc8: float = 16007984.8,
125*9880d681SAndroid Build Coastguard Workerfor.inc8:
126*9880d681SAndroid Build Coastguard Worker  %inc9 = add i32 %y.023, 1
127*9880d681SAndroid Build Coastguard Worker  %cmp2 = icmp ugt i32 %inc9, %a
128*9880d681SAndroid Build Coastguard Worker  br i1 %cmp2, label %for.inc11, label %for.cond4.preheader, !prof !2
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: for.inc11: float = 4001.0,
131*9880d681SAndroid Build Coastguard Workerfor.inc11:
132*9880d681SAndroid Build Coastguard Worker  %inc12 = add i32 %x.024, 1
133*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ugt i32 %inc12, %a
134*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.end13, label %for.cond1.preheader, !prof !2
135*9880d681SAndroid Build Coastguard Worker
136*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: for.end13: float = 1.0, int = [[ENTRY]]
137*9880d681SAndroid Build Coastguard Workerfor.end13:
138*9880d681SAndroid Build Coastguard Worker  ret void
139*9880d681SAndroid Build Coastguard Worker}
140*9880d681SAndroid Build Coastguard Worker
141*9880d681SAndroid Build Coastguard Workerdeclare void @g(i32)
142*9880d681SAndroid Build Coastguard Worker
143*9880d681SAndroid Build Coastguard Worker!2 = !{!"branch_weights", i32 1, i32 4000}
144