1# RUN: llc -mtriple=aarch64-linux-gnu %s -run-pass=aarch64-jump-tables -o - | FileCheck %s
2--- |
3  define i32 @test_jumptable(i32 %in) {
4    unreachable
5  }
6
7...
8---
9name:            test_jumptable
10alignment:       4
11exposesReturnsTwice: false
12legalized:       false
13regBankSelected: false
14selected:        false
15tracksRegLiveness: true
16liveins:
17  - { reg: '$w0' }
18frameInfo:
19  isFrameAddressTaken: false
20  isReturnAddressTaken: false
21  hasStackMap:     false
22  hasPatchPoint:   false
23  stackSize:       0
24  offsetAdjustment: 0
25  maxAlignment:    0
26  adjustsStack:    false
27  hasCalls:        false
28  maxCallFrameSize: 0
29  hasOpaqueSPAdjustment: false
30  hasVAStart:      false
31  hasMustTailInVarArgFunc: false
32jumpTable:
33  kind:            block-address
34  entries:
35    - id:              0
36      blocks:          [ '%bb.2', '%bb.3' ]
37    - id:              1
38      blocks:          [ '%bb.4', '%bb.5' ]
39    - id:              2
40      blocks:          [ '%bb.7' ]
41    - id:              3
42      blocks:          [ '%bb.9' ]
43    - id:              4
44      blocks:          [ '%bb.9' ]
45    - id:              5
46      blocks:          [ '%bb.11' ]
47body:             |
48  bb.0 (%ir-block.0):
49    liveins: $x8
50
51  bb.1 (%ir-block.0):
52    ; CHECK-LABEL: body:
53    ; CHECK-LABEL: bb.1
54    ; CHECK: JumpTableDest8
55    liveins: $x8
56    early-clobber $x10, dead early-clobber $x11 = JumpTableDest32 undef killed $x9, undef killed $x8, %jump-table.0
57    BR killed $x10
58
59  bb.2:
60    ; Last destination is 4 * 255 = 1020 bytes after first. Byte is OK.
61    dead $xzr = SPACE 1020, undef $xzr
62
63  bb.3:
64    ; CHECK-LABEL: bb.3
65    ; CHECK: JumpTableDest16
66    early-clobber $x10, dead early-clobber $x11 = JumpTableDest32 undef killed $x9, undef killed $x8, %jump-table.1
67    BR killed $x10
68
69  bb.4:
70    ; Last destination is 4 * 256 = 1024 bytes after first. Half needed.
71    dead $xzr = SPACE 1024, undef $xzr
72
73  bb.5:
74    ; CHECK-LABEL: bb.5
75    ; CHECK: JumpTableDest8
76    early-clobber $x10, dead early-clobber $x11 = JumpTableDest32 undef killed $x9, undef killed $x8, %jump-table.2
77    BR killed $x10
78
79  bb.6:
80    ; First destination is (2^20 - 4) after reference. Just reachable by ADR so can use compressed table.
81    dead $xzr = SPACE 1048556, undef $xzr
82
83  bb.7:
84    ; CHECK-LABEL: bb.7
85    ; CHECK: JumpTableDest32
86    early-clobber $x10, dead early-clobber $x11 = JumpTableDest32 undef killed $x9, undef killed $x8, %jump-table.3
87    BR killed $x10
88
89  bb.8:
90    ; First destination is 2^20 after reference. Compressed table cannot reach it.
91    dead $xzr = SPACE 1048560, undef $xzr
92
93  bb.9:
94    ; First destination is 2^20 before reference. Just within reach of ADR.
95    dead $xzr = SPACE 1048576, undef $xzr
96
97  bb.10:
98    ; CHECK-LABEL: bb.10
99    ; CHECK: JumpTableDest8
100    early-clobber $x10, dead early-clobber $x11 = JumpTableDest32 undef killed $x9, undef killed $x8, %jump-table.4
101    BR killed $x10
102
103  bb.11:
104    ; First destination is 2^20 before reference. Just within reach of ADR.
105    dead $xzr = SPACE 1048580, undef $xzr
106
107  bb.12:
108    ; CHECK-LABEL: bb.12
109    ; CHECK: JumpTableDest32
110    early-clobber $x10, dead early-clobber $x11 = JumpTableDest32 undef killed $x9, undef killed $x8, %jump-table.5
111    BR killed $x10
112...
113