xref: /aosp_15_r20/external/clang/test/Profile/c-unprofiled-blocks.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
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