xref: /llvm-project/llvm/test/CodeGen/X86/jump-table-size-section.ll (revision fb6c10da1f6cb4eb9556548d51dafe97d953ba58)
1; RUN: llc %s -o - -mtriple x86_64-sie-ps5 -emit-jump-table-sizes-section -verify-machineinstrs --relocation-model=pic | FileCheck --check-prefix=PS5-CHECK %s
2; RUN: llc %s -o - -mtriple x86_64-sie-ps5 -verify-machineinstrs --relocation-model=pic | FileCheck --check-prefix=NOFLAG %s
3; RUN: llc %s -o - -mtriple x86_64-sie-ps5 -verify-machineinstrs --relocation-model=pic | FileCheck --check-prefix=NOTABLE %s
4
5; RUN: llc %s -o - -mtriple x86_64-unknown-linux-gnu -emit-jump-table-sizes-section -verify-machineinstrs --relocation-model=pic | FileCheck --check-prefix=ELF-CHECK %s
6; RUN: llc %s -o - -mtriple x86_64-unknown-linux-gnu -verify-machineinstrs --relocation-model=pic | FileCheck --check-prefix=NOFLAG %s
7; RUN: llc %s -o - -mtriple x86_64-unknown-linux-gnu -verify-machineinstrs --relocation-model=pic | FileCheck --check-prefix=NOTABLE %s
8
9; RUN: llc %s -o - -mtriple x86_64-pc-windows-msvc -emit-jump-table-sizes-section -verify-machineinstrs --relocation-model=pic | FileCheck --check-prefix=COFF-CHECK %s
10; RUN: llc %s -o - -mtriple x86_64-pc-windows-msvc -verify-machineinstrs --relocation-model=pic | FileCheck --check-prefix=NOFLAG %s
11; RUN: llc %s -o - -mtriple x86_64-pc-windows-msvc -verify-machineinstrs --relocation-model=pic | FileCheck --check-prefix=NOTABLE %s
12
13; This test verifies the jump table size section. Currently only enabled by default on the PS5 target.
14
15$foo1 = comdat any
16
17; Ensure proper comdat handling.
18define void @foo1(i32 %x, ptr %to) comdat {
19
20; PS5-CHECK-LABEL: foo1
21; PS5-CHECK:       .section        .llvm_jump_table_sizes,"G",@llvm_jt_sizes,foo1,comdat
22; PS5-CHECK-NEXT: .quad   .LJTI0_0
23; PS5-CHECK-NEXT: .quad   6
24
25; ELF-CHECK-LABEL: foo1
26; ELF-CHECK:       .section        .llvm_jump_table_sizes,"G",@llvm_jt_sizes,foo1,comdat
27; ELF-CHECK-NEXT: .quad   .LJTI0_0
28; ELF-CHECK-NEXT: .quad   6
29
30; COFF-CHECK-LABEL: foo1
31; COFF-CHECK:      .section         .llvm_jump_table_sizes,"drD",associative,foo1
32; COFF-CHECK-NEXT: .quad   .LJTI0_0
33; COFF-CHECK-NEXT: .quad   6
34
35; NOFLAG-LABEL: foo1
36; NOFLAG-NOT: .section        .llvm_jump_table_sizes
37
38entry:
39  switch i32 %x, label %default [
40    i32 0, label %bb0
41    i32 1, label %bb1
42    i32 2, label %bb2
43    i32 3, label %bb3
44    i32 4, label %bb4
45    i32 5, label %bb4
46  ]
47bb0:
48  store i32 0, ptr %to
49  br label %exit
50bb1:
51  store i32 1, ptr %to
52  br label %exit
53bb2:
54  store i32 2, ptr %to
55  br label %exit
56bb3:
57  store i32 3, ptr %to
58  br label %exit
59bb4:
60  store i32 4, ptr %to
61  br label %exit
62exit:
63  ret void
64default:
65  unreachable
66}
67
68define void @foo2(i32 %x, ptr %to) {
69
70; PS5-CHECK-LABEL:    foo2
71; PS5-CHECK:          .section .llvm_jump_table_sizes,"",@llvm_jt_sizes
72; PS5-CHECK-NEXT:     .quad .LJTI1_0
73; PS5-CHECK-NEXT:     .quad   5
74
75; ELF-CHECK-LABEL:    foo2
76; ELF-CHECK:          .section .llvm_jump_table_sizes,"",@llvm_jt_sizes
77; ELF-CHECK-NEXT:     .quad .LJTI1_0
78; ELF-CHECK-NEXT:     .quad   5
79
80; COFF-CHECK-LABEL:   foo2
81; COFF-CHECK:         .section         .llvm_jump_table_sizes,"drD"
82; COFF-CHECK-NEXT:    .quad .LJTI1_0
83; COFF-CHECK-NEXT:    .quad   5
84
85; NOFLAG-LABEL:       foo1
86; NOFLAG-NOT:         .section        .llvm_jump_table_sizes
87
88entry:
89  switch i32 %x, label %default [
90    i32 0, label %bb0
91    i32 1, label %bb1
92    i32 2, label %bb2
93    i32 3, label %bb3
94    i32 4, label %bb4
95  ]
96bb0:
97  store i32 0, ptr %to
98  br label %exit
99bb1:
100  store i32 1, ptr %to
101  br label %exit
102bb2:
103  store i32 2, ptr %to
104  br label %exit
105bb3:
106  store i32 3, ptr %to
107  br label %exit
108bb4:
109  store i32 4, ptr %to
110  br label %exit
111exit:
112  ret void
113default:
114  unreachable
115}
116
117; Ensure that the section isn't produced if there is no jump table.
118
119define void @foo3(i32 %x, ptr %to) {
120
121; NOTABLE-LABEL:    foo3
122; NOTABLE-NOT:      .section        .llvm_jump_table_sizes
123
124exit:
125  ret void
126}
127
128; Ensure we can deal with nested jump tables.
129
130define void @nested(i32 %x, i32 %y, ptr %to) {
131
132; PS5-CHECK-LABEL:    nested
133; PS5-CHECK:          .section .llvm_jump_table_sizes,"",@llvm_jt_sizes
134; PS5-CHECK-NEXT:     .quad .LJTI3_0
135; PS5-CHECK-NEXT:     .quad   5
136; PS5-CHECK-NEXT:     .quad .LJTI3_1
137; PS5-CHECK-NEXT:     .quad 6
138
139; ELF-CHECK-LABEL:    nested
140; ELF-CHECK:          .section .llvm_jump_table_sizes,"",@llvm_jt_sizes
141; ELF-CHECK-NEXT:     .quad .LJTI3_0
142; ELF-CHECK-NEXT:     .quad   5
143; ELF-CHECK-NEXT:     .quad .LJTI3_1
144; ELF-CHECK-NEXT:     .quad 6
145
146; COFF-CHECK-LABEL:   nested
147; COFF-CHECK:         .section         .llvm_jump_table_sizes,"drD"
148; COFF-CHECK-NEXT:     .quad .LJTI3_0
149; COFF-CHECK-NEXT:     .quad   5
150; COFF-CHECK-NEXT:     .quad .LJTI3_1
151; COFF-CHECK-NEXT:     .quad 6
152
153; NOFLAG-LABEL:       nested
154; NOFLAG-NOT:         .section        .llvm_jump_table_sizes
155
156entry:
157  switch i32 %x, label %default [
158    i32 0, label %bb0
159    i32 1, label %bb1
160    i32 2, label %bb2
161    i32 3, label %bb3
162    i32 4, label %bb4
163  ]
164bb0:
165  store i32 0, ptr %to
166  br label %exit
167bb1:
168  store i32 1, ptr %to
169  br label %exit
170bb2:
171  store i32 2, ptr %to
172  br label %exit
173bb3:
174  store i32 3, ptr %to
175  br label %exit
176bb4:
177  switch i32 %y, label %default [
178    i32 1, label %bb5
179    i32 2, label %bb6
180    i32 3, label %bb7
181    i32 4, label %bb8
182    i32 5, label %bb9
183    i32 6, label %bb10
184  ]
185  br label %exit2
186bb5:
187  store i32 4, ptr %to
188  br label %exit
189bb6:
190  store i32 4, ptr %to
191  br label %exit
192bb7:
193  store i32 4, ptr %to
194  br label %exit
195bb8:
196  store i32 4, ptr %to
197  br label %exit
198bb9:
199  store i32 4, ptr %to
200  br label %exit
201bb10:
202  store i32 4, ptr %to
203  br label %exit
204exit:
205  ret void
206exit2:
207  ret void
208default:
209  unreachable
210}