Skip to content

Commit ba44cbf

Browse files
committed
Add a computed goto test
1 parent a12d7e4 commit ba44cbf

File tree

1 file changed

+255
-0
lines changed

1 file changed

+255
-0
lines changed
Lines changed: 255 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,255 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5
2+
# RUN: llc -mtriple=x86_64-unknown-linux-gnu -run-pass=early-tailduplication -tail-dup-pred-size=1 -tail-dup-succ-size=1 %s -o - | FileCheck %s
3+
# Check that only the computed goto is not be restrict by tail-dup-pred-size and tail-dup-succ-size.
4+
--- |
5+
declare i64 @f0()
6+
declare i64 @f1()
7+
declare i64 @f2()
8+
declare i64 @f3()
9+
declare i64 @f4()
10+
declare i64 @f5()
11+
@computed_goto.dispatch = external global [5 x ptr]
12+
define void @computed_goto() { ret void }
13+
define void @jump_table() { ret void }
14+
...
15+
---
16+
name: computed_goto
17+
tracksRegLiveness: true
18+
body: |
19+
; CHECK-LABEL: name: computed_goto
20+
; CHECK: bb.0:
21+
; CHECK-NEXT: successors: %bb.5(0x80000000)
22+
; CHECK-NEXT: {{ $}}
23+
; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
24+
; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @f0, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
25+
; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
26+
; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rax
27+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY [[COPY]]
28+
; CHECK-NEXT: JMP_1 %bb.5
29+
; CHECK-NEXT: {{ $}}
30+
; CHECK-NEXT: bb.1:
31+
; CHECK-NEXT: successors: %bb.5(0x80000000)
32+
; CHECK-NEXT: {{ $}}
33+
; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
34+
; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @f1, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
35+
; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
36+
; CHECK-NEXT: [[COPY2:%[0-9]+]]:gr64 = COPY $rax
37+
; CHECK-NEXT: [[COPY3:%[0-9]+]]:gr64 = COPY [[COPY2]]
38+
; CHECK-NEXT: JMP_1 %bb.5
39+
; CHECK-NEXT: {{ $}}
40+
; CHECK-NEXT: bb.2:
41+
; CHECK-NEXT: successors: %bb.5(0x80000000)
42+
; CHECK-NEXT: {{ $}}
43+
; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
44+
; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @f2, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
45+
; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
46+
; CHECK-NEXT: [[COPY4:%[0-9]+]]:gr64 = COPY $rax
47+
; CHECK-NEXT: [[COPY5:%[0-9]+]]:gr64 = COPY [[COPY4]]
48+
; CHECK-NEXT: JMP_1 %bb.5
49+
; CHECK-NEXT: {{ $}}
50+
; CHECK-NEXT: bb.3:
51+
; CHECK-NEXT: successors: %bb.5(0x80000000)
52+
; CHECK-NEXT: {{ $}}
53+
; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
54+
; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @f3, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
55+
; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
56+
; CHECK-NEXT: [[COPY6:%[0-9]+]]:gr64 = COPY $rax
57+
; CHECK-NEXT: [[COPY7:%[0-9]+]]:gr64 = COPY [[COPY6]]
58+
; CHECK-NEXT: JMP_1 %bb.5
59+
; CHECK-NEXT: {{ $}}
60+
; CHECK-NEXT: bb.4:
61+
; CHECK-NEXT: successors: %bb.5(0x80000000)
62+
; CHECK-NEXT: {{ $}}
63+
; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
64+
; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @f4, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
65+
; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
66+
; CHECK-NEXT: [[COPY8:%[0-9]+]]:gr64 = COPY $rax
67+
; CHECK-NEXT: [[COPY9:%[0-9]+]]:gr64 = COPY [[COPY8]]
68+
; CHECK-NEXT: {{ $}}
69+
; CHECK-NEXT: bb.5:
70+
; CHECK-NEXT: successors: %bb.1(0x20000000), %bb.2(0x20000000), %bb.3(0x20000000), %bb.4(0x20000000)
71+
; CHECK-NEXT: {{ $}}
72+
; CHECK-NEXT: [[PHI:%[0-9]+]]:gr64_nosp = PHI [[COPY1]], %bb.0, [[COPY9]], %bb.4, [[COPY7]], %bb.3, [[COPY5]], %bb.2, [[COPY3]], %bb.1
73+
; CHECK-NEXT: JMP64m $noreg, 8, [[PHI]], @computed_goto.dispatch, $noreg
74+
bb.0:
75+
ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
76+
CALL64pcrel32 target-flags(x86-plt) @f0, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
77+
ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
78+
%6:gr64 = COPY $rax
79+
%0:gr64 = COPY %6
80+
JMP_1 %bb.5
81+
82+
bb.1:
83+
ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
84+
CALL64pcrel32 target-flags(x86-plt) @f1, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
85+
ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
86+
%10:gr64 = COPY $rax
87+
%1:gr64 = COPY %10
88+
JMP_1 %bb.5
89+
90+
bb.2:
91+
ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
92+
CALL64pcrel32 target-flags(x86-plt) @f2, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
93+
ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
94+
%9:gr64 = COPY $rax
95+
%2:gr64 = COPY %9
96+
JMP_1 %bb.5
97+
98+
bb.3:
99+
ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
100+
CALL64pcrel32 target-flags(x86-plt) @f3, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
101+
ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
102+
%8:gr64 = COPY $rax
103+
%3:gr64 = COPY %8
104+
JMP_1 %bb.5
105+
106+
bb.4:
107+
ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
108+
CALL64pcrel32 target-flags(x86-plt) @f4, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
109+
ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
110+
%7:gr64 = COPY $rax
111+
%4:gr64 = COPY %7
112+
113+
bb.5:
114+
successors: %bb.1, %bb.2, %bb.3, %bb.4
115+
116+
%5:gr64_nosp = PHI %0, %bb.0, %4, %bb.4, %3, %bb.3, %2, %bb.2, %1, %bb.1
117+
JMP64m $noreg, 8, %5, @computed_goto.dispatch, $noreg
118+
119+
...
120+
---
121+
name: jump_table
122+
tracksRegLiveness: true
123+
jumpTable:
124+
kind: block-address
125+
entries:
126+
- id: 0
127+
blocks: [ '%bb.2', '%bb.3', '%bb.4', '%bb.5', '%bb.6' ]
128+
body: |
129+
; CHECK-LABEL: name: jump_table
130+
; CHECK: bb.0:
131+
; CHECK-NEXT: successors: %bb.1(0x80000000)
132+
; CHECK-NEXT: {{ $}}
133+
; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
134+
; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @f0, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
135+
; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
136+
; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rax
137+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY [[COPY]]
138+
; CHECK-NEXT: {{ $}}
139+
; CHECK-NEXT: bb.1:
140+
; CHECK-NEXT: successors: %bb.3(0x1999999a), %bb.4(0x1999999a), %bb.5(0x1999999a), %bb.6(0x1999999a), %bb.7(0x1999999a)
141+
; CHECK-NEXT: {{ $}}
142+
; CHECK-NEXT: [[PHI:%[0-9]+]]:gr64 = PHI [[COPY1]], %bb.0, %3, %bb.7, %4, %bb.6, %5, %bb.5, %6, %bb.4, %7, %bb.3
143+
; CHECK-NEXT: [[DEC64r:%[0-9]+]]:gr64_nosp = DEC64r [[PHI]], implicit-def dead $eflags
144+
; CHECK-NEXT: JMP64m $noreg, 8, [[DEC64r]], %jump-table.0, $noreg :: (load (s64) from jump-table)
145+
; CHECK-NEXT: {{ $}}
146+
; CHECK-NEXT: bb.3:
147+
; CHECK-NEXT: successors: %bb.1(0x80000000)
148+
; CHECK-NEXT: {{ $}}
149+
; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
150+
; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @f1, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
151+
; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
152+
; CHECK-NEXT: [[COPY2:%[0-9]+]]:gr64 = COPY $rax
153+
; CHECK-NEXT: [[COPY3:%[0-9]+]]:gr64 = COPY [[COPY2]]
154+
; CHECK-NEXT: JMP_1 %bb.1
155+
; CHECK-NEXT: {{ $}}
156+
; CHECK-NEXT: bb.4:
157+
; CHECK-NEXT: successors: %bb.1(0x80000000)
158+
; CHECK-NEXT: {{ $}}
159+
; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
160+
; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @f2, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
161+
; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
162+
; CHECK-NEXT: [[COPY4:%[0-9]+]]:gr64 = COPY $rax
163+
; CHECK-NEXT: [[COPY5:%[0-9]+]]:gr64 = COPY [[COPY4]]
164+
; CHECK-NEXT: JMP_1 %bb.1
165+
; CHECK-NEXT: {{ $}}
166+
; CHECK-NEXT: bb.5:
167+
; CHECK-NEXT: successors: %bb.1(0x80000000)
168+
; CHECK-NEXT: {{ $}}
169+
; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
170+
; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @f3, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
171+
; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
172+
; CHECK-NEXT: [[COPY6:%[0-9]+]]:gr64 = COPY $rax
173+
; CHECK-NEXT: [[COPY7:%[0-9]+]]:gr64 = COPY [[COPY6]]
174+
; CHECK-NEXT: JMP_1 %bb.1
175+
; CHECK-NEXT: {{ $}}
176+
; CHECK-NEXT: bb.6:
177+
; CHECK-NEXT: successors: %bb.1(0x80000000)
178+
; CHECK-NEXT: {{ $}}
179+
; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
180+
; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @f4, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
181+
; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
182+
; CHECK-NEXT: [[COPY8:%[0-9]+]]:gr64 = COPY $rax
183+
; CHECK-NEXT: [[COPY9:%[0-9]+]]:gr64 = COPY [[COPY8]]
184+
; CHECK-NEXT: JMP_1 %bb.1
185+
; CHECK-NEXT: {{ $}}
186+
; CHECK-NEXT: bb.7:
187+
; CHECK-NEXT: successors: %bb.1(0x80000000)
188+
; CHECK-NEXT: {{ $}}
189+
; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
190+
; CHECK-NEXT: CALL64pcrel32 target-flags(x86-plt) @f5, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
191+
; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
192+
; CHECK-NEXT: [[COPY10:%[0-9]+]]:gr64 = COPY $rax
193+
; CHECK-NEXT: [[COPY11:%[0-9]+]]:gr64 = COPY [[COPY10]]
194+
; CHECK-NEXT: JMP_1 %bb.1
195+
; CHECK-NEXT: {{ $}}
196+
; CHECK-NEXT: bb.8:
197+
bb.0:
198+
ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
199+
CALL64pcrel32 target-flags(x86-plt) @f0, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
200+
ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
201+
%7:gr64 = COPY $rax
202+
%0:gr64 = COPY %7
203+
204+
bb.1:
205+
%1:gr64 = PHI %0, %bb.0, %6, %bb.6, %5, %bb.5, %4, %bb.4, %3, %bb.3, %2, %bb.2
206+
%8:gr64_nosp = DEC64r %1, implicit-def dead $eflags
207+
208+
bb.8:
209+
successors: %bb.2(0x1999999a), %bb.3(0x1999999a), %bb.4(0x1999999a), %bb.5(0x1999999a), %bb.6(0x1999999a)
210+
211+
JMP64m $noreg, 8, %8, %jump-table.0, $noreg :: (load (s64) from jump-table)
212+
213+
bb.2:
214+
ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
215+
CALL64pcrel32 target-flags(x86-plt) @f1, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
216+
ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
217+
%13:gr64 = COPY $rax
218+
%2:gr64 = COPY %13
219+
JMP_1 %bb.1
220+
221+
bb.3:
222+
ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
223+
CALL64pcrel32 target-flags(x86-plt) @f2, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
224+
ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
225+
%12:gr64 = COPY $rax
226+
%3:gr64 = COPY %12
227+
JMP_1 %bb.1
228+
229+
bb.4:
230+
ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
231+
CALL64pcrel32 target-flags(x86-plt) @f3, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
232+
ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
233+
%11:gr64 = COPY $rax
234+
%4:gr64 = COPY %11
235+
JMP_1 %bb.1
236+
237+
bb.5:
238+
ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
239+
CALL64pcrel32 target-flags(x86-plt) @f4, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
240+
ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
241+
%10:gr64 = COPY $rax
242+
%5:gr64 = COPY %10
243+
JMP_1 %bb.1
244+
245+
bb.6:
246+
ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
247+
CALL64pcrel32 target-flags(x86-plt) @f5, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
248+
ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
249+
%9:gr64 = COPY $rax
250+
%6:gr64 = COPY %9
251+
JMP_1 %bb.1
252+
253+
bb.7:
254+
255+
...

0 commit comments

Comments
 (0)