Skip to content

Commit 6ccc9e5

Browse files
committed
[AArch64] Add taildup test with computed gotos.
Add a test case showing missed optimizations from early taildup with computed gotos for #150911.
1 parent 92d0924 commit 6ccc9e5

File tree

1 file changed

+162
-0
lines changed

1 file changed

+162
-0
lines changed
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc -tail-dup-pred-size=2 -tail-dup-succ-size=2 -o - %s | FileCheck %s
3+
4+
target triple = "arm64-apple-macosx13.0.0"
5+
6+
@opcode.targets = local_unnamed_addr constant [6 x ptr] [ptr blockaddress(@test_interp, %op1.bb), ptr blockaddress(@test_interp, %op6.bb), ptr blockaddress(@test_interp, %loop.header), ptr blockaddress(@test_interp, %op2.bb), ptr blockaddress(@test_interp, %op4.bb), ptr blockaddress(@test_interp, %op5.bb)]
7+
8+
define void @test_interp(ptr %frame, ptr %dst) {
9+
; CHECK-LABEL: test_interp:
10+
; CHECK: ; %bb.0: ; %entry
11+
; CHECK-NEXT: stp x24, x23, [sp, #-64]! ; 16-byte Folded Spill
12+
; CHECK-NEXT: stp x22, x21, [sp, #16] ; 16-byte Folded Spill
13+
; CHECK-NEXT: stp x20, x19, [sp, #32] ; 16-byte Folded Spill
14+
; CHECK-NEXT: stp x29, x30, [sp, #48] ; 16-byte Folded Spill
15+
; CHECK-NEXT: .cfi_def_cfa_offset 64
16+
; CHECK-NEXT: .cfi_offset w30, -8
17+
; CHECK-NEXT: .cfi_offset w29, -16
18+
; CHECK-NEXT: .cfi_offset w19, -24
19+
; CHECK-NEXT: .cfi_offset w20, -32
20+
; CHECK-NEXT: .cfi_offset w21, -40
21+
; CHECK-NEXT: .cfi_offset w22, -48
22+
; CHECK-NEXT: .cfi_offset w23, -56
23+
; CHECK-NEXT: .cfi_offset w24, -64
24+
; CHECK-NEXT: Lloh0:
25+
; CHECK-NEXT: adrp x21, _opcode.targets@PAGE
26+
; CHECK-NEXT: Lloh1:
27+
; CHECK-NEXT: add x21, x21, _opcode.targets@PAGEOFF
28+
; CHECK-NEXT: mov x22, xzr
29+
; CHECK-NEXT: add x8, x21, xzr, lsl #3
30+
; CHECK-NEXT: mov x19, x1
31+
; CHECK-NEXT: mov x20, x0
32+
; CHECK-NEXT: add x23, x22, #1
33+
; CHECK-NEXT: br x8
34+
; CHECK-NEXT: Ltmp0: ; Block address taken
35+
; CHECK-NEXT: LBB0_1: ; %loop.header
36+
; CHECK-NEXT: ; =>This Inner Loop Header: Depth=1
37+
; CHECK-NEXT: add x8, x21, x23, lsl #3
38+
; CHECK-NEXT: mov x20, xzr
39+
; CHECK-NEXT: mov x22, xzr
40+
; CHECK-NEXT: add x23, x23, #1
41+
; CHECK-NEXT: br x8
42+
; CHECK-NEXT: Ltmp1: ; Block address taken
43+
; CHECK-NEXT: LBB0_2: ; %op1.bb
44+
; CHECK-NEXT: ; =>This Inner Loop Header: Depth=1
45+
; CHECK-NEXT: str xzr, [x19]
46+
; CHECK-NEXT: mov w8, #1 ; =0x1
47+
; CHECK-NEXT: ldr x0, [x20, #-8]!
48+
; CHECK-NEXT: ldr x9, [x0, #8]
49+
; CHECK-NEXT: str x8, [x0]
50+
; CHECK-NEXT: ldr x8, [x9, #48]
51+
; CHECK-NEXT: blr x8
52+
; CHECK-NEXT: add x8, x21, x23, lsl #3
53+
; CHECK-NEXT: add x23, x23, #1
54+
; CHECK-NEXT: br x8
55+
; CHECK-NEXT: Ltmp2: ; Block address taken
56+
; CHECK-NEXT: LBB0_3: ; %op2.bb
57+
; CHECK-NEXT: ; =>This Inner Loop Header: Depth=1
58+
; CHECK-NEXT: add x8, x21, x23, lsl #3
59+
; CHECK-NEXT: mov x20, xzr
60+
; CHECK-NEXT: add x23, x23, #1
61+
; CHECK-NEXT: str x22, [x19]
62+
; CHECK-NEXT: mov x22, xzr
63+
; CHECK-NEXT: br x8
64+
; CHECK-NEXT: Ltmp3: ; Block address taken
65+
; CHECK-NEXT: LBB0_4: ; %op4.bb
66+
; CHECK-NEXT: ; =>This Inner Loop Header: Depth=1
67+
; CHECK-NEXT: str x22, [x19]
68+
; CHECK-NEXT: add x10, x21, x23, lsl #3
69+
; CHECK-NEXT: add x23, x23, #1
70+
; CHECK-NEXT: ldur x8, [x22, #12]
71+
; CHECK-NEXT: ldur x9, [x20, #-8]
72+
; CHECK-NEXT: add x22, x22, #20
73+
; CHECK-NEXT: stp x8, x9, [x20, #-8]
74+
; CHECK-NEXT: add x20, x20, #8
75+
; CHECK-NEXT: br x10
76+
; CHECK-NEXT: Ltmp4: ; Block address taken
77+
; CHECK-NEXT: LBB0_5: ; %op5.bb
78+
; CHECK-NEXT: ; =>This Inner Loop Header: Depth=1
79+
; CHECK-NEXT: str x22, [x19]
80+
; CHECK-NEXT: add x10, x21, x23, lsl #3
81+
; CHECK-NEXT: add x23, x23, #1
82+
; CHECK-NEXT: ldur x8, [x22, #12]
83+
; CHECK-NEXT: ldur x9, [x20, #-8]
84+
; CHECK-NEXT: add x22, x22, #20
85+
; CHECK-NEXT: stp x8, x9, [x20, #-8]
86+
; CHECK-NEXT: add x20, x20, #8
87+
; CHECK-NEXT: br x10
88+
; CHECK-NEXT: Ltmp5: ; Block address taken
89+
; CHECK-NEXT: LBB0_6: ; %op6.bb
90+
; CHECK-NEXT: ; =>This Inner Loop Header: Depth=1
91+
; CHECK-NEXT: ldr x0, [x20, #-8]!
92+
; CHECK-NEXT: mov w8, #1 ; =0x1
93+
; CHECK-NEXT: ldr x9, [x0, #8]
94+
; CHECK-NEXT: str x8, [x0]
95+
; CHECK-NEXT: ldr x8, [x9, #48]
96+
; CHECK-NEXT: blr x8
97+
; CHECK-NEXT: add x8, x21, x23, lsl #3
98+
; CHECK-NEXT: add x23, x23, #1
99+
; CHECK-NEXT: br x8
100+
; CHECK-NEXT: .loh AdrpAdd Lloh0, Lloh1
101+
entry:
102+
br label %loop.header
103+
104+
loop.header:
105+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %op1.bb ], [ %iv.next, %op2.bb ], [ %iv.next, %op4.bb ], [ %iv.next, %op5.bb ], [ %iv.next, %op6.bb ], [ %iv.next, %loop.header ]
106+
%stack.pointer = phi ptr [ %frame, %entry ], [ %stack.8, %op1.bb ], [ null, %op2.bb ], [ %stack.next, %op4.bb ], [ %stack.next.2, %op5.bb ], [ %stack.4, %op6.bb ], [ null, %loop.header ]
107+
%next.instr = phi ptr [ null, %entry ], [ %next.instr, %op1.bb ], [ null, %op2.bb ], [ %next.instr.20, %op4.bb ], [ %next.instr.21, %op5.bb ], [ %next.instr, %op6.bb ], [ null, %loop.header ]
108+
%iv.next = add i64 %iv, 1
109+
%next_op = getelementptr [6 x ptr], ptr @opcode.targets, i64 0, i64 %iv
110+
indirectbr ptr %next_op, [label %op1.bb, label %op6.bb, label %loop.header, label %op2.bb, label %op4.bb, label %op5.bb]
111+
112+
op1.bb:
113+
store ptr null, ptr %dst, align 8
114+
%stack.8 = getelementptr i8, ptr %stack.pointer, i64 -8
115+
%l.0 = load ptr, ptr %stack.8, align 8
116+
store i64 1, ptr %l.0, align 8
117+
%gep.0 = getelementptr i8, ptr %l.0, i64 8
118+
%l.1 = load ptr, ptr %gep.0, align 8
119+
%gep.1 = getelementptr i8, ptr %l.1, i64 48
120+
%l.2 = load ptr, ptr %gep.1, align 8
121+
tail call void %l.2(ptr nonnull %l.0)
122+
br label %loop.header
123+
124+
op2.bb:
125+
store ptr %next.instr, ptr %dst, align 8
126+
br label %loop.header
127+
128+
op4.bb:
129+
store ptr %next.instr, ptr %dst, align 8
130+
%next.instr.20 = getelementptr i8, ptr %next.instr, i64 20
131+
%stack.2 = getelementptr i8, ptr %stack.pointer, i64 -8
132+
%l.3 = load ptr, ptr %stack.2, align 8
133+
%next.instr.12 = getelementptr i8, ptr %next.instr, i64 12
134+
%next.instr.12.val = load ptr, ptr %next.instr.12, align 2
135+
store ptr %next.instr.12.val, ptr %stack.2, align 8
136+
store ptr %l.3, ptr %stack.pointer, align 8
137+
%stack.next = getelementptr i8, ptr %stack.pointer, i64 8
138+
br label %loop.header
139+
140+
op5.bb:
141+
store ptr %next.instr, ptr %dst, align 8
142+
%next.instr.21 = getelementptr i8, ptr %next.instr, i64 20
143+
%stack.3 = getelementptr i8, ptr %stack.pointer, i64 -8
144+
%l.4 = load ptr, ptr %stack.3, align 8
145+
%next.instr.2 = getelementptr i8, ptr %next.instr, i64 12
146+
%next.instr.2.val = load ptr, ptr %next.instr.2, align 2
147+
store ptr %next.instr.2.val, ptr %stack.3, align 8
148+
store ptr %l.4, ptr %stack.pointer, align 8
149+
%stack.next.2 = getelementptr i8, ptr %stack.pointer, i64 8
150+
br label %loop.header
151+
152+
op6.bb:
153+
%stack.4 = getelementptr i8, ptr %stack.pointer, i64 -8
154+
%l.5 = load ptr, ptr %stack.4, align 8
155+
store i64 1, ptr %l.5, align 8
156+
%gep.5 = getelementptr i8, ptr %l.5, i64 8
157+
%l.6 = load ptr, ptr %gep.5, align 8
158+
%gep.6 = getelementptr i8, ptr %l.6, i64 48
159+
%l.7 = load ptr, ptr %gep.6, align 8
160+
tail call void %l.7(ptr nonnull %l.5)
161+
br label %loop.header
162+
}

0 commit comments

Comments
 (0)