Skip to content

Commit f8833ba

Browse files
committed
[TailDup] Add testcase for interpreter switch loop, NFC.
1 parent c93f93b commit f8833ba

File tree

1 file changed

+221
-0
lines changed

1 file changed

+221
-0
lines changed
Lines changed: 221 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,221 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu | FileCheck %s
3+
define i8* @large_loop_switch(i8* %p) {
4+
; CHECK-LABEL: large_loop_switch:
5+
; CHECK: # %bb.0: # %entry
6+
; CHECK-NEXT: pushq %rbx
7+
; CHECK-NEXT: .cfi_def_cfa_offset 16
8+
; CHECK-NEXT: .cfi_offset %rbx, -16
9+
; CHECK-NEXT: movq %rdi, %rax
10+
; CHECK-NEXT: movl $6, %ebx
11+
; CHECK-NEXT: movl %ebx, %ecx
12+
; CHECK-NEXT: jmpq *.LJTI0_0(,%rcx,8)
13+
; CHECK-NEXT: .LBB0_1: # %for.cond.cleanup
14+
; CHECK-NEXT: movl $530, %edi # imm = 0x212
15+
; CHECK-NEXT: movq %rax, %rsi
16+
; CHECK-NEXT: popq %rbx
17+
; CHECK-NEXT: .cfi_def_cfa_offset 8
18+
; CHECK-NEXT: jmp ccc@PLT # TAILCALL
19+
; CHECK-NEXT: .p2align 4, 0x90
20+
; CHECK-NEXT: .LBB0_2: # %sw.bb1
21+
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
22+
; CHECK-NEXT: .cfi_def_cfa_offset 16
23+
; CHECK-NEXT: movl $531, %edi # imm = 0x213
24+
; CHECK-NEXT: movq %rax, %rsi
25+
; CHECK-NEXT: callq ccc@PLT
26+
; CHECK-NEXT: decl %ebx
27+
; CHECK-NEXT: movl %ebx, %ecx
28+
; CHECK-NEXT: jmpq *.LJTI0_0(,%rcx,8)
29+
; CHECK-NEXT: .p2align 4, 0x90
30+
; CHECK-NEXT: .LBB0_3: # %sw.bb3
31+
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
32+
; CHECK-NEXT: movl $532, %edi # imm = 0x214
33+
; CHECK-NEXT: movq %rax, %rsi
34+
; CHECK-NEXT: callq bbb@PLT
35+
; CHECK-NEXT: decl %ebx
36+
; CHECK-NEXT: movl %ebx, %ecx
37+
; CHECK-NEXT: jmpq *.LJTI0_0(,%rcx,8)
38+
; CHECK-NEXT: .p2align 4, 0x90
39+
; CHECK-NEXT: .LBB0_4: # %sw.bb5
40+
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
41+
; CHECK-NEXT: movl $533, %edi # imm = 0x215
42+
; CHECK-NEXT: movq %rax, %rsi
43+
; CHECK-NEXT: callq bbb@PLT
44+
; CHECK-NEXT: decl %ebx
45+
; CHECK-NEXT: movl %ebx, %ecx
46+
; CHECK-NEXT: jmpq *.LJTI0_0(,%rcx,8)
47+
; CHECK-NEXT: .p2align 4, 0x90
48+
; CHECK-NEXT: .LBB0_5: # %sw.bb7
49+
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
50+
; CHECK-NEXT: movl $535, %edi # imm = 0x217
51+
; CHECK-NEXT: movq %rax, %rsi
52+
; CHECK-NEXT: callq bbb@PLT
53+
; CHECK-NEXT: decl %ebx
54+
; CHECK-NEXT: movl %ebx, %ecx
55+
; CHECK-NEXT: jmpq *.LJTI0_0(,%rcx,8)
56+
; CHECK-NEXT: .p2align 4, 0x90
57+
; CHECK-NEXT: .LBB0_6: # %sw.bb9
58+
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
59+
; CHECK-NEXT: movl $536, %edi # imm = 0x218
60+
; CHECK-NEXT: movq %rax, %rsi
61+
; CHECK-NEXT: callq ccc@PLT
62+
; CHECK-NEXT: decl %ebx
63+
; CHECK-NEXT: movl %ebx, %ecx
64+
; CHECK-NEXT: jmpq *.LJTI0_0(,%rcx,8)
65+
; CHECK-NEXT: .p2align 4, 0x90
66+
; CHECK-NEXT: .LBB0_7: # %sw.bb11
67+
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
68+
; CHECK-NEXT: movl $658, %edi # imm = 0x292
69+
; CHECK-NEXT: movq %rax, %rsi
70+
; CHECK-NEXT: callq bbb@PLT
71+
; CHECK-NEXT: decl %ebx
72+
; CHECK-NEXT: movl %ebx, %ecx
73+
; CHECK-NEXT: jmpq *.LJTI0_0(,%rcx,8)
74+
entry:
75+
br label %for.body
76+
77+
for.cond.cleanup: ; preds = %for.body
78+
%call = tail call i8* @ccc(i32 signext 530, i8* %p.addr.03006)
79+
ret i8* %call
80+
81+
for.body: ; preds = %for.inc, %entry
82+
%i.03007 = phi i32 [ 6, %entry ], [ %dec, %for.inc ]
83+
%p.addr.03006 = phi i8* [ %p, %entry ], [ %p.addr.1, %for.inc ]
84+
switch i32 %i.03007, label %for.body.unreachabledefault [
85+
i32 0, label %for.cond.cleanup
86+
i32 1, label %sw.bb1
87+
i32 2, label %sw.bb3
88+
i32 3, label %sw.bb5
89+
i32 4, label %sw.bb7
90+
i32 5, label %sw.bb9
91+
i32 6, label %sw.bb11
92+
]
93+
94+
sw.bb1: ; preds = %for.body
95+
%call2 = tail call i8* @ccc(i32 signext 531, i8* %p.addr.03006)
96+
br label %for.inc
97+
98+
sw.bb3: ; preds = %for.body
99+
%call4 = tail call i8* @bbb(i32 signext 532, i8* %p.addr.03006)
100+
br label %for.inc
101+
102+
sw.bb5: ; preds = %for.body
103+
%call6 = tail call i8* @bbb(i32 signext 533, i8* %p.addr.03006)
104+
br label %for.inc
105+
106+
sw.bb7: ; preds = %for.body
107+
%call8 = tail call i8* @bbb(i32 signext 535, i8* %p.addr.03006)
108+
br label %for.inc
109+
110+
sw.bb9: ; preds = %for.body
111+
%call10 = tail call i8* @ccc(i32 signext 536, i8* %p.addr.03006)
112+
br label %for.inc
113+
114+
sw.bb11: ; preds = %for.body
115+
%call12 = tail call i8* @bbb(i32 signext 658, i8* %p.addr.03006)
116+
br label %for.inc
117+
118+
for.body.unreachabledefault: ; preds = %for.body
119+
unreachable
120+
121+
for.inc: ; preds = %sw.bb1, %sw.bb3, %sw.bb5, %sw.bb7, %sw.bb9, %sw.bb11
122+
%p.addr.1 = phi i8* [ %call12, %sw.bb11 ], [ %call10, %sw.bb9 ], [ %call8, %sw.bb7 ], [ %call6, %sw.bb5 ], [ %call4, %sw.bb3 ], [ %call2, %sw.bb1 ]
123+
%dec = add nsw i32 %i.03007, -1
124+
br label %for.body
125+
}
126+
127+
declare i8* @bbb(i32 signext, i8*)
128+
declare i8* @ccc(i32 signext, i8*)
129+
130+
131+
define i32 @interp_switch(i8* nocapture readonly %0, i32 %1) {
132+
; CHECK-LABEL: interp_switch:
133+
; CHECK: # %bb.0:
134+
; CHECK-NEXT: movl %esi, %eax
135+
; CHECK-NEXT: jmp .LBB1_1
136+
; CHECK-NEXT: .LBB1_7: # in Loop: Header=BB1_1 Depth=1
137+
; CHECK-NEXT: addl $7, %eax
138+
; CHECK-NEXT: incq %rdi
139+
; CHECK-NEXT: .p2align 4, 0x90
140+
; CHECK-NEXT: .LBB1_1: # =>This Inner Loop Header: Depth=1
141+
; CHECK-NEXT: movzbl (%rdi), %ecx
142+
; CHECK-NEXT: decb %cl
143+
; CHECK-NEXT: cmpb $5, %cl
144+
; CHECK-NEXT: ja .LBB1_9
145+
; CHECK-NEXT: # %bb.2: # in Loop: Header=BB1_1 Depth=1
146+
; CHECK-NEXT: movzbl %cl, %ecx
147+
; CHECK-NEXT: jmpq *.LJTI1_0(,%rcx,8)
148+
; CHECK-NEXT: .LBB1_3: # in Loop: Header=BB1_1 Depth=1
149+
; CHECK-NEXT: incl %eax
150+
; CHECK-NEXT: incq %rdi
151+
; CHECK-NEXT: jmp .LBB1_1
152+
; CHECK-NEXT: .LBB1_4: # in Loop: Header=BB1_1 Depth=1
153+
; CHECK-NEXT: decl %eax
154+
; CHECK-NEXT: incq %rdi
155+
; CHECK-NEXT: jmp .LBB1_1
156+
; CHECK-NEXT: .LBB1_5: # in Loop: Header=BB1_1 Depth=1
157+
; CHECK-NEXT: addl %eax, %eax
158+
; CHECK-NEXT: incq %rdi
159+
; CHECK-NEXT: jmp .LBB1_1
160+
; CHECK-NEXT: .LBB1_6: # in Loop: Header=BB1_1 Depth=1
161+
; CHECK-NEXT: movl %eax, %ecx
162+
; CHECK-NEXT: shrl $31, %ecx
163+
; CHECK-NEXT: addl %eax, %ecx
164+
; CHECK-NEXT: sarl %ecx
165+
; CHECK-NEXT: incq %rdi
166+
; CHECK-NEXT: movl %ecx, %eax
167+
; CHECK-NEXT: jmp .LBB1_1
168+
; CHECK-NEXT: .LBB1_8: # in Loop: Header=BB1_1 Depth=1
169+
; CHECK-NEXT: negl %eax
170+
; CHECK-NEXT: incq %rdi
171+
; CHECK-NEXT: jmp .LBB1_1
172+
; CHECK-NEXT: .LBB1_9:
173+
; CHECK-NEXT: retq
174+
br label %3
175+
176+
3: ; preds = %21, %2
177+
%4 = phi i64 [ 0, %2 ], [ %6, %21 ]
178+
%5 = phi i32 [ %1, %2 ], [ %22, %21 ]
179+
%6 = add nuw i64 %4, 1
180+
%7 = getelementptr inbounds i8, i8* %0, i64 %4
181+
%8 = load i8, i8* %7, align 1
182+
switch i8 %8, label %23 [
183+
i8 6, label %19
184+
i8 1, label %9
185+
i8 2, label %11
186+
i8 3, label %13
187+
i8 4, label %15
188+
i8 5, label %17
189+
]
190+
191+
9: ; preds = %3
192+
%10 = add nsw i32 %5, 1
193+
br label %21
194+
195+
11: ; preds = %3
196+
%12 = add nsw i32 %5, -1
197+
br label %21
198+
199+
13: ; preds = %3
200+
%14 = shl nsw i32 %5, 1
201+
br label %21
202+
203+
15: ; preds = %3
204+
%16 = sdiv i32 %5, 2
205+
br label %21
206+
207+
17: ; preds = %3
208+
%18 = add nsw i32 %5, 7
209+
br label %21
210+
211+
19: ; preds = %3
212+
%20 = sub nsw i32 0, %5
213+
br label %21
214+
215+
21: ; preds = %19, %17, %15, %13, %11, %9
216+
%22 = phi i32 [ %20, %19 ], [ %18, %17 ], [ %16, %15 ], [ %14, %13 ], [ %12, %11 ], [ %10, %9 ]
217+
br label %3
218+
219+
23: ; preds = %3
220+
ret i32 %5
221+
}

0 commit comments

Comments
 (0)