blob: 5fb7a67a7d9e83c57696e8217ab6a31645049495 [file] [log] [blame]
Mark de Wever2bcda6b2020-10-18 13:34:41 +02001// RUN: %clang_cc1 -O1 -disable-llvm-passes -emit-llvm %s -o - -triple=x86_64-linux-gnu | FileCheck %s
2
3extern volatile int i;
4
5void OneCaseL() {
6 // CHECK-LABEL: define{{.*}}OneCaseL
7 // CHECK: switch
8 // CHECK: {{.*}} !prof !6
9 switch (i) {
10 [[likely]] case 1: break;
11 }
12}
13
14void OneCaseU() {
15 // CHECK-LABEL: define{{.*}}OneCaseU
16 // CHECK: switch
17 // CHECK: {{.*}} !prof !7
18 switch (i) {
19 [[unlikely]] case 1: ++i; break;
20 }
21}
22
23void TwoCasesLN() {
24 // CHECK-LABEL: define{{.*}}TwoCasesLN
25 // CHECK: switch
26 // CHECK: {{.*}} !prof !8
27 switch (i) {
28 [[likely]] case 1: break;
29 case 2: break;
30 }
31}
32
33void TwoCasesUN() {
34 // CHECK-LABEL: define{{.*}}TwoCasesUN
35 // CHECK: switch
36 // CHECK: {{.*}} !prof !9
37 switch (i) {
38 [[unlikely]] case 1: break;
39 case 2: break;
40 }
41}
42
43void TwoCasesLU() {
44 // CHECK-LABEL: define{{.*}}TwoCasesLU
45 // CHECK: switch
46 // CHECK: {{.*}} !prof !10
47 switch (i) {
48 [[likely]] case 1: break;
49 [[unlikely]] case 2: break;
50 }
51}
52
53void CasesFallthroughNNLN() {
54 // CHECK-LABEL: define{{.*}}CasesFallthroughNNLN
55 // CHECK: switch
56 // CHECK: {{.*}} !prof !11
57 switch (i) {
58 case 1:
59 case 2:
60 [[likely]] case 3:
61 case 4: break;
62 }
63}
64
65void CasesFallthroughNNUN() {
66 // CHECK-LABEL: define{{.*}}CasesFallthroughNNUN
67 // CHECK: switch
68 // CHECK: {{.*}} !prof !12
69 switch (i) {
70 case 1:
71 case 2:
72 [[unlikely]] case 3:
73 case 4: break;
74 }
75}
76
77void CasesFallthroughRangeSmallLN() {
78 // CHECK-LABEL: define{{.*}}CasesFallthroughRangeSmallLN
79 // CHECK: switch
80 // CHECK: {{.*}} !prof !13
81 switch (i) {
82 case 1 ... 5: ++i;
83 case 102:
84 [[likely]] case 103:
85 case 104: break;
86 }
87}
88
89void CasesFallthroughRangeSmallUN() {
90 // CHECK-LABEL: define{{.*}}CasesFallthroughRangeSmallUN
91 // CHECK: switch
92 // CHECK: {{.*}} !prof !14
93 switch (i) {
94 case 1 ... 5: ++i;
95 case 102:
96 [[unlikely]] case 103:
97 case 104: break;
98 }
99}
100
101void CasesFallthroughRangeLargeLLN() {
102 // CHECK-LABEL: define{{.*}}CasesFallthroughRangeLargeLLN
103 // CHECK: switch
104 // CHECK: {{.*}} !prof !8
105 // CHECK: caserange
106 // CHECK: br{{.*}} !prof !15
107 switch (i) {
108 [[likely]] case 0 ... 64:
109 [[likely]] case 1003:
110 case 104: break;
111 }
112}
113
114void CasesFallthroughRangeLargeUUN() {
115 // CHECK-LABEL: define{{.*}}CasesFallthroughRangeLargeUUN
116 // CHECK: switch
117 // CHECK: {{.*}} !prof !9
118 // CHECK: caserange
119 // CHECK: br{{.*}} !prof !16
120 switch (i) {
121 [[unlikely]] case 0 ... 64:
122 [[unlikely]] case 1003:
123 case 104: break;
124 }
125}
126
127void OneCaseDefaultL() {
128 // CHECK-LABEL: define{{.*}}OneCaseDefaultL
129 // CHECK: switch
130 // CHECK: {{.*}} !prof !17
131 switch (i) {
132 case 1: break;
133 [[likely]] default: break;
134 }
135}
136
137void OneCaseDefaultU() {
138 // CHECK-LABEL: define{{.*}}OneCaseDefaultU
139 // CHECK: switch
140 // CHECK: {{.*}} !prof !18
141 switch (i) {
142 case 1: break;
143 [[unlikely]] default: break;
144 }
145}
146
147void TwoCasesDefaultLNL() {
148 // CHECK-LABEL: define{{.*}}TwoCasesDefaultLNL
149 // CHECK: switch
150 // CHECK: {{.*}} !prof !19
151 switch (i) {
152 [[likely]] case 1: break;
153 case 2: break;
154 [[likely]] default: break;
155 }
156}
157
158void TwoCasesDefaultLNN() {
159 // CHECK-LABEL: define{{.*}}TwoCasesDefaultLNN
160 // CHECK: switch
161 // CHECK: {{.*}} !prof !8
162 switch (i) {
163 [[likely]] case 1: break;
164 case 2: break;
165 default: break;
166 }
167}
168
169void TwoCasesDefaultLNU() {
170 // CHECK-LABEL: define{{.*}}TwoCasesDefaultLNU
171 // CHECK: switch
172 // CHECK: {{.*}} !prof !20
173 switch (i) {
174 [[likely]] case 1: break;
175 case 2: break;
176 [[unlikely]] default: break;
177 }
178}
179
Arthur Eubanks5c31b8b2020-10-31 00:15:46 -0700180// CHECK: !6 = !{!"branch_weights", i32 357913942, i32 715827883}
181// CHECK: !7 = !{!"branch_weights", i32 536870912, i32 1}
182// CHECK: !8 = !{!"branch_weights", i32 238609295, i32 715827883, i32 238609295}
183// CHECK: !9 = !{!"branch_weights", i32 357913942, i32 1, i32 357913942}
184// CHECK: !10 = !{!"branch_weights", i32 357913942, i32 715827883, i32 1}
185// CHECK: !11 = !{!"branch_weights", i32 143165577, i32 143165577, i32 143165577, i32 715827883, i32 143165577}
186// CHECK: !12 = !{!"branch_weights", i32 214748365, i32 214748365, i32 214748365, i32 1, i32 214748365}
187// CHECK: !13 = !{!"branch_weights", i32 79536432, i32 79536432, i32 79536432, i32 79536432, i32 79536432, i32 79536432, i32 79536432, i32 715827883, i32 79536432}
188// CHECK: !14 = !{!"branch_weights", i32 119304648, i32 119304648, i32 119304648, i32 119304648, i32 119304648, i32 119304648, i32 119304648, i32 1, i32 119304648}
189// CHECK: !15 = !{!"branch_weights", i32 2000, i32 1}
190// CHECK: !16 = !{!"branch_weights", i32 1, i32 2000}
191// CHECK: !17 = !{!"branch_weights", i32 715827883, i32 357913942}
192// CHECK: !18 = !{!"branch_weights", i32 1, i32 536870912}
193// CHECK: !19 = !{!"branch_weights", i32 536870912, i32 536870912, i32 268435456}
194// CHECK: !20 = !{!"branch_weights", i32 1, i32 715827883, i32 357913942}