1*67e74705SXin Li // Blocks that we have no profile data for (ie, it was never reached in training
2*67e74705SXin Li // runs) shouldn't have any branch weight metadata added.
3*67e74705SXin Li
4*67e74705SXin Li // RUN: llvm-profdata merge %S/Inputs/c-unprofiled-blocks.proftext -o %t.profdata
5*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -main-file-name c-unprofiled-blocks.c %s -o - -emit-llvm -fprofile-instrument-use-path=%t.profdata | FileCheck -check-prefix=PGOUSE %s
6*67e74705SXin Li
7*67e74705SXin Li // PGOUSE-LABEL: @never_called(i32 %i)
never_called(int i)8*67e74705SXin Li int never_called(int i) {
9*67e74705SXin Li // PGOUSE: br i1 %{{[^,]*}}, label %{{[^,]*}}, label %{{[^,]*}}{{$}}
10*67e74705SXin Li if (i) {}
11*67e74705SXin Li
12*67e74705SXin Li // PGOUSE: br i1 %{{[^,]*}}, label %{{[^,]*}}, label %{{[^,]*}}{{$}}
13*67e74705SXin Li for (i = 0; i < 100; ++i) {
14*67e74705SXin Li }
15*67e74705SXin Li
16*67e74705SXin Li // PGOUSE: br i1 %{{[^,]*}}, label %{{[^,]*}}, label %{{[^,]*}}{{$}}
17*67e74705SXin Li while (--i) {}
18*67e74705SXin Li
19*67e74705SXin Li // PGOUSE: br i1 %{{[^,]*}}, label %{{[^,]*}}, label %{{[^,]*}}{{$}}
20*67e74705SXin Li do {} while (i++ < 75);
21*67e74705SXin Li
22*67e74705SXin Li // PGOUSE: switch {{.*}} [
23*67e74705SXin Li // PGOUSE-NEXT: i32 12
24*67e74705SXin Li // PGOUSE-NEXT: i32 82
25*67e74705SXin Li // PGOUSE-NEXT: ]{{$}}
26*67e74705SXin Li switch (i) {
27*67e74705SXin Li case 12: return 3;
28*67e74705SXin Li case 82: return 0;
29*67e74705SXin Li default: return 89;
30*67e74705SXin Li }
31*67e74705SXin Li }
32*67e74705SXin Li
33*67e74705SXin Li // PGOUSE-LABEL: @dead_code(i32 %i)
dead_code(int i)34*67e74705SXin Li int dead_code(int i) {
35*67e74705SXin Li // PGOUSE: br {{.*}}, !prof !{{[0-9]+}}
36*67e74705SXin Li if (i) {
37*67e74705SXin Li // This branch is never reached.
38*67e74705SXin Li
39*67e74705SXin Li // PGOUSE: br i1 %{{[^,]*}}, label %{{[^,]*}}, label %{{[^,]*}}{{$}}
40*67e74705SXin Li if (!i) {}
41*67e74705SXin Li
42*67e74705SXin Li // PGOUSE: br i1 %{{[^,]*}}, label %{{[^,]*}}, label %{{[^,]*}}{{$}}
43*67e74705SXin Li for (i = 0; i < 100; ++i) {
44*67e74705SXin Li }
45*67e74705SXin Li
46*67e74705SXin Li // PGOUSE: br i1 %{{[^,]*}}, label %{{[^,]*}}, label %{{[^,]*}}{{$}}
47*67e74705SXin Li while (--i) {}
48*67e74705SXin Li
49*67e74705SXin Li // PGOUSE: br i1 %{{[^,]*}}, label %{{[^,]*}}, label %{{[^,]*}}{{$}}
50*67e74705SXin Li do {} while (i++ < 75);
51*67e74705SXin Li
52*67e74705SXin Li // PGOUSE: switch {{.*}} [
53*67e74705SXin Li // PGOUSE-NEXT: i32 12
54*67e74705SXin Li // PGOUSE-NEXT: i32 82
55*67e74705SXin Li // PGOUSE-NEXT: ]{{$}}
56*67e74705SXin Li switch (i) {
57*67e74705SXin Li case 12: return 3;
58*67e74705SXin Li case 82: return 0;
59*67e74705SXin Li default: return 89;
60*67e74705SXin Li }
61*67e74705SXin Li }
62*67e74705SXin Li return 2;
63*67e74705SXin Li }
64*67e74705SXin Li
65*67e74705SXin Li // PGOUSE-LABEL: @main(i32 %argc, i8** %argv)
main(int argc,const char * argv[])66*67e74705SXin Li int main(int argc, const char *argv[]) {
67*67e74705SXin Li dead_code(0);
68*67e74705SXin Li return 0;
69*67e74705SXin Li }
70