[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / X86 / switch-density.ll
blob52216fb4d7c2a43dc2ba2aa83a4e39ec78a3ba86
1 ; RUN: llc -mtriple=x86_64-linux-gnu %s -o - -jump-table-density=25 | FileCheck %s --check-prefix=DENSE --check-prefix=CHECK
2 ; RUN: llc -mtriple=x86_64-linux-gnu %s -o - -jump-table-density=10 | FileCheck %s --check-prefix=SPARSE --check-prefix=CHECK
4 declare void @g(i32)
6 define void @sparse(i32 %x) {
7 entry:
8   switch i32 %x, label %return [
9     i32 300, label %bb0
10     i32 100, label %bb1
11     i32 400, label %bb1
12     i32 500, label %bb2
13   ]
14 bb0: tail call void @g(i32 0) br label %return
15 bb1: tail call void @g(i32 1) br label %return
16 bb2: tail call void @g(i32 1) br label %return
17 return: ret void
19 ; Should pivot around 400 for two subtrees with two jump tables each.
20 ; CHECK-LABEL: sparse
21 ; CHECK-NOT: cmpl
22 ; CHECK: cmpl $399
23 ; CHECK: cmpl $100
24 ; CHECK: cmpl $300
25 ; CHECK: cmpl $400
26 ; CHECK: cmpl $500
29 define void @med(i32 %x) {
30 entry:
31   switch i32 %x, label %return [
32     i32 30, label %bb0
33     i32 10, label %bb1
34     i32 40, label %bb1
35     i32 50, label %bb2
36     i32 20, label %bb3
37   ]
38 bb0: tail call void @g(i32 0) br label %return
39 bb1: tail call void @g(i32 1) br label %return
40 bb2: tail call void @g(i32 1) br label %return
41 bb3: tail call void @g(i32 2) br label %return
42 return: ret void
44 ; Lowered as a jump table when sparse, and branches when dense.
45 ; CHECK-LABEL: med
46 ; SPARSE: addl $-10
47 ; SPARSE: cmpl $40
48 ; SPARSE: ja
49 ; SPARSE: jmpq *.LJTI
50 ; DENSE-NOT: cmpl
51 ; DENSE: cmpl $29
52 ; DENSE-DAG: cmpl $10
53 ; DENSE-DAG: cmpl $20
54 ; DENSE-DAG: cmpl $30
55 ; DENSE-DAG: cmpl $40
56 ; DENSE-DAG: cmpl $50
57 ; DENSE: retq
60 define void @dense(i32 %x) {
61 entry:
62   switch i32 %x, label %return [
63     i32 12, label %bb0
64     i32 4,  label %bb1
65     i32 16, label %bb1
66     i32 20, label %bb2
67     i32 8,  label %bb3
68   ]
69 bb0: tail call void @g(i32 0) br label %return
70 bb1: tail call void @g(i32 1) br label %return
71 bb2: tail call void @g(i32 1) br label %return
72 bb3: tail call void @g(i32 2) br label %return
73 return: ret void
75 ; Lowered as a jump table when sparse, and branches when dense.
76 ; CHECK-LABEL: dense
77 ; CHECK: addl $-4
78 ; CHECK: cmpl $16
79 ; CHECK: ja
80 ; CHECK: jmpq *.LJTI