• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: llc -mtriple=x86_64-linux-gnu %s -o - -jump-table-density=40 -switch-peel-threshold=101 -verify-machineinstrs | FileCheck %s
2; RUN: llc -mtriple=x86_64-linux-gnu %s -o - -O0 -jump-table-density=40 -verify-machineinstrs | FileCheck --check-prefix=NOOPT %s
3
4declare void @g(i32)
5
6define void @basic(i32 %x) {
7entry:
8  switch i32 %x, label %return [
9    i32 3, label %bb0
10    i32 1, label %bb1
11    i32 4, label %bb1
12    i32 5, label %bb2
13  ]
14bb0: tail call void @g(i32 0) br label %return
15bb1: tail call void @g(i32 1) br label %return
16bb2: tail call void @g(i32 1) br label %return
17return: ret void
18
19; Lowered as a jump table, both with and without optimization.
20; CHECK-LABEL: basic
21; CHECK: decl
22; CHECK: cmpl $4
23; CHECK: ja
24; CHECK: jmpq *.LJTI
25; NOOPT-LABEL: basic
26; NOOPT: decl
27; NOOPT: subl $4
28; NOOPT: ja
29; NOOPT: movq .LJTI
30; NOOPT: jmpq
31}
32
33; Should never be lowered as a jump table because of the attribute
34define void @basic_nojumptable(i32 %x) "no-jump-tables"="true" {
35entry:
36  switch i32 %x, label %return [
37    i32 3, label %bb0
38    i32 1, label %bb1
39    i32 4, label %bb1
40    i32 5, label %bb2
41  ]
42bb0: tail call void @g(i32 0) br label %return
43bb1: tail call void @g(i32 1) br label %return
44bb2: tail call void @g(i32 1) br label %return
45return: ret void
46
47; Lowered as a jump table, both with and without optimization.
48; CHECK-LABEL: basic_nojumptable
49; CHECK-NOT: jmpq *.LJTI
50}
51
52; Should be lowered as a jump table because of the attribute
53define void @basic_nojumptable_false(i32 %x) "no-jump-tables"="false" {
54entry:
55  switch i32 %x, label %return [
56    i32 3, label %bb0
57    i32 1, label %bb1
58    i32 4, label %bb1
59    i32 5, label %bb2
60  ]
61bb0: tail call void @g(i32 0) br label %return
62bb1: tail call void @g(i32 1) br label %return
63bb2: tail call void @g(i32 1) br label %return
64return: ret void
65
66; Lowered as a jump table, both with and without optimization.
67; CHECK-LABEL: basic_nojumptable_false
68; CHECK: decl
69; CHECK: cmpl $4
70; CHECK: ja
71; CHECK: jmpq *.LJTI
72}
73
74
75define void @simple_ranges(i32 %x) {
76entry:
77  switch i32 %x, label %return [
78    i32 0, label %bb0
79    i32 1, label %bb0
80    i32 2, label %bb0
81    i32 3, label %bb0
82    i32 100, label %bb1
83    i32 101, label %bb1
84    i32 102, label %bb1
85    i32 103, label %bb1
86  ]
87bb0: tail call void @g(i32 0) br label %return
88bb1: tail call void @g(i32 1) br label %return
89return: ret void
90
91
92
93; Should be lowered to two range checks.
94; CHECK-LABEL: simple_ranges
95; CHECK: leal -100
96; CHECK: cmpl $4
97; CHECK: jb
98; CHECK: cmpl $3
99; CHECK: ja
100
101; We do this even at -O0, because it's cheap and makes codegen faster.
102; NOOPT-LABEL: simple_ranges
103; NOOPT: subl $4
104; NOOPT: jb
105; NOOPT: addl $-100
106; NOOPT: subl $4
107; NOOPT: jb
108}
109
110
111define void @jt_is_better(i32 %x) {
112entry:
113  switch i32 %x, label %return [
114    i32 0, label %bb0
115    i32 2, label %bb0
116    i32 4, label %bb0
117    i32 1, label %bb1
118    i32 3, label %bb1
119    i32 5, label %bb1
120
121    i32 6, label %bb2
122    i32 7, label %bb3
123    i32 8, label %bb4
124  ]
125bb0: tail call void @g(i32 0) br label %return
126bb1: tail call void @g(i32 1) br label %return
127bb2: tail call void @g(i32 2) br label %return
128bb3: tail call void @g(i32 3) br label %return
129bb4: tail call void @g(i32 4) br label %return
130return: ret void
131
132; Cases 0-5 could be lowered with two bit tests,
133; but with 6-8, the whole switch is suitable for a jump table.
134; CHECK-LABEL: jt_is_better
135; CHECK: cmpl $8
136; CHECK: ja
137; CHECK: jmpq *.LJTI
138}
139
140
141define void @bt_is_better(i32 %x) {
142entry:
143  switch i32 %x, label %return [
144    i32 0, label %bb0
145    i32 3, label %bb0
146    i32 6, label %bb0
147    i32 1, label %bb1
148    i32 4, label %bb1
149    i32 7, label %bb1
150    i32 2, label %bb2
151    i32 5, label %bb2
152    i32 8, label %bb2
153  ]
154bb0: tail call void @g(i32 0) br label %return
155bb1: tail call void @g(i32 1) br label %return
156bb2: tail call void @g(i32 2) br label %return
157return: ret void
158
159; This could be lowered as a jump table, but bit tests is more efficient.
160; CHECK-LABEL: bt_is_better
161; The bit test on 2,5,8 is unnecessary as all cases cover the rage [0, 8].
162; The range check guarantees that cases other than 0,3,6 and 1,4,7 must be
163; in 2,5,8.
164;
165; 73 = 2^0 + 2^3 + 2^6
166; CHECK: movl $73
167; CHECK: btl
168; 146 = 2^1 + 2^4 + 2^7
169; CHECK: movl $146
170; CHECK: btl
171; 292 = 2^2 + 2^5 + 2^8
172; CHECK-NOT: movl $292
173; CHECK-NOT: btl
174}
175
176define void @bt_is_better2(i32 %x) {
177entry:
178  switch i32 %x, label %return [
179    i32 0, label %bb0
180    i32 3, label %bb0
181    i32 6, label %bb0
182    i32 1, label %bb1
183    i32 4, label %bb1
184    i32 7, label %bb1
185    i32 2, label %bb2
186    i32 8, label %bb2
187  ]
188bb0: tail call void @g(i32 0) br label %return
189bb1: tail call void @g(i32 1) br label %return
190bb2: tail call void @g(i32 2) br label %return
191return: ret void
192
193; This will also be lowered as bit test, but as the range [0,8] is not fully
194; covered (5 missing), the default statement can be jumped to and we end up
195; with one more branch.
196; CHECK-LABEL: bt_is_better2
197;
198; 73 = 2^0 + 2^3 + 2^6
199; CHECK: movl $73
200; CHECK: btl
201; 146 = 2^1 + 2^4 + 2^7
202; CHECK: movl $146
203; CHECK: btl
204; 260 = 2^2 + 2^8
205; CHECK: movl $260
206; CHECK: btl
207}
208
209define void @bt_is_better3(i32 %x) {
210entry:
211  switch i32 %x, label %return [
212    i32 10, label %bb0
213    i32 13, label %bb0
214    i32 16, label %bb0
215    i32 11, label %bb1
216    i32 14, label %bb1
217    i32 17, label %bb1
218    i32 12, label %bb2
219    i32 18, label %bb2
220  ]
221bb0: tail call void @g(i32 0) br label %return
222bb1: tail call void @g(i32 1) br label %return
223bb2: tail call void @g(i32 2) br label %return
224return: ret void
225
226; We don't have to subtract 10 from the case value to let the range become
227; [0, 8], as each value in the range [10, 18] can be represented by bits in a
228; word. Then we still need a branch to jump to the default statement for the
229; range [0, 10).
230; CHECK-LABEL: bt_is_better3
231;
232; 74752 = 2^10 + 2^13 + 2^16
233; CHECK: movl $74752
234; CHECK: btl
235; 149504 = 2^11 + 2^14 + 2^17
236; CHECK: movl $149504
237; CHECK: btl
238; 266240 = 2^12 + 2^15 + 2^18
239; CHECK: movl $266240
240; CHECK: btl
241}
242
243
244define void @optimal_pivot1(i32 %x) {
245entry:
246  switch i32 %x, label %return [
247    i32 100, label %bb0
248    i32 200, label %bb1
249    i32 300, label %bb0
250    i32 400, label %bb1
251    i32 500, label %bb0
252    i32 600, label %bb1
253
254  ]
255bb0: tail call void @g(i32 0) br label %return
256bb1: tail call void @g(i32 1) br label %return
257return: ret void
258
259; Should pivot around 400 for two subtrees of equal size.
260; CHECK-LABEL: optimal_pivot1
261; CHECK-NOT: cmpl
262; CHECK: cmpl $399
263}
264
265
266define void @optimal_pivot2(i32 %x) {
267entry:
268  switch i32 %x, label %return [
269    i32 100, label %bb0   i32 101, label %bb1   i32 102, label %bb2   i32 103, label %bb3
270    i32 200, label %bb0   i32 201, label %bb1   i32 202, label %bb2   i32 203, label %bb3
271    i32 300, label %bb0   i32 301, label %bb1   i32 302, label %bb2   i32 303, label %bb3
272    i32 400, label %bb0   i32 401, label %bb1   i32 402, label %bb2   i32 403, label %bb3
273
274  ]
275bb0: tail call void @g(i32 0) br label %return
276bb1: tail call void @g(i32 1) br label %return
277bb2: tail call void @g(i32 2) br label %return
278bb3: tail call void @g(i32 3) br label %return
279return: ret void
280
281; Should pivot around 300 for two subtrees with two jump tables each.
282; CHECK-LABEL: optimal_pivot2
283; CHECK-NOT: cmpl
284; CHECK: cmpl $299
285; CHECK: jmpq *.LJTI
286; CHECK: jmpq *.LJTI
287; CHECK: jmpq *.LJTI
288; CHECK: jmpq *.LJTI
289}
290
291
292define void @optimal_jump_table1(i32 %x) {
293entry:
294  switch i32 %x, label %return [
295    i32 0,  label %bb0
296    i32 5,  label %bb1
297    i32 6,  label %bb2
298    i32 12, label %bb3
299    i32 13, label %bb4
300    i32 15, label %bb5
301  ]
302bb0: tail call void @g(i32 0) br label %return
303bb1: tail call void @g(i32 1) br label %return
304bb2: tail call void @g(i32 2) br label %return
305bb3: tail call void @g(i32 3) br label %return
306bb4: tail call void @g(i32 4) br label %return
307bb5: tail call void @g(i32 5) br label %return
308return: ret void
309
310; Splitting in the largest gap (between 6 and 12) would yield suboptimal result.
311; Expecting a jump table from 5 to 15.
312; CHECK-LABEL: optimal_jump_table1
313; CHECK: leal -5
314; CHECK: cmpl $10
315; CHECK: jmpq *.LJTI
316
317; At -O0, we don't build jump tables for only parts of a switch.
318; NOOPT-LABEL: optimal_jump_table1
319; NOOPT: testl %edi, %edi
320; NOOPT: je
321; NOOPT: subl $5, %eax
322; NOOPT: je
323; NOOPT: subl $6, %eax
324; NOOPT: je
325; NOOPT: subl $12, %eax
326; NOOPT: je
327; NOOPT: subl $13, %eax
328; NOOPT: je
329; NOOPT: subl $15, %eax
330; NOOPT: je
331}
332
333
334define void @optimal_jump_table2(i32 %x) {
335entry:
336  switch i32 %x, label %return [
337    i32 0,  label %bb0
338    i32 1,  label %bb1
339    i32 2,  label %bb2
340    i32 9,  label %bb3
341    i32 14, label %bb4
342    i32 15, label %bb5
343  ]
344bb0: tail call void @g(i32 0) br label %return
345bb1: tail call void @g(i32 1) br label %return
346bb2: tail call void @g(i32 2) br label %return
347bb3: tail call void @g(i32 3) br label %return
348bb4: tail call void @g(i32 4) br label %return
349bb5: tail call void @g(i32 5) br label %return
350return: ret void
351
352; Partitioning the cases to the minimum number of dense sets is not good enough.
353; This can be partitioned as {0,1,2,9},{14,15} or {0,1,2},{9,14,15}. The former
354; should be preferred. Expecting a table from 0-9.
355; CHECK-LABEL: optimal_jump_table2
356; CHECK: cmpl $9
357; CHECK: jmpq *.LJTI
358}
359
360
361define void @optimal_jump_table3(i32 %x) {
362entry:
363  switch i32 %x, label %return [
364    i32 1,  label %bb0
365    i32 2,  label %bb1
366    i32 3,  label %bb2
367    i32 10, label %bb3
368    i32 13, label %bb0
369    i32 14, label %bb1
370    i32 15, label %bb2
371    i32 20, label %bb3
372    i32 25, label %bb4
373  ]
374bb0: tail call void @g(i32 0) br label %return
375bb1: tail call void @g(i32 1) br label %return
376bb2: tail call void @g(i32 2) br label %return
377bb3: tail call void @g(i32 3) br label %return
378bb4: tail call void @g(i32 4) br label %return
379return: ret void
380
381; Splitting to maximize left-right density sum and gap size would split this
382; between 3 and 10, and then between 20 and 25. It's better to build a table
383; from 1-20.
384; CHECK-LABEL: optimal_jump_table3
385; CHECK: leal -1
386; CHECK: cmpl $19
387; CHECK: jmpq *.LJTI
388}
389
390%struct.S = type { %struct.S*, i32 }
391define void @phi_node_trouble(%struct.S* %s) {
392entry:
393  br label %header
394header:
395  %ptr = phi %struct.S* [ %s, %entry ], [ %next, %loop ]
396  %bool = icmp eq %struct.S* %ptr, null
397  br i1 %bool, label %exit, label %loop
398loop:
399  %nextptr = getelementptr inbounds %struct.S, %struct.S* %ptr, i64 0, i32 0
400  %next = load %struct.S*, %struct.S** %nextptr
401  %xptr = getelementptr inbounds %struct.S, %struct.S* %next, i64 0, i32 1
402  %x = load i32, i32* %xptr
403  switch i32 %x, label %exit [
404    i32 4, label %header
405    i32 36, label %exit2
406    i32 69, label %exit2
407    i32 25, label %exit2
408  ]
409exit:
410  ret void
411exit2:
412  ret void
413
414; This will be lowered to a comparison with 4 and then bit tests. Make sure
415; that the phi node in %header gets a value from the comparison block.
416; CHECK-LABEL: phi_node_trouble
417; CHECK: movq (%[[REG1:[a-z]+]]), %[[REG1]]
418; CHECK: movl 8(%[[REG1]]), %[[REG2:[a-z]+]]
419; CHECK: cmpl $4, %[[REG2]]
420}
421
422
423define void @default_only(i32 %x) {
424entry:
425  br label %sw
426return:
427  ret void
428sw:
429  switch i32 %x, label %return [
430  ]
431
432; Branch directly to the default.
433; (In optimized builds the switch is removed earlier.)
434; NOOPT-LABEL: default_only
435; NOOPT: .LBB[[L:[A-Z0-9_]+]]:
436; NOOPT-NEXT: retq
437; NOOPT: jmp .LBB[[L]]
438}
439
440
441define void @int_max_table_cluster(i8 %x) {
442entry:
443  switch i8 %x, label %return [
444    i8 0, label %bb0 i8 1, label %bb0 i8 2, label %bb0 i8 3, label %bb0
445    i8 4, label %bb0 i8 5, label %bb0 i8 6, label %bb0 i8 7, label %bb0
446    i8 8, label %bb0 i8 9, label %bb0 i8 10, label %bb0 i8 11, label %bb0
447    i8 12, label %bb0 i8 13, label %bb0 i8 14, label %bb0 i8 15, label %bb0
448    i8 16, label %bb0 i8 17, label %bb0 i8 18, label %bb0 i8 19, label %bb0
449    i8 20, label %bb0 i8 21, label %bb0 i8 22, label %bb0 i8 23, label %bb0
450    i8 24, label %bb0 i8 25, label %bb0 i8 26, label %bb0 i8 27, label %bb0
451    i8 28, label %bb0 i8 29, label %bb0 i8 30, label %bb0 i8 31, label %bb0
452    i8 32, label %bb0 i8 33, label %bb0 i8 34, label %bb0 i8 35, label %bb0
453    i8 36, label %bb0 i8 37, label %bb0 i8 38, label %bb0 i8 39, label %bb0
454    i8 40, label %bb0 i8 41, label %bb0 i8 42, label %bb0 i8 43, label %bb0
455    i8 44, label %bb0 i8 45, label %bb0 i8 46, label %bb0 i8 47, label %bb0
456    i8 48, label %bb0 i8 49, label %bb0 i8 50, label %bb0 i8 51, label %bb0
457    i8 52, label %bb0 i8 53, label %bb0 i8 54, label %bb0 i8 55, label %bb0
458    i8 56, label %bb0 i8 57, label %bb0 i8 58, label %bb0 i8 59, label %bb0
459    i8 60, label %bb0 i8 61, label %bb0 i8 62, label %bb0 i8 63, label %bb0
460    i8 64, label %bb0 i8 65, label %bb0 i8 66, label %bb0 i8 67, label %bb0
461    i8 68, label %bb0 i8 69, label %bb0 i8 70, label %bb0 i8 71, label %bb0
462    i8 72, label %bb0 i8 73, label %bb0 i8 74, label %bb0 i8 75, label %bb0
463    i8 76, label %bb0 i8 77, label %bb0 i8 78, label %bb0 i8 79, label %bb0
464    i8 80, label %bb0 i8 81, label %bb0 i8 82, label %bb0 i8 83, label %bb0
465    i8 84, label %bb0 i8 85, label %bb0 i8 86, label %bb0 i8 87, label %bb0
466    i8 88, label %bb0 i8 89, label %bb0 i8 90, label %bb0 i8 91, label %bb0
467    i8 92, label %bb0 i8 93, label %bb0 i8 94, label %bb0 i8 95, label %bb0
468    i8 96, label %bb0 i8 97, label %bb0 i8 98, label %bb0 i8 99, label %bb0
469    i8 100, label %bb0 i8 101, label %bb0 i8 102, label %bb0 i8 103, label %bb0
470    i8 104, label %bb0 i8 105, label %bb0 i8 106, label %bb0 i8 107, label %bb0
471    i8 108, label %bb0 i8 109, label %bb0 i8 110, label %bb0 i8 111, label %bb0
472    i8 112, label %bb0 i8 113, label %bb0 i8 114, label %bb0 i8 115, label %bb0
473    i8 116, label %bb0 i8 117, label %bb0 i8 118, label %bb0 i8 119, label %bb0
474    i8 120, label %bb0 i8 121, label %bb0 i8 122, label %bb0 i8 123, label %bb0
475    i8 124, label %bb0 i8 125, label %bb0 i8 126, label %bb0 i8 127, label %bb0
476    i8 -64, label %bb1 i8 -63, label %bb1 i8 -62, label %bb1 i8 -61, label %bb1
477    i8 -60, label %bb1 i8 -59, label %bb1 i8 -58, label %bb1 i8 -57, label %bb1
478    i8 -56, label %bb1 i8 -55, label %bb1 i8 -54, label %bb1 i8 -53, label %bb1
479    i8 -52, label %bb1 i8 -51, label %bb1 i8 -50, label %bb1 i8 -49, label %bb1
480    i8 -48, label %bb1 i8 -47, label %bb1 i8 -46, label %bb1 i8 -45, label %bb1
481    i8 -44, label %bb1 i8 -43, label %bb1 i8 -42, label %bb1 i8 -41, label %bb1
482    i8 -40, label %bb1 i8 -39, label %bb1 i8 -38, label %bb1 i8 -37, label %bb1
483    i8 -36, label %bb1 i8 -35, label %bb1 i8 -34, label %bb1 i8 -33, label %bb1
484    i8 -32, label %bb2 i8 -31, label %bb2 i8 -30, label %bb2 i8 -29, label %bb2
485    i8 -28, label %bb2 i8 -27, label %bb2 i8 -26, label %bb2 i8 -25, label %bb2
486    i8 -24, label %bb2 i8 -23, label %bb2 i8 -22, label %bb2 i8 -21, label %bb2
487    i8 -20, label %bb2 i8 -19, label %bb2 i8 -18, label %bb2 i8 -17, label %bb2
488    i8 -16, label %bb3 i8 -15, label %bb3 i8 -14, label %bb3 i8 -13, label %bb3
489    i8 -12, label %bb3 i8 -11, label %bb3 i8 -10, label %bb3 i8 -9, label %bb3
490  ]
491bb0: tail call void @g(i32 0) br label %return
492bb1: tail call void @g(i32 1) br label %return
493bb2: tail call void @g(i32 1) br label %return
494bb3: tail call void @g(i32 1) br label %return
495return: ret void
496
497; Don't infloop on jump tables where the upper bound is the max value of the
498; input type (in this case 127).
499; CHECK-LABEL: int_max_table_cluster
500; CHECK: jmpq *.LJTI
501}
502
503
504define void @bt_order_by_weight(i32 %x) {
505entry:
506  switch i32 %x, label %return [
507    i32 0, label %bb0
508    i32 3, label %bb0
509    i32 6, label %bb0
510    i32 1, label %bb1
511    i32 4, label %bb1
512    i32 7, label %bb1
513    i32 2, label %bb2
514    i32 5, label %bb2
515    i32 8, label %bb2
516    i32 9, label %bb2
517  ], !prof !1
518bb0: tail call void @g(i32 0) br label %return
519bb1: tail call void @g(i32 1) br label %return
520bb2: tail call void @g(i32 2) br label %return
521return: ret void
522
523; Cases 1,4,7 have a very large branch weight (which shouldn't overflow), so
524; their bit test should come first. 0,3,6 and 2,5,8,9 both have a weight of 12,
525; but the latter set has more cases, so should be tested for earlier.
526; The bit test on 0,3,6 is unnecessary as all cases cover the rage [0, 9].
527; The range check guarantees that cases other than 1,4,7 and 2,5,8,9 must be
528; in 0,3,6.
529
530; CHECK-LABEL: bt_order_by_weight
531; 146 = 2^1 + 2^4 + 2^7
532; CHECK: movl $146
533; CHECK: btl
534; 292 = 2^2 + 2^5 + 2^8 + 2^9
535; CHECK: movl $804
536; CHECK: btl
537; 73 = 2^0 + 2^3 + 2^6
538; CHECK-NOT: movl $73
539; CHECK-NOT: btl
540}
541
542!1 = !{!"branch_weights",
543       ; Default:
544       i32 1,
545       ; Cases 0,3,6:
546       i32 4, i32 4, i32 4,
547       ; Cases 1,4,7:
548       i32 4294967295, i32 2, i32 4294967295,
549       ; Cases 2,5,8,9:
550       i32 3, i32 3, i32 3, i32 3}
551
552define void @order_by_weight_and_fallthrough(i32 %x) {
553entry:
554  switch i32 %x, label %return [
555    i32 100, label %bb1
556    i32 200, label %bb0
557    i32 300, label %bb0
558  ], !prof !2
559bb0: tail call void @g(i32 0) br label %return
560bb1: tail call void @g(i32 1) br label %return
561return: ret void
562
563; Case 200 has the highest weight and should come first. 100 and 300 have the
564; same weight, but 300 goes to the 'next' block, so should be last.
565; CHECK-LABEL: order_by_weight_and_fallthrough
566; CHECK: cmpl $200
567; CHECK: cmpl $100
568; CHECK: cmpl $300
569}
570
571!2 = !{!"branch_weights",
572       ; Default:
573       i32 1,
574       ; Case 100:
575       i32 10,
576       ; Case 200:
577       i32 1000,
578       ; Case 300:
579       i32 10}
580
581
582define void @zero_weight_tree(i32 %x) {
583entry:
584  switch i32 %x, label %return [
585    i32 0,  label %bb0
586    i32 10, label %bb1
587    i32 20, label %bb2
588    i32 30, label %bb3
589    i32 40, label %bb4
590    i32 50, label %bb5
591  ], !prof !3
592bb0: tail call void @g(i32 0) br label %return
593bb1: tail call void @g(i32 1) br label %return
594bb2: tail call void @g(i32 2) br label %return
595bb3: tail call void @g(i32 3) br label %return
596bb4: tail call void @g(i32 4) br label %return
597bb5: tail call void @g(i32 5) br label %return
598return: ret void
599
600; Make sure to pick a pivot in the middle also with zero-weight cases.
601; CHECK-LABEL: zero_weight_tree
602; CHECK-NOT: cmpl
603; CHECK: cmpl $29
604}
605
606!3 = !{!"branch_weights", i32 1, i32 10, i32 0, i32 0, i32 0, i32 0, i32 10}
607
608
609define void @left_leaning_weight_balanced_tree(i32 %x) {
610entry:
611  switch i32 %x, label %return [
612    i32 0,  label %bb0
613    i32 10, label %bb1
614    i32 20, label %bb2
615    i32 30, label %bb3
616    i32 40, label %bb4
617    i32 50, label %bb5
618    i32 60, label %bb6
619    i32 70, label %bb6
620  ], !prof !4
621bb0: tail call void @g(i32 0) br label %return
622bb1: tail call void @g(i32 1) br label %return
623bb2: tail call void @g(i32 2) br label %return
624bb3: tail call void @g(i32 3) br label %return
625bb4: tail call void @g(i32 4) br label %return
626bb5: tail call void @g(i32 5) br label %return
627bb6: tail call void @g(i32 6) br label %return
628bb7: tail call void @g(i32 7) br label %return
629return: ret void
630
631; Without branch probabilities, the pivot would be 40, since that would yield
632; equal-sized sub-trees. When taking weights into account, case 70 becomes the
633; pivot. Since there is room for 3 cases in a leaf, cases 50 and 60 are also
634; included in the right-hand side because that doesn't reduce their rank.
635
636; CHECK-LABEL: left_leaning_weight_balanced_tree
637; CHECK-NOT: cmpl
638; CHECK: cmpl $49
639}
640
641!4 = !{!"branch_weights", i32 1, i32 10, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1000}
642
643
644define void @left_leaning_weight_balanced_tree2(i32 %x) {
645entry:
646  switch i32 %x, label %return [
647    i32 0,  label %bb0
648    i32 10, label %bb1
649    i32 20, label %bb2
650    i32 30, label %bb3
651    i32 40, label %bb4
652    i32 50, label %bb5
653    i32 60, label %bb6
654    i32 70, label %bb6
655  ], !prof !5
656bb0: tail call void @g(i32 0) br label %return
657bb1: tail call void @g(i32 1) br label %return
658bb2: tail call void @g(i32 2) br label %return
659bb3: tail call void @g(i32 3) br label %return
660bb4: tail call void @g(i32 4) br label %return
661bb5: tail call void @g(i32 5) br label %return
662bb6: tail call void @g(i32 6) br label %return
663bb7: tail call void @g(i32 7) br label %return
664return: ret void
665
666; Same as the previous test, except case 50 has higher rank to the left than it
667; would have on the right. Case 60 would have the same rank on both sides, so is
668; moved into the leaf.
669
670; CHECK-LABEL: left_leaning_weight_balanced_tree2
671; CHECK-NOT: cmpl
672; CHECK: cmpl $59
673}
674
675!5 = !{!"branch_weights", i32 1, i32 10, i32 1, i32 1, i32 1, i32 1, i32 90, i32 70, i32 1000}
676
677
678define void @right_leaning_weight_balanced_tree(i32 %x) {
679entry:
680  switch i32 %x, label %return [
681    i32 0,  label %bb0
682    i32 10, label %bb1
683    i32 20, label %bb2
684    i32 30, label %bb3
685    i32 40, label %bb4
686    i32 50, label %bb5
687    i32 60, label %bb6
688    i32 70, label %bb6
689  ], !prof !6
690bb0: tail call void @g(i32 0) br label %return
691bb1: tail call void @g(i32 1) br label %return
692bb2: tail call void @g(i32 2) br label %return
693bb3: tail call void @g(i32 3) br label %return
694bb4: tail call void @g(i32 4) br label %return
695bb5: tail call void @g(i32 5) br label %return
696bb6: tail call void @g(i32 6) br label %return
697bb7: tail call void @g(i32 7) br label %return
698return: ret void
699
700; Analogous to left_leaning_weight_balanced_tree.
701
702; CHECK-LABEL: right_leaning_weight_balanced_tree
703; CHECK-NOT: cmpl
704; CHECK: cmpl $19
705}
706
707!6 = !{!"branch_weights", i32 1, i32 1000, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 10}
708
709
710define void @jump_table_affects_balance(i32 %x) {
711entry:
712  switch i32 %x, label %return [
713    ; Jump table:
714    i32 0,  label %bb0
715    i32 1,  label %bb1
716    i32 2,  label %bb2
717    i32 3,  label %bb3
718
719    i32 100, label %bb0
720    i32 200, label %bb1
721    i32 300, label %bb2
722  ]
723bb0: tail call void @g(i32 0) br label %return
724bb1: tail call void @g(i32 1) br label %return
725bb2: tail call void @g(i32 2) br label %return
726bb3: tail call void @g(i32 3) br label %return
727return: ret void
728
729; CHECK-LABEL: jump_table_affects_balance
730; If the tree were balanced based on number of clusters, {0-3,100} would go on
731; the left and {200,300} on the right. However, the jump table weights as much
732; as its components, so 100 is selected as the pivot.
733; CHECK-NOT: cmpl
734; CHECK: cmpl $99
735}
736
737
738define void @pr23738(i4 %x) {
739entry:
740  switch i4 %x, label %bb0 [
741    i4 0, label %bb1
742    i4 1, label %bb1
743    i4 -5, label %bb1
744  ]
745bb0: tail call void @g(i32 0) br label %return
746bb1: tail call void @g(i32 1) br label %return
747return: ret void
748; Don't assert due to truncating the bitwidth (64) to i4 when checking
749; that the bit-test range fits in a word.
750}
751
752
753define i32 @pr27135(i32 %i) {
754entry:
755  br i1 undef, label %sw, label %end
756sw:
757  switch i32 %i, label %end [
758    i32 99,  label %sw.bb
759    i32 98,  label %sw.bb
760    i32 101, label %sw.bb
761    i32 97,  label %sw.bb2
762    i32 96,  label %sw.bb2
763    i32 100, label %sw.bb2
764  ]
765sw.bb:
766  unreachable
767sw.bb2:
768  unreachable
769end:
770  %p = phi i32 [ 1, %sw ], [ 0, %entry ]
771  ret i32 %p
772
773; CHECK-LABEL: pr27135:
774; The switch is lowered with bit tests. Since the case range is contiguous, the
775; second bit test is redundant and can be skipped. Check that we don't update
776; the phi node with an incoming value from the MBB of the skipped bit test
777; (-verify-machine-instrs cathces this).
778; CHECK: btl
779; CHECK-NOT: btl
780}
781