Home | History | Annotate | Download | only in X86
      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
      3 
      4 declare void @g(i32)
      5 
      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
     18 
     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
     27 }
     28 
     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
     43 
     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
     58 }
     59 
     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
     74 
     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
     81 }
     82