xref: /aosp_15_r20/external/clang/test/Profile/c-general.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // Test instrumentation of general constructs in C.
2*67e74705SXin Li 
3*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -main-file-name c-general.c %s -o - -emit-llvm -fprofile-instrument=clang | FileCheck -check-prefix=PGOGEN %s
4*67e74705SXin Li 
5*67e74705SXin Li // RUN: llvm-profdata merge %S/Inputs/c-general.proftext -o %t.profdata
6*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -main-file-name c-general.c %s -o - -emit-llvm -fprofile-instrument-use-path=%t.profdata | FileCheck -check-prefix=PGOUSE %s
7*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -main-file-name c-general.c %s -o - -emit-llvm -fprofile-instrument-use-path=%S/Inputs/c-general.profdata.v3 | FileCheck -check-prefix=PGOUSE %s
8*67e74705SXin Li // Also check compatibility with older profiles.
9*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -main-file-name c-general.c %s -o - -emit-llvm -fprofile-instrument-use-path=%S/Inputs/c-general.profdata.v1 | FileCheck -check-prefix=PGOUSE %s
10*67e74705SXin Li 
11*67e74705SXin Li // PGOGEN: @[[SLC:__profc_simple_loops]] = private global [4 x i64] zeroinitializer
12*67e74705SXin Li // PGOGEN: @[[IFC:__profc_conditionals]] = private global [11 x i64] zeroinitializer
13*67e74705SXin Li // PGOGEN: @[[EEC:__profc_early_exits]] = private global [9 x i64] zeroinitializer
14*67e74705SXin Li // PGOGEN: @[[JMC:__profc_jumps]] = private global [22 x i64] zeroinitializer
15*67e74705SXin Li // PGOGEN: @[[SWC:__profc_switches]] = private global [19 x i64] zeroinitializer
16*67e74705SXin Li // PGOGEN: @[[BSC:__profc_big_switch]] = private global [17 x i64] zeroinitializer
17*67e74705SXin Li // PGOGEN: @[[BOC:__profc_boolean_operators]] = private global [8 x i64] zeroinitializer
18*67e74705SXin Li // PGOGEN: @[[BLC:__profc_boolop_loops]] = private global [9 x i64] zeroinitializer
19*67e74705SXin Li // PGOGEN: @[[COC:__profc_conditional_operator]] = private global [3 x i64] zeroinitializer
20*67e74705SXin Li // PGOGEN: @[[DFC:__profc_do_fallthrough]] = private global [4 x i64] zeroinitializer
21*67e74705SXin Li // PGOGEN: @[[MAC:__profc_main]] = private global [1 x i64] zeroinitializer
22*67e74705SXin Li // PGOGEN: @[[STC:__profc_c_general.c_static_func]] = private global [2 x i64] zeroinitializer
23*67e74705SXin Li 
24*67e74705SXin Li // PGOGEN-LABEL: @simple_loops()
25*67e74705SXin Li // PGOUSE-LABEL: @simple_loops()
26*67e74705SXin Li // PGOGEN: store {{.*}} @[[SLC]], i64 0, i64 0
simple_loops()27*67e74705SXin Li void simple_loops() {
28*67e74705SXin Li   int i;
29*67e74705SXin Li   // PGOGEN: store {{.*}} @[[SLC]], i64 0, i64 1
30*67e74705SXin Li   // PGOUSE: br {{.*}} !prof ![[SL1:[0-9]+]]
31*67e74705SXin Li   for (i = 0; i < 100; ++i) {
32*67e74705SXin Li   }
33*67e74705SXin Li   // PGOGEN: store {{.*}} @[[SLC]], i64 0, i64 2
34*67e74705SXin Li   // PGOUSE: br {{.*}} !prof ![[SL2:[0-9]+]]
35*67e74705SXin Li   while (i > 0)
36*67e74705SXin Li     i--;
37*67e74705SXin Li   // PGOGEN: store {{.*}} @[[SLC]], i64 0, i64 3
38*67e74705SXin Li   // PGOUSE: br {{.*}} !prof ![[SL3:[0-9]+]]
39*67e74705SXin Li   do {} while (i++ < 75);
40*67e74705SXin Li 
41*67e74705SXin Li   // PGOGEN-NOT: store {{.*}} @[[SLC]],
42*67e74705SXin Li   // PGOUSE-NOT: br {{.*}} !prof ![0-9]+
43*67e74705SXin Li }
44*67e74705SXin Li 
45*67e74705SXin Li // PGOGEN-LABEL: @conditionals()
46*67e74705SXin Li // PGOUSE-LABEL: @conditionals()
47*67e74705SXin Li // PGOGEN: store {{.*}} @[[IFC]], i64 0, i64 0
conditionals()48*67e74705SXin Li void conditionals() {
49*67e74705SXin Li   // PGOGEN: store {{.*}} @[[IFC]], i64 0, i64 1
50*67e74705SXin Li   // PGOUSE: br {{.*}} !prof ![[IF1:[0-9]+]]
51*67e74705SXin Li   for (int i = 0; i < 100; ++i) {
52*67e74705SXin Li     // PGOGEN: store {{.*}} @[[IFC]], i64 0, i64 2
53*67e74705SXin Li     // PGOUSE: br {{.*}} !prof ![[IF2:[0-9]+]]
54*67e74705SXin Li     if (i % 2) {
55*67e74705SXin Li       // PGOGEN: store {{.*}} @[[IFC]], i64 0, i64 3
56*67e74705SXin Li       // PGOUSE: br {{.*}} !prof ![[IF3:[0-9]+]]
57*67e74705SXin Li       if (i) {}
58*67e74705SXin Li     // PGOGEN: store {{.*}} @[[IFC]], i64 0, i64 4
59*67e74705SXin Li     // PGOUSE: br {{.*}} !prof ![[IF4:[0-9]+]]
60*67e74705SXin Li     } else if (i % 3) {
61*67e74705SXin Li       // PGOGEN: store {{.*}} @[[IFC]], i64 0, i64 5
62*67e74705SXin Li       // PGOUSE: br {{.*}} !prof ![[IF5:[0-9]+]]
63*67e74705SXin Li       if (i) {}
64*67e74705SXin Li     } else {
65*67e74705SXin Li       // PGOGEN: store {{.*}} @[[IFC]], i64 0, i64 6
66*67e74705SXin Li       // PGOUSE: br {{.*}} !prof ![[IF6:[0-9]+]]
67*67e74705SXin Li       if (i) {}
68*67e74705SXin Li     }
69*67e74705SXin Li 
70*67e74705SXin Li     // PGOGEN: store {{.*}} @[[IFC]], i64 0, i64 8
71*67e74705SXin Li     // PGOGEN: store {{.*}} @[[IFC]], i64 0, i64 7
72*67e74705SXin Li     // PGOUSE: br {{.*}} !prof ![[IF7:[0-9]+]]
73*67e74705SXin Li     if (1 && i) {}
74*67e74705SXin Li     // PGOGEN: store {{.*}} @[[IFC]], i64 0, i64 10
75*67e74705SXin Li     // PGOGEN: store {{.*}} @[[IFC]], i64 0, i64 9
76*67e74705SXin Li     // PGOUSE: br {{.*}} !prof ![[IF8:[0-9]+]]
77*67e74705SXin Li     if (0 || i) {}
78*67e74705SXin Li   }
79*67e74705SXin Li 
80*67e74705SXin Li   // PGOGEN-NOT: store {{.*}} @[[IFC]],
81*67e74705SXin Li   // PGOUSE-NOT: br {{.*}} !prof ![0-9]+
82*67e74705SXin Li }
83*67e74705SXin Li 
84*67e74705SXin Li // PGOGEN-LABEL: @early_exits()
85*67e74705SXin Li // PGOUSE-LABEL: @early_exits()
86*67e74705SXin Li // PGOGEN: store {{.*}} @[[EEC]], i64 0, i64 0
early_exits()87*67e74705SXin Li void early_exits() {
88*67e74705SXin Li   int i = 0;
89*67e74705SXin Li 
90*67e74705SXin Li   // PGOGEN: store {{.*}} @[[EEC]], i64 0, i64 1
91*67e74705SXin Li   // PGOUSE: br {{.*}} !prof ![[EE1:[0-9]+]]
92*67e74705SXin Li   if (i) {}
93*67e74705SXin Li 
94*67e74705SXin Li   // PGOGEN: store {{.*}} @[[EEC]], i64 0, i64 2
95*67e74705SXin Li   // PGOUSE: br {{.*}} !prof ![[EE2:[0-9]+]]
96*67e74705SXin Li   while (i < 100) {
97*67e74705SXin Li     i++;
98*67e74705SXin Li     // PGOGEN: store {{.*}} @[[EEC]], i64 0, i64 3
99*67e74705SXin Li     // PGOUSE: br {{.*}} !prof ![[EE3:[0-9]+]]
100*67e74705SXin Li     if (i > 50)
101*67e74705SXin Li       break;
102*67e74705SXin Li     // PGOGEN: store {{.*}} @[[EEC]], i64 0, i64 4
103*67e74705SXin Li     // PGOUSE: br {{.*}} !prof ![[EE4:[0-9]+]]
104*67e74705SXin Li     if (i % 2)
105*67e74705SXin Li       continue;
106*67e74705SXin Li   }
107*67e74705SXin Li 
108*67e74705SXin Li   // PGOGEN: store {{.*}} @[[EEC]], i64 0, i64 5
109*67e74705SXin Li   // PGOUSE: br {{.*}} !prof ![[EE5:[0-9]+]]
110*67e74705SXin Li   if (i) {}
111*67e74705SXin Li 
112*67e74705SXin Li   // PGOGEN: store {{.*}} @[[EEC]], i64 0, i64 6
113*67e74705SXin Li   do {
114*67e74705SXin Li     // PGOGEN: store {{.*}} @[[EEC]], i64 0, i64 7
115*67e74705SXin Li     // PGOUSE: br {{.*}} !prof ![[EE6:[0-9]+]]
116*67e74705SXin Li     if (i > 75)
117*67e74705SXin Li       return;
118*67e74705SXin Li     else
119*67e74705SXin Li       i++;
120*67e74705SXin Li   // PGOUSE: br {{.*}} !prof ![[EE7:[0-9]+]]
121*67e74705SXin Li   } while (i < 100);
122*67e74705SXin Li 
123*67e74705SXin Li   // PGOGEN: store {{.*}} @[[EEC]], i64 0, i64 8
124*67e74705SXin Li   // Never reached -> no weights
125*67e74705SXin Li   if (i) {}
126*67e74705SXin Li 
127*67e74705SXin Li   // PGOGEN-NOT: store {{.*}} @[[EEC]],
128*67e74705SXin Li   // PGOUSE-NOT: br {{.*}} !prof ![0-9]+
129*67e74705SXin Li }
130*67e74705SXin Li 
131*67e74705SXin Li // PGOGEN-LABEL: @jumps()
132*67e74705SXin Li // PGOUSE-LABEL: @jumps()
133*67e74705SXin Li // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 0
jumps()134*67e74705SXin Li void jumps() {
135*67e74705SXin Li   int i;
136*67e74705SXin Li 
137*67e74705SXin Li   // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 1
138*67e74705SXin Li   // PGOUSE: br {{.*}} !prof ![[JM1:[0-9]+]]
139*67e74705SXin Li   for (i = 0; i < 2; ++i) {
140*67e74705SXin Li     goto outofloop;
141*67e74705SXin Li     // Never reached -> no weights
142*67e74705SXin Li     if (i) {}
143*67e74705SXin Li   }
144*67e74705SXin Li // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 3
145*67e74705SXin Li outofloop:
146*67e74705SXin Li   // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 4
147*67e74705SXin Li   // PGOUSE: br {{.*}} !prof ![[JM2:[0-9]+]]
148*67e74705SXin Li   if (i) {}
149*67e74705SXin Li 
150*67e74705SXin Li   goto loop1;
151*67e74705SXin Li 
152*67e74705SXin Li   // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 5
153*67e74705SXin Li   // PGOUSE: br {{.*}} !prof ![[JM3:[0-9]+]]
154*67e74705SXin Li   while (i) {
155*67e74705SXin Li   // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 6
156*67e74705SXin Li   loop1:
157*67e74705SXin Li     // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 7
158*67e74705SXin Li     // PGOUSE: br {{.*}} !prof ![[JM4:[0-9]+]]
159*67e74705SXin Li     if (i) {}
160*67e74705SXin Li   }
161*67e74705SXin Li 
162*67e74705SXin Li   goto loop2;
163*67e74705SXin Li // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 8
164*67e74705SXin Li first:
165*67e74705SXin Li // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 9
166*67e74705SXin Li second:
167*67e74705SXin Li // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 10
168*67e74705SXin Li third:
169*67e74705SXin Li   i++;
170*67e74705SXin Li   // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 11
171*67e74705SXin Li   // PGOUSE: br {{.*}} !prof ![[JM5:[0-9]+]]
172*67e74705SXin Li   if (i < 3)
173*67e74705SXin Li     goto loop2;
174*67e74705SXin Li 
175*67e74705SXin Li   // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 12
176*67e74705SXin Li   // PGOUSE: br {{.*}} !prof ![[JM6:[0-9]+]]
177*67e74705SXin Li   while (i < 3) {
178*67e74705SXin Li   // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 13
179*67e74705SXin Li   loop2:
180*67e74705SXin Li     // PGOUSE: switch {{.*}} [
181*67e74705SXin Li     // PGOUSE: ], !prof ![[JM7:[0-9]+]]
182*67e74705SXin Li     switch (i) {
183*67e74705SXin Li     // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 15
184*67e74705SXin Li     case 0:
185*67e74705SXin Li       goto first;
186*67e74705SXin Li     // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 16
187*67e74705SXin Li     case 1:
188*67e74705SXin Li       goto second;
189*67e74705SXin Li     // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 17
190*67e74705SXin Li     case 2:
191*67e74705SXin Li       goto third;
192*67e74705SXin Li     }
193*67e74705SXin Li     // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 14
194*67e74705SXin Li   }
195*67e74705SXin Li 
196*67e74705SXin Li   // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 18
197*67e74705SXin Li   // PGOUSE: br {{.*}} !prof ![[JM8:[0-9]+]]
198*67e74705SXin Li   for (i = 0; i < 10; ++i) {
199*67e74705SXin Li     goto withinloop;
200*67e74705SXin Li     // never reached -> no weights
201*67e74705SXin Li     if (i) {}
202*67e74705SXin Li   // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 20
203*67e74705SXin Li   withinloop:
204*67e74705SXin Li     // PGOGEN: store {{.*}} @[[JMC]], i64 0, i64 21
205*67e74705SXin Li     // PGOUSE: br {{.*}} !prof ![[JM9:[0-9]+]]
206*67e74705SXin Li     if (i) {}
207*67e74705SXin Li   }
208*67e74705SXin Li 
209*67e74705SXin Li   // PGOGEN-NOT: store {{.*}} @[[JMC]],
210*67e74705SXin Li   // PGOUSE-NOT: br {{.*}} !prof ![0-9]+
211*67e74705SXin Li }
212*67e74705SXin Li 
213*67e74705SXin Li // PGOGEN-LABEL: @switches()
214*67e74705SXin Li // PGOUSE-LABEL: @switches()
215*67e74705SXin Li // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 0
switches()216*67e74705SXin Li void switches() {
217*67e74705SXin Li   static int weights[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5};
218*67e74705SXin Li 
219*67e74705SXin Li   // No cases -> no weights
220*67e74705SXin Li   switch (weights[0]) {
221*67e74705SXin Li   // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 2
222*67e74705SXin Li   default:
223*67e74705SXin Li     break;
224*67e74705SXin Li   }
225*67e74705SXin Li   // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 1
226*67e74705SXin Li 
227*67e74705SXin Li   // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 3
228*67e74705SXin Li   // PGOUSE: br {{.*}} !prof ![[SW1:[0-9]+]]
229*67e74705SXin Li   for (int i = 0, len = sizeof(weights) / sizeof(weights[0]); i < len; ++i) {
230*67e74705SXin Li     // PGOUSE: switch {{.*}} [
231*67e74705SXin Li     // PGOUSE: ], !prof ![[SW2:[0-9]+]]
232*67e74705SXin Li     switch (i[weights]) {
233*67e74705SXin Li     // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 5
234*67e74705SXin Li     case 1:
235*67e74705SXin Li       // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 6
236*67e74705SXin Li       // PGOUSE: br {{.*}} !prof ![[SW3:[0-9]+]]
237*67e74705SXin Li       if (i) {}
238*67e74705SXin Li       // fallthrough
239*67e74705SXin Li     // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 7
240*67e74705SXin Li     case 2:
241*67e74705SXin Li       // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 8
242*67e74705SXin Li       // PGOUSE: br {{.*}} !prof ![[SW4:[0-9]+]]
243*67e74705SXin Li       if (i) {}
244*67e74705SXin Li       break;
245*67e74705SXin Li     // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 9
246*67e74705SXin Li     case 3:
247*67e74705SXin Li       // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 10
248*67e74705SXin Li       // PGOUSE: br {{.*}} !prof ![[SW5:[0-9]+]]
249*67e74705SXin Li       if (i) {}
250*67e74705SXin Li       continue;
251*67e74705SXin Li     // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 11
252*67e74705SXin Li     case 4:
253*67e74705SXin Li       // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 12
254*67e74705SXin Li       // PGOUSE: br {{.*}} !prof ![[SW6:[0-9]+]]
255*67e74705SXin Li       if (i) {}
256*67e74705SXin Li       // PGOUSE: switch {{.*}} [
257*67e74705SXin Li       // PGOUSE: ], !prof ![[SW7:[0-9]+]]
258*67e74705SXin Li       switch (i) {
259*67e74705SXin Li       // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 14
260*67e74705SXin Li       case 6 ... 9:
261*67e74705SXin Li         // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 15
262*67e74705SXin Li         // PGOUSE: br {{.*}} !prof ![[SW8:[0-9]+]]
263*67e74705SXin Li         if (i) {}
264*67e74705SXin Li         continue;
265*67e74705SXin Li       }
266*67e74705SXin Li       // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 13
267*67e74705SXin Li 
268*67e74705SXin Li     // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 16
269*67e74705SXin Li     default:
270*67e74705SXin Li       // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 17
271*67e74705SXin Li       // PGOUSE: br {{.*}} !prof ![[SW9:[0-9]+]]
272*67e74705SXin Li       if (i == len - 1)
273*67e74705SXin Li         return;
274*67e74705SXin Li     }
275*67e74705SXin Li     // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 4
276*67e74705SXin Li   }
277*67e74705SXin Li 
278*67e74705SXin Li   // PGOGEN: store {{.*}} @[[SWC]], i64 0, i64 18
279*67e74705SXin Li   // Never reached -> no weights
280*67e74705SXin Li   if (weights[0]) {}
281*67e74705SXin Li 
282*67e74705SXin Li   // PGOGEN-NOT: store {{.*}} @[[SWC]],
283*67e74705SXin Li   // PGOUSE-NOT: br {{.*}} !prof ![0-9]+
284*67e74705SXin Li }
285*67e74705SXin Li 
286*67e74705SXin Li // PGOGEN-LABEL: @big_switch()
287*67e74705SXin Li // PGOUSE-LABEL: @big_switch()
288*67e74705SXin Li // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 0
big_switch()289*67e74705SXin Li void big_switch() {
290*67e74705SXin Li   // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 1
291*67e74705SXin Li   // PGOUSE: br {{.*}} !prof ![[BS1:[0-9]+]]
292*67e74705SXin Li   for (int i = 0; i < 32; ++i) {
293*67e74705SXin Li     // PGOUSE: switch {{.*}} [
294*67e74705SXin Li     // PGOUSE: ], !prof ![[BS2:[0-9]+]]
295*67e74705SXin Li     switch (1 << i) {
296*67e74705SXin Li     // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 3
297*67e74705SXin Li     case (1 << 0):
298*67e74705SXin Li       // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 4
299*67e74705SXin Li       // PGOUSE: br {{.*}} !prof ![[BS3:[0-9]+]]
300*67e74705SXin Li       if (i) {}
301*67e74705SXin Li       // fallthrough
302*67e74705SXin Li     // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 5
303*67e74705SXin Li     case (1 << 1):
304*67e74705SXin Li       // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 6
305*67e74705SXin Li       // PGOUSE: br {{.*}} !prof ![[BS4:[0-9]+]]
306*67e74705SXin Li       if (i) {}
307*67e74705SXin Li       break;
308*67e74705SXin Li     // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 7
309*67e74705SXin Li     case (1 << 2) ... (1 << 12):
310*67e74705SXin Li       // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 8
311*67e74705SXin Li       // PGOUSE: br {{.*}} !prof ![[BS5:[0-9]+]]
312*67e74705SXin Li       if (i) {}
313*67e74705SXin Li       break;
314*67e74705SXin Li     // The branch for the large case range above appears after the case body
315*67e74705SXin Li     // PGOUSE: br {{.*}} !prof ![[BS6:[0-9]+]]
316*67e74705SXin Li 
317*67e74705SXin Li     // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 9
318*67e74705SXin Li     case (1 << 13):
319*67e74705SXin Li       // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 10
320*67e74705SXin Li       // PGOUSE: br {{.*}} !prof ![[BS7:[0-9]+]]
321*67e74705SXin Li       if (i) {}
322*67e74705SXin Li       break;
323*67e74705SXin Li     // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 11
324*67e74705SXin Li     case (1 << 14) ... (1 << 28):
325*67e74705SXin Li       // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 12
326*67e74705SXin Li       // PGOUSE: br {{.*}} !prof ![[BS8:[0-9]+]]
327*67e74705SXin Li       if (i) {}
328*67e74705SXin Li       break;
329*67e74705SXin Li     // The branch for the large case range above appears after the case body
330*67e74705SXin Li     // PGOUSE: br {{.*}} !prof ![[BS9:[0-9]+]]
331*67e74705SXin Li 
332*67e74705SXin Li     // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 13
333*67e74705SXin Li     case (1 << 29) ... ((1 << 29) + 1):
334*67e74705SXin Li       // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 14
335*67e74705SXin Li       // PGOUSE: br {{.*}} !prof ![[BS10:[0-9]+]]
336*67e74705SXin Li       if (i) {}
337*67e74705SXin Li       break;
338*67e74705SXin Li     // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 15
339*67e74705SXin Li     default:
340*67e74705SXin Li       // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 16
341*67e74705SXin Li       // PGOUSE: br {{.*}} !prof ![[BS11:[0-9]+]]
342*67e74705SXin Li       if (i) {}
343*67e74705SXin Li       break;
344*67e74705SXin Li     }
345*67e74705SXin Li     // PGOGEN: store {{.*}} @[[BSC]], i64 0, i64 2
346*67e74705SXin Li   }
347*67e74705SXin Li 
348*67e74705SXin Li   // PGOGEN-NOT: store {{.*}} @[[BSC]],
349*67e74705SXin Li   // PGOUSE-NOT: br {{.*}} !prof ![0-9]+
350*67e74705SXin Li   // PGOUSE: ret void
351*67e74705SXin Li }
352*67e74705SXin Li 
353*67e74705SXin Li // PGOGEN-LABEL: @boolean_operators()
354*67e74705SXin Li // PGOUSE-LABEL: @boolean_operators()
355*67e74705SXin Li // PGOGEN: store {{.*}} @[[BOC]], i64 0, i64 0
boolean_operators()356*67e74705SXin Li void boolean_operators() {
357*67e74705SXin Li   int v;
358*67e74705SXin Li   // PGOGEN: store {{.*}} @[[BOC]], i64 0, i64 1
359*67e74705SXin Li   // PGOUSE: br {{.*}} !prof ![[BO1:[0-9]+]]
360*67e74705SXin Li   for (int i = 0; i < 100; ++i) {
361*67e74705SXin Li     // PGOGEN: store {{.*}} @[[BOC]], i64 0, i64 2
362*67e74705SXin Li     // PGOUSE: br {{.*}} !prof ![[BO2:[0-9]+]]
363*67e74705SXin Li     v = i % 3 || i;
364*67e74705SXin Li 
365*67e74705SXin Li     // PGOGEN: store {{.*}} @[[BOC]], i64 0, i64 3
366*67e74705SXin Li     // PGOUSE: br {{.*}} !prof ![[BO3:[0-9]+]]
367*67e74705SXin Li     v = i % 3 && i;
368*67e74705SXin Li 
369*67e74705SXin Li     // PGOGEN: store {{.*}} @[[BOC]], i64 0, i64 5
370*67e74705SXin Li     // PGOGEN: store {{.*}} @[[BOC]], i64 0, i64 4
371*67e74705SXin Li     // PGOUSE: br {{.*}} !prof ![[BO4:[0-9]+]]
372*67e74705SXin Li     // PGOUSE: br {{.*}} !prof ![[BO5:[0-9]+]]
373*67e74705SXin Li     v = i % 3 || i % 2 || i;
374*67e74705SXin Li 
375*67e74705SXin Li     // PGOGEN: store {{.*}} @[[BOC]], i64 0, i64 7
376*67e74705SXin Li     // PGOGEN: store {{.*}} @[[BOC]], i64 0, i64 6
377*67e74705SXin Li     // PGOUSE: br {{.*}} !prof ![[BO6:[0-9]+]]
378*67e74705SXin Li     // PGOUSE: br {{.*}} !prof ![[BO7:[0-9]+]]
379*67e74705SXin Li     v = i % 2 && i % 3 && i;
380*67e74705SXin Li   }
381*67e74705SXin Li 
382*67e74705SXin Li   // PGOGEN-NOT: store {{.*}} @[[BOC]],
383*67e74705SXin Li   // PGOUSE-NOT: br {{.*}} !prof ![0-9]+
384*67e74705SXin Li }
385*67e74705SXin Li 
386*67e74705SXin Li // PGOGEN-LABEL: @boolop_loops()
387*67e74705SXin Li // PGOUSE-LABEL: @boolop_loops()
388*67e74705SXin Li // PGOGEN: store {{.*}} @[[BLC]], i64 0, i64 0
boolop_loops()389*67e74705SXin Li void boolop_loops() {
390*67e74705SXin Li   int i = 100;
391*67e74705SXin Li 
392*67e74705SXin Li   // PGOGEN: store {{.*}} @[[BLC]], i64 0, i64 2
393*67e74705SXin Li   // PGOGEN: store {{.*}} @[[BLC]], i64 0, i64 1
394*67e74705SXin Li   // PGOUSE: br {{.*}} !prof ![[BL1:[0-9]+]]
395*67e74705SXin Li   // PGOUSE: br {{.*}} !prof ![[BL2:[0-9]+]]
396*67e74705SXin Li   while (i && i > 50)
397*67e74705SXin Li     i--;
398*67e74705SXin Li 
399*67e74705SXin Li   // PGOGEN: store {{.*}} @[[BLC]], i64 0, i64 4
400*67e74705SXin Li   // PGOGEN: store {{.*}} @[[BLC]], i64 0, i64 3
401*67e74705SXin Li   // PGOUSE: br {{.*}} !prof ![[BL3:[0-9]+]]
402*67e74705SXin Li   // PGOUSE: br {{.*}} !prof ![[BL4:[0-9]+]]
403*67e74705SXin Li   while ((i % 2) || (i > 0))
404*67e74705SXin Li     i--;
405*67e74705SXin Li 
406*67e74705SXin Li   // PGOGEN: store {{.*}} @[[BLC]], i64 0, i64 6
407*67e74705SXin Li   // PGOGEN: store {{.*}} @[[BLC]], i64 0, i64 5
408*67e74705SXin Li   // PGOUSE: br {{.*}} !prof ![[BL5:[0-9]+]]
409*67e74705SXin Li   // PGOUSE: br {{.*}} !prof ![[BL6:[0-9]+]]
410*67e74705SXin Li   for (i = 100; i && i > 50; --i);
411*67e74705SXin Li 
412*67e74705SXin Li   // PGOGEN: store {{.*}} @[[BLC]], i64 0, i64 8
413*67e74705SXin Li   // PGOGEN: store {{.*}} @[[BLC]], i64 0, i64 7
414*67e74705SXin Li   // PGOUSE: br {{.*}} !prof ![[BL7:[0-9]+]]
415*67e74705SXin Li   // PGOUSE: br {{.*}} !prof ![[BL8:[0-9]+]]
416*67e74705SXin Li   for (; (i % 2) || (i > 0); --i);
417*67e74705SXin Li 
418*67e74705SXin Li   // PGOGEN-NOT: store {{.*}} @[[BLC]],
419*67e74705SXin Li   // PGOUSE-NOT: br {{.*}} !prof ![0-9]+
420*67e74705SXin Li }
421*67e74705SXin Li 
422*67e74705SXin Li // PGOGEN-LABEL: @conditional_operator()
423*67e74705SXin Li // PGOUSE-LABEL: @conditional_operator()
424*67e74705SXin Li // PGOGEN: store {{.*}} @[[COC]], i64 0, i64 0
conditional_operator()425*67e74705SXin Li void conditional_operator() {
426*67e74705SXin Li   int i = 100;
427*67e74705SXin Li 
428*67e74705SXin Li   // PGOGEN: store {{.*}} @[[COC]], i64 0, i64 1
429*67e74705SXin Li   // PGOUSE: br {{.*}} !prof ![[CO1:[0-9]+]]
430*67e74705SXin Li   int j = i < 50 ? i : 1;
431*67e74705SXin Li 
432*67e74705SXin Li   // PGOGEN: store {{.*}} @[[COC]], i64 0, i64 2
433*67e74705SXin Li   // PGOUSE: br {{.*}} !prof ![[CO2:[0-9]+]]
434*67e74705SXin Li   int k = i ?: 0;
435*67e74705SXin Li 
436*67e74705SXin Li   // PGOGEN-NOT: store {{.*}} @[[COC]],
437*67e74705SXin Li   // PGOUSE-NOT: br {{.*}} !prof ![0-9]+
438*67e74705SXin Li }
439*67e74705SXin Li 
440*67e74705SXin Li // PGOGEN-LABEL: @do_fallthrough()
441*67e74705SXin Li // PGOUSE-LABEL: @do_fallthrough()
442*67e74705SXin Li // PGOGEN: store {{.*}} @[[DFC]], i64 0, i64 0
do_fallthrough()443*67e74705SXin Li void do_fallthrough() {
444*67e74705SXin Li   // PGOGEN: store {{.*}} @[[DFC]], i64 0, i64 1
445*67e74705SXin Li   // PGOUSE: br {{.*}} !prof ![[DF1:[0-9]+]]
446*67e74705SXin Li   for (int i = 0; i < 10; ++i) {
447*67e74705SXin Li     int j = 0;
448*67e74705SXin Li     // PGOGEN: store {{.*}} @[[DFC]], i64 0, i64 2
449*67e74705SXin Li     do {
450*67e74705SXin Li       // The number of exits out of this do-loop via the break statement
451*67e74705SXin Li       // exceeds the counter value for the loop (which does not include the
452*67e74705SXin Li       // fallthrough count). Make sure that does not violate any assertions.
453*67e74705SXin Li       // PGOGEN: store {{.*}} @[[DFC]], i64 0, i64 3
454*67e74705SXin Li       // PGOUSE: br {{.*}} !prof ![[DF3:[0-9]+]]
455*67e74705SXin Li       if (i < 8) break;
456*67e74705SXin Li       j++;
457*67e74705SXin Li     // PGOUSE: br {{.*}} !prof ![[DF2:[0-9]+]]
458*67e74705SXin Li     } while (j < 2);
459*67e74705SXin Li   }
460*67e74705SXin Li }
461*67e74705SXin Li 
462*67e74705SXin Li // PGOGEN-LABEL: @static_func()
463*67e74705SXin Li // PGOUSE-LABEL: @static_func()
464*67e74705SXin Li // PGOGEN: store {{.*}} @[[STC]], i64 0, i64 0
static_func()465*67e74705SXin Li static void static_func() {
466*67e74705SXin Li   // PGOGEN: store {{.*}} @[[STC]], i64 0, i64 1
467*67e74705SXin Li   // PGOUSE: br {{.*}} !prof ![[ST1:[0-9]+]]
468*67e74705SXin Li   for (int i = 0; i < 10; ++i) {
469*67e74705SXin Li   }
470*67e74705SXin Li }
471*67e74705SXin Li 
472*67e74705SXin Li // PGOUSE-DAG: ![[SL1]] = !{!"branch_weights", i32 101, i32 2}
473*67e74705SXin Li // PGOUSE-DAG: ![[SL2]] = !{!"branch_weights", i32 101, i32 2}
474*67e74705SXin Li // PGOUSE-DAG: ![[SL3]] = !{!"branch_weights", i32 76, i32 2}
475*67e74705SXin Li 
476*67e74705SXin Li // PGOUSE-DAG: ![[EE1]] = !{!"branch_weights", i32 1, i32 2}
477*67e74705SXin Li // PGOUSE-DAG: ![[EE2]] = !{!"branch_weights", i32 52, i32 1}
478*67e74705SXin Li // PGOUSE-DAG: ![[EE3]] = !{!"branch_weights", i32 2, i32 51}
479*67e74705SXin Li // PGOUSE-DAG: ![[EE4]] = !{!"branch_weights", i32 26, i32 26}
480*67e74705SXin Li // PGOUSE-DAG: ![[EE5]] = !{!"branch_weights", i32 2, i32 1}
481*67e74705SXin Li // PGOUSE-DAG: ![[EE6]] = !{!"branch_weights", i32 2, i32 26}
482*67e74705SXin Li // PGOUSE-DAG: ![[EE7]] = !{!"branch_weights", i32 26, i32 1}
483*67e74705SXin Li 
484*67e74705SXin Li // PGOUSE-DAG: ![[IF1]] = !{!"branch_weights", i32 101, i32 2}
485*67e74705SXin Li // PGOUSE-DAG: ![[IF2]] = !{!"branch_weights", i32 51, i32 51}
486*67e74705SXin Li // PGOUSE-DAG: ![[IF3]] = !{!"branch_weights", i32 51, i32 1}
487*67e74705SXin Li // PGOUSE-DAG: ![[IF4]] = !{!"branch_weights", i32 34, i32 18}
488*67e74705SXin Li // PGOUSE-DAG: ![[IF5]] = !{!"branch_weights", i32 34, i32 1}
489*67e74705SXin Li // PGOUSE-DAG: ![[IF6]] = !{!"branch_weights", i32 17, i32 2}
490*67e74705SXin Li // PGOUSE-DAG: ![[IF7]] = !{!"branch_weights", i32 100, i32 2}
491*67e74705SXin Li // PGOUSE-DAG: ![[IF8]] = !{!"branch_weights", i32 100, i32 2}
492*67e74705SXin Li 
493*67e74705SXin Li // PGOUSE-DAG: ![[JM1]] = !{!"branch_weights", i32 2, i32 1}
494*67e74705SXin Li // PGOUSE-DAG: ![[JM2]] = !{!"branch_weights", i32 1, i32 2}
495*67e74705SXin Li // PGOUSE-DAG: ![[JM3]] = !{!"branch_weights", i32 1, i32 2}
496*67e74705SXin Li // PGOUSE-DAG: ![[JM4]] = !{!"branch_weights", i32 1, i32 2}
497*67e74705SXin Li // PGOUSE-DAG: ![[JM5]] = !{!"branch_weights", i32 3, i32 2}
498*67e74705SXin Li // PGOUSE-DAG: ![[JM6]] = !{!"branch_weights", i32 1, i32 2}
499*67e74705SXin Li // PGOUSE-DAG: ![[JM7]] = !{!"branch_weights", i32 1, i32 2, i32 2, i32 2}
500*67e74705SXin Li // PGOUSE-DAG: ![[JM8]] = !{!"branch_weights", i32 11, i32 2}
501*67e74705SXin Li // PGOUSE-DAG: ![[JM9]] = !{!"branch_weights", i32 10, i32 2}
502*67e74705SXin Li 
503*67e74705SXin Li // PGOUSE-DAG: ![[SW1]] = !{!"branch_weights", i32 16, i32 1}
504*67e74705SXin Li // PGOUSE-DAG: ![[SW2]] = !{!"branch_weights", i32 6, i32 2, i32 3, i32 4, i32 5}
505*67e74705SXin Li // PGOUSE-DAG: ![[SW3]] = !{!"branch_weights", i32 1, i32 2}
506*67e74705SXin Li // PGOUSE-DAG: ![[SW4]] = !{!"branch_weights", i32 3, i32 2}
507*67e74705SXin Li // PGOUSE-DAG: ![[SW5]] = !{!"branch_weights", i32 4, i32 1}
508*67e74705SXin Li // PGOUSE-DAG: ![[SW6]] = !{!"branch_weights", i32 5, i32 1}
509*67e74705SXin Li // PGOUSE-DAG: ![[SW7]] = !{!"branch_weights", i32 1, i32 2, i32 2, i32 2, i32 2}
510*67e74705SXin Li // PGOUSE-DAG: ![[SW8]] = !{!"branch_weights", i32 5, i32 1}
511*67e74705SXin Li // PGOUSE-DAG: ![[SW9]] = !{!"branch_weights", i32 2, i32 5}
512*67e74705SXin Li 
513*67e74705SXin Li // PGOUSE-DAG: ![[BS1]] = !{!"branch_weights", i32 33, i32 2}
514*67e74705SXin Li // PGOUSE-DAG: ![[BS2]] = !{!"branch_weights", i32 29, i32 2, i32 2, i32 2, i32 2, i32 1}
515*67e74705SXin Li // PGOUSE-DAG: ![[BS3]] = !{!"branch_weights", i32 1, i32 2}
516*67e74705SXin Li // PGOUSE-DAG: ![[BS4]] = !{!"branch_weights", i32 2, i32 2}
517*67e74705SXin Li // PGOUSE-DAG: ![[BS5]] = !{!"branch_weights", i32 12, i32 1}
518*67e74705SXin Li // PGOUSE-DAG: ![[BS6]] = !{!"branch_weights", i32 12, i32 3}
519*67e74705SXin Li // PGOUSE-DAG: ![[BS7]] = !{!"branch_weights", i32 2, i32 1}
520*67e74705SXin Li // PGOUSE-DAG: ![[BS8]] = !{!"branch_weights", i32 16, i32 1}
521*67e74705SXin Li // PGOUSE-DAG: ![[BS9]] = !{!"branch_weights", i32 16, i32 14}
522*67e74705SXin Li // PGOUSE-DAG: ![[BS10]] = !{!"branch_weights", i32 2, i32 1}
523*67e74705SXin Li // PGOUSE-DAG: ![[BS11]] = !{!"branch_weights", i32 3, i32 1}
524*67e74705SXin Li 
525*67e74705SXin Li // PGOUSE-DAG: ![[BO1]] = !{!"branch_weights", i32 101, i32 2}
526*67e74705SXin Li // PGOUSE-DAG: ![[BO2]] = !{!"branch_weights", i32 67, i32 35}
527*67e74705SXin Li // PGOUSE-DAG: ![[BO3]] = !{!"branch_weights", i32 67, i32 35}
528*67e74705SXin Li // PGOUSE-DAG: ![[BO4]] = !{!"branch_weights", i32 67, i32 35}
529*67e74705SXin Li // PGOUSE-DAG: ![[BO5]] = !{!"branch_weights", i32 18, i32 18}
530*67e74705SXin Li // PGOUSE-DAG: ![[BO6]] = !{!"branch_weights", i32 51, i32 51}
531*67e74705SXin Li // PGOUSE-DAG: ![[BO7]] = !{!"branch_weights", i32 34, i32 18}
532*67e74705SXin Li // PGOUSE-DAG: ![[BL1]] = !{!"branch_weights", i32 52, i32 1}
533*67e74705SXin Li // PGOUSE-DAG: ![[BL2]] = !{!"branch_weights", i32 51, i32 2}
534*67e74705SXin Li // PGOUSE-DAG: ![[BL3]] = !{!"branch_weights", i32 26, i32 27}
535*67e74705SXin Li // PGOUSE-DAG: ![[BL4]] = !{!"branch_weights", i32 51, i32 2}
536*67e74705SXin Li // PGOUSE-DAG: ![[BL5]] = !{!"branch_weights", i32 52, i32 1}
537*67e74705SXin Li // PGOUSE-DAG: ![[BL6]] = !{!"branch_weights", i32 51, i32 2}
538*67e74705SXin Li // PGOUSE-DAG: ![[BL7]] = !{!"branch_weights", i32 26, i32 27}
539*67e74705SXin Li // PGOUSE-DAG: ![[BL8]] = !{!"branch_weights", i32 51, i32 2}
540*67e74705SXin Li // PGOUSE-DAG: ![[CO1]] = !{!"branch_weights", i32 1, i32 2}
541*67e74705SXin Li // PGOUSE-DAG: ![[CO2]] = !{!"branch_weights", i32 2, i32 1}
542*67e74705SXin Li 
543*67e74705SXin Li // PGOUSE-DAG: ![[DF1]] = !{!"branch_weights", i32 11, i32 2}
544*67e74705SXin Li // PGOUSE-DAG: ![[DF2]] = !{!"branch_weights", i32 3, i32 3}
545*67e74705SXin Li // PGOUSE-DAG: ![[DF3]] = !{!"branch_weights", i32 9, i32 5}
546*67e74705SXin Li 
547*67e74705SXin Li // PGOUSE-DAG: ![[ST1]] = !{!"branch_weights", i32 11, i32 2}
548*67e74705SXin Li 
main(int argc,const char * argv[])549*67e74705SXin Li int main(int argc, const char *argv[]) {
550*67e74705SXin Li   simple_loops();
551*67e74705SXin Li   conditionals();
552*67e74705SXin Li   early_exits();
553*67e74705SXin Li   jumps();
554*67e74705SXin Li   switches();
555*67e74705SXin Li   big_switch();
556*67e74705SXin Li   boolean_operators();
557*67e74705SXin Li   boolop_loops();
558*67e74705SXin Li   conditional_operator();
559*67e74705SXin Li   do_fallthrough();
560*67e74705SXin Li   static_func();
561*67e74705SXin Li   return 0;
562*67e74705SXin Li }
563