1 // RUN: %clang_cc1 -O1 -disable-llvm-passes -emit-llvm %s -o - -triple=x86_64-linux-gnu -verify
2 // RUN: %clang_cc1 -O1 -disable-llvm-passes -emit-llvm %s -o - -triple=x86_64-linux-gnu | FileCheck %s
3 
4 void wl(int e){
5   // CHECK-LABEL: define{{.*}}wl
6   // CHECK: br {{.*}} !prof !6
7   while(e) [[likely]] ++e;
8 }
9 
10 void wu(int e){
11   // CHECK-LABEL: define{{.*}}wu
12   // CHECK: br {{.*}} !prof !10
13   while(e) [[unlikely]] ++e;
14 }
15 
16 void w_branch_elided(unsigned e){
17   // CHECK-LABEL: define{{.*}}w_branch_elided
18   // CHECK-NOT: br {{.*}} !prof
19   // expected-warning@+2 {{attribute 'likely' has no effect when annotating an infinite loop}}
20   // expected-note@+1 {{annotating the infinite loop here}}
21   while(1) [[likely]] ++e;
22 }
23 
24 void fl(unsigned e)
25 {
26   // CHECK-LABEL: define{{.*}}fl
27   // CHECK: br {{.*}} !prof !6
28   for(int i = 0; i != e; ++e) [[likely]];
29 }
30 
31 void fu(int e)
32 {
33   // CHECK-LABEL: define{{.*}}fu
34   // CHECK: br {{.*}} !prof !10
35   for(int i = 0; i != e; ++e) [[unlikely]];
36 }
37 
38 void f_branch_elided()
39 {
40   // CHECK-LABEL: define{{.*}}f_branch_elided
41   // CHECK-NOT: br {{.*}} !prof
42   for(;;) [[likely]];
43 }
44 
45 void frl(int (&&e) [4])
46 {
47   // CHECK-LABEL: define{{.*}}frl
48   // CHECK: br {{.*}} !prof !6
49   for(int i : e) [[likely]];
50 }
51 
52 void fru(int (&&e) [4])
53 {
54   // CHECK-LABEL: define{{.*}}fru
55   // CHECK: br {{.*}} !prof !10
56   for(int i : e) [[unlikely]];
57 }
58 
59 // CHECK: !6 = !{!"branch_weights", i32 2000, i32 1}
60 // CHECK: !10 = !{!"branch_weights", i32 1, i32 2000}
61