1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
|
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3
; RUN: llc -aarch64-min-jump-table-entries=4 -mtriple=arm64-apple-ios -enable-subreg-liveness=false < %s | sed -e "/; kill: /d" | FileCheck %s
; RUN: llc -aarch64-min-jump-table-entries=4 -mtriple=arm64-apple-ios -enable-subreg-liveness=true < %s | FileCheck %s
; Check there's no assert in spilling from implicit-def operands on an
; IMPLICIT_DEF.
define void @widget(i32 %arg, i32 %arg1, ptr %arg2, ptr %arg3, ptr %arg4, i32 %arg5, i1 %arg6) {
; CHECK-LABEL: widget:
; CHECK: ; %bb.0: ; %bb
; CHECK-NEXT: sub sp, sp, #144
; CHECK-NEXT: stp x28, x27, [sp, #48] ; 16-byte Folded Spill
; CHECK-NEXT: stp x26, x25, [sp, #64] ; 16-byte Folded Spill
; CHECK-NEXT: stp x24, x23, [sp, #80] ; 16-byte Folded Spill
; CHECK-NEXT: stp x22, x21, [sp, #96] ; 16-byte Folded Spill
; CHECK-NEXT: stp x20, x19, [sp, #112] ; 16-byte Folded Spill
; CHECK-NEXT: stp x29, x30, [sp, #128] ; 16-byte Folded Spill
; CHECK-NEXT: .cfi_def_cfa_offset 144
; CHECK-NEXT: .cfi_offset w30, -8
; CHECK-NEXT: .cfi_offset w29, -16
; CHECK-NEXT: .cfi_offset w19, -24
; CHECK-NEXT: .cfi_offset w20, -32
; CHECK-NEXT: .cfi_offset w21, -40
; CHECK-NEXT: .cfi_offset w22, -48
; CHECK-NEXT: .cfi_offset w23, -56
; CHECK-NEXT: .cfi_offset w24, -64
; CHECK-NEXT: .cfi_offset w25, -72
; CHECK-NEXT: .cfi_offset w26, -80
; CHECK-NEXT: .cfi_offset w27, -88
; CHECK-NEXT: .cfi_offset w28, -96
; CHECK-NEXT: mov w19, w6
; CHECK-NEXT: mov w20, w5
; CHECK-NEXT: mov x21, x4
; CHECK-NEXT: mov x22, x3
; CHECK-NEXT: mov x23, x2
; CHECK-NEXT: mov w24, w1
; CHECK-NEXT: mov w25, w0
; CHECK-NEXT: mov w26, w1
; CHECK-NEXT: Lloh0:
; CHECK-NEXT: adrp x27, LJTI0_0@PAGE
; CHECK-NEXT: Lloh1:
; CHECK-NEXT: add x27, x27, LJTI0_0@PAGEOFF
; CHECK-NEXT: mov w28, #1 ; =0x1
; CHECK-NEXT: ; implicit-def: $w8
; CHECK-NEXT: str x8, [sp, #40] ; 8-byte Folded Spill
; CHECK-NEXT: b LBB0_2
; CHECK-NEXT: LBB0_1: ; %bb10
; CHECK-NEXT: ; in Loop: Header=BB0_2 Depth=1
; CHECK-NEXT: mov w0, w20
; CHECK-NEXT: mov x1, x22
; CHECK-NEXT: str wzr, [x21]
; CHECK-NEXT: bl _putc
; CHECK-NEXT: mov w0, w25
; CHECK-NEXT: mov x1, xzr
; CHECK-NEXT: bl _putc
; CHECK-NEXT: LBB0_2: ; %bb8
; CHECK-NEXT: ; =>This Inner Loop Header: Depth=1
; CHECK-NEXT: cmp w24, #39
; CHECK-NEXT: b.hi LBB0_5
; CHECK-NEXT: ; %bb.3: ; %bb8
; CHECK-NEXT: ; in Loop: Header=BB0_2 Depth=1
; CHECK-NEXT: adr x8, LBB0_1
; CHECK-NEXT: ldrb w9, [x27, x26]
; CHECK-NEXT: add x8, x8, x9, lsl #2
; CHECK-NEXT: br x8
; CHECK-NEXT: LBB0_4: ; %bb9
; CHECK-NEXT: ; in Loop: Header=BB0_2 Depth=1
; CHECK-NEXT: str w28, [x23]
; CHECK-NEXT: b LBB0_2
; CHECK-NEXT: LBB0_5: ; %bb8
; CHECK-NEXT: ; in Loop: Header=BB0_2 Depth=1
; CHECK-NEXT: cmp w24, #64
; CHECK-NEXT: b.ne LBB0_2
; CHECK-NEXT: b LBB0_9
; CHECK-NEXT: LBB0_6: ; %bb13
; CHECK-NEXT: ; in Loop: Header=BB0_2 Depth=1
; CHECK-NEXT: mov w8, #1 ; =0x1
; CHECK-NEXT: str x8, [sp, #40] ; 8-byte Folded Spill
; CHECK-NEXT: tbz w19, #0, LBB0_2
; CHECK-NEXT: ; %bb.7: ; %bb14
; CHECK-NEXT: ; in Loop: Header=BB0_2 Depth=1
; CHECK-NEXT: mov x0, xzr
; CHECK-NEXT: mov x1, xzr
; CHECK-NEXT: mov w8, #1 ; =0x1
; CHECK-NEXT: stp xzr, xzr, [sp]
; CHECK-NEXT: stp x8, xzr, [sp, #16]
; CHECK-NEXT: bl _fprintf
; CHECK-NEXT: b LBB0_2
; CHECK-NEXT: LBB0_8: ; %bb12
; CHECK-NEXT: ; =>This Inner Loop Header: Depth=1
; CHECK-NEXT: b LBB0_8
; CHECK-NEXT: LBB0_9: ; %bb16
; CHECK-NEXT: ldr x8, [sp, #40] ; 8-byte Folded Reload
; CHECK-NEXT: mov x0, xzr
; CHECK-NEXT: mov x1, xzr
; CHECK-NEXT: str x8, [sp]
; CHECK-NEXT: bl _fprintf
; CHECK-NEXT: brk #0x1
; CHECK-NEXT: .loh AdrpAdd Lloh0, Lloh1
; CHECK-NEXT: .cfi_endproc
; CHECK-NEXT: .section __TEXT,__const
; CHECK-NEXT: LJTI0_0:
; CHECK-NEXT: .byte (LBB0_6-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_8-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_4-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_1-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_2-LBB0_1)>>2
; CHECK-NEXT: .byte (LBB0_1-LBB0_1)>>2
bb:
br label %bb7
bb7: ; preds = %bb14, %bb13, %bb
%phi = phi i32 [ poison, %bb ], [ %mul, %bb14 ], [ %mul, %bb13 ]
br label %bb8
bb8: ; preds = %bb10, %bb9, %bb8, %bb7
switch i32 %arg1, label %bb8 [
i32 10, label %bb9
i32 64, label %bb16
i32 0, label %bb13
i32 39, label %bb10
i32 34, label %bb10
i32 1, label %bb12
]
bb9: ; preds = %bb8
store i32 1, ptr %arg2, align 4
br label %bb8
bb10: ; preds = %bb8, %bb8
store i32 0, ptr %arg4, align 4
%call = tail call i32 @putc(i32 %arg5, ptr %arg3)
%call11 = tail call i32 @putc(i32 %arg, ptr null)
br label %bb8
bb12: ; preds = %bb12, %bb8
br label %bb12
bb13: ; preds = %bb8
%mul = mul i32 1, 1
br i1 %arg6, label %bb14, label %bb7
bb14: ; preds = %bb13
%call15 = tail call i32 (ptr, ptr, ...) @fprintf(ptr null, ptr null, ptr null, i32 0, i32 %mul, ptr null)
br label %bb7
bb16: ; preds = %bb8
%call17 = tail call i32 (ptr, ptr, ...) @fprintf(ptr null, ptr null, i32 %phi)
unreachable
}
declare i32 @fprintf(ptr, ptr, ...)
declare i32 @putc(i32, ptr)
|