[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / CodeGen / AArch64 / framelayout-sve.mir
blob7c87587c6dc4e2c6b2d127b45d43e6d4b47ce49f
1 # RUN: llc -mattr=+sve -mtriple=aarch64-none-linux-gnu -run-pass=prologepilog %s -o - | FileCheck %s
2 # RUN: llc -mtriple=aarch64-none-linux-gnu -mattr=+sve -start-before=prologepilog %s -o - | FileCheck %s --check-prefix=ASM
3 # RUN: llc -mtriple=aarch64-none-linux-gnu -mattr=+sve -start-before=prologepilog %s -filetype=obj -o %t
4 # RUN: llvm-objdump --dwarf=frames %t | FileCheck %s --check-prefix=UNWINDINFO
5 # RUN: rm -rf %t
7 # Test allocation and deallocation of SVE objects on the stack,
8 # as well as using a combination of scalable and non-scalable
9 # offsets to access the SVE on the stack.
11 # SVE objects are allocated below the (scalar) callee saves,
12 # and above spills/locals and the alignment gap, e.g.
14 #     +-------------+
15 #     | stack arg   |
16 #     +-------------+ <- SP before call
17 #     | Callee Saves|
18 #     | Frame record|       (if available)
19 #     |-------------| <- FP (if available)
20 #     |  SVE area   |
21 #     +-------------+
22 #     |/////////////| alignment gap.
23 #     |     :       |
24 #     | Stack objs  |
25 #     |     :       |
26 #     +-------------+ <- SP after call and frame-setup
28 --- |
30   define void @test_allocate_sve() uwtable { entry: unreachable }
31   define void @test_allocate_sve_gpr_callee_saves() uwtable { entry: unreachable }
32   define void @test_allocate_sve_gpr_realigned() uwtable { entry: unreachable }
33   define void @test_address_sve() uwtable { entry: unreachable }
34   define void @test_address_sve_fp() uwtable { entry: unreachable }
35   define void @test_stack_arg_sve() uwtable { entry: unreachable }
36   define void @test_address_sve_out_of_range() uwtable { entry: unreachable }
37   define void @test_address_gpr_vla() uwtable { entry: unreachable }
38   define aarch64_sve_vector_pcs void @save_restore_pregs_sve() uwtable { entry: unreachable }
39   define aarch64_sve_vector_pcs void @save_restore_zregs_sve() uwtable { entry: unreachable }
40   define aarch64_sve_vector_pcs void @save_restore_sve() uwtable { entry: unreachable }
41   define aarch64_sve_vector_pcs void @save_restore_sve_realign() uwtable { entry: unreachable }
42   define aarch64_sve_vector_pcs void @frame_layout() uwtable { entry: unreachable }
43   define void @fp_relative_index_with_float_save() uwtable { entry: unreachable }
44   define void @fp_relative_that_is_not_a_multiple_of_VLx16() uwtable { entry: unreachable }
46 ...
47 # +----------+
48 # |scratchreg|  // x29 is used as scratch reg.
49 # +----------+
50 # | %stack.0 |  // scalable SVE object of n * 18 bytes, aligned to 16 bytes,
51 # |          |  // to be materialized with 2*ADDVL (<=> 2 * n * 16bytes)
52 # +----------+
53 # | %stack.1 |  // not scalable
54 # +----------+ <- SP
56 # CHECK-LABEL: name: test_allocate_sve
57 # CHECK:       stackSize: 32
59 # CHECK:      bb.0.entry:
60 # CHECK-NEXT: $sp = frame-setup STRXpre killed $[[SCRATCH:[a-z0-9]+]], $sp, -16
61 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16
62 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16
63 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -2
64 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x10, 0x92, 0x2e, 0x00, 0x1e, 0x22
65 # CHECK-NEXT: $sp = frame-setup SUBXri $sp, 16, 0
66 # CHECK-NEXT: CFI_INSTRUCTION escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x20, 0x22, 0x11, 0x10, 0x92, 0x2e, 0x00, 0x1e, 0x22
68 # CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 2
69 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 32
70 # CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 16, 0
71 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 16
72 # CHECK-NEXT: $sp, $[[SCRATCH]] = frame-destroy LDRXpost $sp, 16
73 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0
74 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29
75 # CHECK-NEXT: RET_ReallyLR
77 # ASM-LABEL: test_allocate_sve:
78 # ASM:       .cfi_def_cfa_offset 16
79 # ASM-NEXT:  .cfi_offset w29, -16
80 # ASM:       .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x10, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 16 * VG
81 # ASM:       .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x20, 0x22, 0x11, 0x10, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 32 + 16 * VG
82 # ASM:       .cfi_def_cfa wsp, 32
83 # ASM:       .cfi_def_cfa_offset 16
84 # ASM:       .cfi_def_cfa_offset 0
85 # ASM-NEXT:  .cfi_restore w29
88 # UNWINDINFO:       DW_CFA_def_cfa_offset: +16
89 # UNWINDINFO-NEXT:  DW_CFA_offset: reg29 -16
90 # UNWINDINFO:       DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +16, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
91 # UNWINDINFO:       DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +32, DW_OP_plus, DW_OP_consts +16, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
92 # UNWINDINFO:       DW_CFA_def_cfa: reg31 +32
93 # UNWINDINFO:       DW_CFA_def_cfa_offset: +16
94 # UNWINDINFO:       DW_CFA_def_cfa_offset: +0
95 # UNWINDINFO-NEXT:  DW_CFA_restore: reg29
98 name:            test_allocate_sve
99 stack:
100   - { id: 0, stack-id: scalable-vector, size: 18, alignment: 2 }
101   - { id: 1, stack-id: default, size: 16, alignment: 8 }
102 body:             |
103   bb.0.entry:
104     RET_ReallyLR
107 # +----------+
108 # | x20, x21 |  // callee saves
109 # |scratchreg|  // x29 is used as scratch reg.
110 # +----------+
111 # | %stack.0 |  // scalable objects
112 # +----------+
113 # | %stack.1 |  // not scalable
114 # +----------+ <- SP
116 # CHECK-LABEL: name: test_allocate_sve_gpr_callee_saves
117 # CHECK:       stackSize: 48
119 # CHECK:      bb.0.entry:
120 # CHECK-NEXT: liveins:
121 # CHECK-NEXT: {{  $}}
122 # CHECK-NEXT: $sp = frame-setup STRXpre killed $[[SCRATCH:[a-z0-9]+]], $sp, -32
123 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 32
124 # CHECK-NEXT: frame-setup STPXi killed $x21, killed $x20, $sp, 2
125 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w20, -8
126 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w21, -16
127 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -32
128 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -2
129 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x20, 0x22, 0x11, 0x10, 0x92, 0x2e, 0x00, 0x1e, 0x22
130 # CHECK-NEXT: $sp = frame-setup SUBXri $sp, 16, 0
131 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x30, 0x22, 0x11, 0x10, 0x92, 0x2e, 0x00, 0x1e, 0x22
133 # CHECK-NEXT: $x20 = IMPLICIT_DEF
134 # CHECK-NEXT: $x21 = IMPLICIT_DEF
135 # CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 2
136 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 48
137 # CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 16, 0
138 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 32
139 # CHECK-NEXT: $x21, $x20 = frame-destroy LDPXi $sp, 2
140 # CHECK-NEXT: $sp, $[[SCRATCH]] = frame-destroy LDRXpost $sp, 32
141 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0
142 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w20
143 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w21
144 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29
145 # CHECK-NEXT: RET_ReallyLR
147 # ASM-LABEL: test_allocate_sve_gpr_callee_saves:
148 # ASM:       .cfi_def_cfa_offset 32
149 # ASM:       .cfi_offset w20, -8
150 # ASM-NEXT:  .cfi_offset w21, -16
151 # ASM-NEXT:  .cfi_offset w29, -32
152 # ASM:       .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x20, 0x22, 0x11, 0x10, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 32 + 16 * VG
153 # ASM:       .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x30, 0x22, 0x11, 0x10, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 48 + 16 * VG
155 # ASM:       .cfi_def_cfa wsp, 48
156 # ASM:       .cfi_def_cfa_offset 32
157 # ASM:       .cfi_def_cfa_offset 0
158 # ASM-NEXT:  .cfi_restore w20
159 # ASM-NEXT:  .cfi_restore w21
160 # ASM-NEXT:  .cfi_restore w29
163 # UNWINDINFO:       DW_CFA_def_cfa_offset: +32
164 # UNWINDINFO:       DW_CFA_offset: reg20 -8
165 # UNWINDINFO-NEXT:  DW_CFA_offset: reg21 -16
166 # UNWINDINFO-NEXT:  DW_CFA_offset: reg29 -32
167 # UNWINDINFO:       DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +32, DW_OP_plus, DW_OP_consts +16, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
168 # UNWINDINFO:       DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +48, DW_OP_plus, DW_OP_consts +16, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
170 # UNWINDINFO:       DW_CFA_def_cfa: reg31 +48
171 # UNWINDINFO:       DW_CFA_def_cfa_offset: +32
172 # UNWINDINFO:       DW_CFA_def_cfa_offset: +0
173 # UNWINDINFO-NEXT:  DW_CFA_restore: reg20
174 # UNWINDINFO-NEXT:  DW_CFA_restore: reg21
175 # UNWINDINFO-NEXT:  DW_CFA_restore: reg29
177 name:            test_allocate_sve_gpr_callee_saves
178 stack:
179   - { id: 0, stack-id: scalable-vector, size: 18, alignment: 2 }
180   - { id: 1, stack-id: default, size: 16, alignment: 8 }
181 body:             |
182   bb.0.entry:
183     $x20 = IMPLICIT_DEF
184     $x21 = IMPLICIT_DEF
185     RET_ReallyLR
188 # +----------+
189 # |  lr, fp  |  // frame record
190 # +----------+ <- FP
191 # | %stack.0 |  // scalable objects
192 # +----------+
193 # |//////////|  // alignment gap
194 # | %stack.1 |  // not scalable
195 # +----------+ <- SP
196 # CHECK-LABEL: name: test_allocate_sve_gpr_realigned
197 # CHECK:       stackSize: 32
199 # CHECK:      bb.0.entry:
200 # CHECK-NEXT: liveins:
201 # CHECK-NEXT: {{  $}}
202 # CHECK-NEXT: $sp = frame-setup STPXpre killed $fp, killed $lr, $sp, -2
203 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16
204 # CHECK-NEXT: $fp = frame-setup ADDXri $sp, 0, 0
205 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa $w29, 16
206 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w30, -8
207 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16
208 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -2
209 # CHECK-NEXT: $[[TMP:x[0-9]+]] = frame-setup SUBXri $sp, 16, 0
210 # CHECK-NEXT: $sp = ANDXri killed $[[TMP]]
211 # CHECK-NEXT: $sp = frame-destroy ADDXri $fp, 0, 0
212 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 16
213 # CHECK-NEXT: $sp, $fp, $lr = frame-destroy LDPXpost $sp, 2
214 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0
215 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w30
216 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29
217 # CHECK-NEXT: RET_ReallyLR
219 # ASM-LABEL: test_allocate_sve_gpr_realigned:
220 # ASM:       .cfi_def_cfa_offset 16
221 # ASM:       .cfi_def_cfa w29, 16
222 # ASM-NEXT:  .cfi_offset w30, -8
223 # ASM-NEXT:  .cfi_offset w29, -16
225 # ASM:        .cfi_def_cfa wsp, 16
226 # ASM:        .cfi_def_cfa_offset 0
227 # ASM-NEXT:   .cfi_restore w30
228 # ASM-NEXT:   .cfi_restore w29
231 # UNWINDINFO:       DW_CFA_def_cfa_offset: +16
232 # UNWINDINFO:       DW_CFA_def_cfa: reg29 +16
233 # UNWINDINFO-NEXT:  DW_CFA_offset: reg30 -8
234 # UNWINDINFO-NEXT:  DW_CFA_offset: reg29 -16
236 # UNWINDINFO:       DW_CFA_def_cfa: reg31 +16
237 # UNWINDINFO:       DW_CFA_def_cfa_offset: +0
238 # UNWINDINFO-NEXT:  DW_CFA_restore: reg30
239 # UNWINDINFO-NEXT:  DW_CFA_restore: reg29
242 name:            test_allocate_sve_gpr_realigned
243 stack:
244   - { id: 0, stack-id: scalable-vector, size: 18, alignment: 2  }
245   - { id: 1, stack-id: default, size: 16, alignment: 32 }
246 body:             |
247   bb.0.entry:
248     RET_ReallyLR
251 # +----------+
252 # | x20, x21 |  // callee saves
253 # +----------+
254 # | %stack.0 |  // scalable @ SP + 16b + 32 scalable bytes
255 # | %stack.1 |  // scalable @ SP + 16b + 16 scalable bytes
256 # | %stack.2 |  // scalable @ SP + 16b + 14 scalable bytes
257 # +----------+
258 # | %stack.3 |  // not scalable
259 # +----------+ <- SP
261 # CHECK-LABEL: name: test_address_sve
262 # CHECK:       stackSize: 32
264 # CHECK:      bb.0.entry:
265 # CHECK-NEXT: liveins:
266 # CHECK-NEXT: {{  $}}
267 # CHECK-NEXT: $sp = frame-setup STRXpre killed $[[SCRATCH:[a-z0-9]+]], $sp, -16
268 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16
269 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16
270 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -3
271 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x18, 0x92, 0x2e, 0x00, 0x1e, 0x22
272 # CHECK-NEXT: $sp = frame-setup SUBXri $sp, 16, 0
273 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x20, 0x22, 0x11, 0x18, 0x92, 0x2e, 0x00, 0x1e, 0x22
275 # CHECK-NEXT: $[[TMP:x[0-9]+]] = ADDXri $sp, 16
276 # CHECK-NEXT: STR_ZXI $z0, killed $[[TMP]], 2
277 # CHECK-NEXT: $[[TMP:x[0-9]+]] = ADDXri $sp, 16
278 # CHECK-NEXT: STR_ZXI $z1, killed $[[TMP]], 1
279 # CHECK-NEXT: $[[TMP:x[0-9]+]] = ADDXri $sp, 16
280 # CHECK-NEXT: STR_PXI $p0, killed $[[TMP]], 7
282 # CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 3
283 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 32
285 # CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 16, 0
286 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 16
287 # CHECK-NEXT: $sp, $[[SCRATCH]] = frame-destroy LDRXpost $sp, 16
288 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0
289 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29
290 # CHECK-NEXT: RET_ReallyLR
292 # ASM-LABEL:  test_address_sve:
293 # ASM:       .cfi_def_cfa_offset 16
294 # ASM-NEXT:  .cfi_offset w29, -16
295 # ASM:       .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x18, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 24 * VG
296 # ASM:       .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x20, 0x22, 0x11, 0x18, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 32 + 24 * VG
298 # ASM:       .cfi_def_cfa wsp, 32
299 # ASM:       .cfi_def_cfa_offset 16
300 # ASM:       .cfi_def_cfa_offset 0
301 # ASM-NEXT:  .cfi_restore w29
303 # UNWINDINFO:       DW_CFA_def_cfa_offset: +16
304 # UNWINDINFO-NEXT:  DW_CFA_offset: reg29 -16
305 # UNWINDINFO:       DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +24, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
306 # UNWINDINFO:       DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +32, DW_OP_plus, DW_OP_consts +24, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
308 # UNWINDINFO:       DW_CFA_def_cfa: reg31 +32
309 # UNWINDINFO:       DW_CFA_def_cfa_offset: +16
310 # UNWINDINFO:       DW_CFA_def_cfa_offset: +0
311 # UNWINDINFO-NEXT:  DW_CFA_restore: reg29
314 name:            test_address_sve
315 frameInfo:
316   maxAlignment:  16
317 stack:
318   - { id: 0, stack-id: scalable-vector, size: 16, alignment: 8 }
319   - { id: 1, stack-id: scalable-vector, size: 16, alignment: 8 }
320   - { id: 2, stack-id: scalable-vector, size:  2, alignment: 2 }
321   - { id: 3, stack-id: default, size: 16, alignment: 8 }
322 body:             |
323   bb.0.entry:
324     liveins: $z0, $z1, $p0
326     STR_ZXI $z0, %stack.0, 0
327     STR_ZXI $z1, %stack.1, 0
328     STR_PXI $p0, %stack.2, 0
330     RET_ReallyLR
333 # +-----------+
334 # | x20, x21  |  // callee saves
335 # |  lr, fp   |  // frame record
336 # +-----------+ <- FP
337 # | %stack.0  |  // scalable @ FP - 16 scalable bytes
338 # | %stack.1  |  // scalable @ FP - 32 scalable bytes
339 # | %stack.2  |  // scalable @ FP - 34 scalable bytes
340 # +-----------+
341 # | %stack.3  |  // not scalable
342 # +-----------+ <- SP
344 # CHECK-LABEL: name: test_address_sve_fp
345 # CHECK:       stackSize: 32
347 # CHECK:      bb.0.entry:
348 # CHECK-NEXT: liveins:
349 # CHECK-NEXT: {{  $}}
350 # CHECK-NEXT: $sp = frame-setup STPXpre killed $fp, killed $lr, $sp, -2
351 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16
352 # CHECK-NEXT: $fp = frame-setup ADDXri $sp, 0, 0
353 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa $w29, 16
354 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w30, -8
355 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16
356 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -3
357 # CHECK-NEXT: $sp = frame-setup SUBXri $sp, 16, 0
359 # CHECK-NEXT: STR_ZXI $z0, $fp, -1
360 # CHECK-NEXT: STR_ZXI $z1, $fp, -2
361 # CHECK-NEXT: STR_PXI $p0, $fp, -17
363 # CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 3
364 # CHECK:      $sp = frame-destroy ADDXri $sp, 16, 0
365 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 16
366 # CHECK-NEXT: $sp, $fp, $lr = frame-destroy LDPXpost $sp, 2
367 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0
368 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w30
369 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29
370 # CHECK-NEXT: RET_ReallyLR
372 # ASM-LABEL: test_address_sve_fp:
373 # ASM:       .cfi_def_cfa_offset 16
374 # ASM:       .cfi_def_cfa w29, 16
375 # ASM-NEXT:  .cfi_offset w30, -8
376 # ASM-NEXT:  .cfi_offset w29, -16
378 # ASM:       .cfi_def_cfa wsp, 16
379 # ASM:       .cfi_def_cfa_offset 0
380 # ASM-NEXT:  .cfi_restore w30
381 # ASM-NEXT:  .cfi_restore w29
383 # UNWINDINFO:      DW_CFA_def_cfa_offset: +16
384 # UNWINDINFO:      DW_CFA_def_cfa: reg29 +16
385 # UNWINDINFO-NEXT: DW_CFA_offset: reg30 -8
386 # UNWINDINFO-NEXT: DW_CFA_offset: reg29 -16
388 # UNWINDINFO:      DW_CFA_def_cfa: reg31 +16
389 # UNWINDINFO:      DW_CFA_def_cfa_offset: +0
390 # UNWINDINFO-NEXT: DW_CFA_restore: reg30
391 # UNWINDINFO-NEXT: DW_CFA_restore: reg29
393 name:            test_address_sve_fp
394 frameInfo:
395   maxAlignment:  16
396   isFrameAddressTaken: true
397 stack:
398   - { id: 0, stack-id: scalable-vector, size: 16, alignment: 8 }
399   - { id: 1, stack-id: scalable-vector, size: 16, alignment: 8 }
400   - { id: 2, stack-id: scalable-vector, size:  2, alignment: 2 }
401   - { id: 3, stack-id: default, size: 16, alignment: 8 }
402 body:             |
403   bb.0.entry:
404     liveins: $z0, $z1, $p0
406     STR_ZXI $z0, %stack.0, 0
407     STR_ZXI $z1, %stack.1, 0
408     STR_PXI $p0, %stack.2, 0
410     RET_ReallyLR
413 # +-----------+
414 # | %fstack.1 |  // stack arg @ SP + 16 scalable bytes + 32 bytes.
415 # +-----------+
416 # |callee save|  // register saved as scratch reg.
417 # +-----------+
418 # | %stack.0  |  // vector of 16 scalable bytes
419 # +---------- +
420 # | %stack.1  |  // not scalable, 16 bytes
421 # +-----------+ <- SP
422 # CHECK-LABEL: name: test_stack_arg_sve
423 # CHECK:       stackSize: 32
425 # CHECK:      bb.0.entry:
426 # CHECK-NEXT: liveins:
427 # CHECK-NEXT: {{  $}}
428 # CHECK-NEXT: $sp = frame-setup STRXpre killed $[[SCRATCH:[a-z0-9]+]], $sp, -16
429 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16
430 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16
432 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -1
433 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0x2e, 0x00, 0x1e, 0x22
434 # CHECK-NEXT: $sp = frame-setup SUBXri $sp, 16, 0
435 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x20, 0x22, 0x11, 0x08, 0x92, 0x2e, 0x00, 0x1e, 0x22
436 # CHECK:      $[[TMP:x[0-9]+]] = ADDVL_XXI $sp, 1
437 # CHECK-NEXT: $x0 = LDRXui killed $[[TMP]], 4
439 # CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 1
440 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 32
441 # CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 16, 0
442 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 16
443 # CHECK-NEXT: $sp, $[[SCRATCH]] = frame-destroy LDRXpost $sp, 16
444 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0
445 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29
446 # CHECK-NEXT: RET_ReallyLR
448 # ASM-LABEL: test_stack_arg_sve:
449 # ASM:       .cfi_def_cfa_offset 16
450 # ASM-NEXT:  .cfi_offset w29, -16
451 # ASM:       .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 8 * VG
452 # ASM:       .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x20, 0x22, 0x11, 0x08, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 32 + 8 * VG
454 # ASM:       .cfi_def_cfa wsp, 32
455 # ASM:       .cfi_def_cfa_offset 16
456 # ASM:       .cfi_def_cfa_offset 0
457 # ASM-NEXT:  .cfi_restore w29
459 # UNWINDINFO:      DW_CFA_def_cfa_offset: +16
460 # UNWINDINFO-NEXT: DW_CFA_offset: reg29 -16
461 # UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +8, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
462 # UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +32, DW_OP_plus, DW_OP_consts +8, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
464 # UNWINDINFO:      DW_CFA_def_cfa: reg31 +32
465 # UNWINDINFO:      DW_CFA_def_cfa_offset: +16
466 # UNWINDINFO:      DW_CFA_def_cfa_offset: +0
467 # UNWINDINFO-NEXT: DW_CFA_restore: reg29
469 name:             test_stack_arg_sve
470 fixedStack:
471   - { id: 0, stack-id: default, size: 16, alignment: 16, offset: 0 }
472 stack:
473   - { id: 0, stack-id: scalable-vector, size: 16, alignment: 16 }
474   - { id: 1, stack-id: default, size: 16, alignment: 16 }
475 body:             |
476   bb.0.entry:
477     liveins: $x0
479     $x0 = LDRXui %fixed-stack.0, 0
480     RET_ReallyLR
483 # Test that the address to access an SVE data vector at an offset that
484 # does not fit its immediate, is correctly materialized.
485 # +----------+
486 # |calleesave|  // register saved as scratch reg.
487 # +----------+
488 # | %stack.0 |  // one SVE data object @ SP + 256 scalable bytes.
489 # |::::::::::|
490 # |:        :|
491 # |:%stack.1:|  // Large object
492 # |:        :|
493 # |::::::::::|
494 # +----------+ <- SP
495 # CHECK-LABEL: name: test_address_sve_out_of_range
496 # CHECK:       stackSize: 16
498 # CHECK:      bb.0.entry:
499 # CHECK-NEXT: liveins:
500 # CHECK-NEXT: {{  $}}
501 # CHECK-NEXT: $sp = frame-setup STRXpre killed $[[SCRATCH:[a-z0-9]+]], $sp, -16
502 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16
503 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16
504 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32
505 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x80, 0x02, 0x92, 0x2e, 0x00, 0x1e, 0x22
506 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32
507 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x80, 0x04, 0x92, 0x2e, 0x00, 0x1e, 0x22
508 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32
509 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x80, 0x06, 0x92, 0x2e, 0x00, 0x1e, 0x22
510 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32
511 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x80, 0x08, 0x92, 0x2e, 0x00, 0x1e, 0x22
512 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32
513 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x80, 0x0a, 0x92, 0x2e, 0x00, 0x1e, 0x22
514 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32
515 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x80, 0x0c, 0x92, 0x2e, 0x00, 0x1e, 0x22
516 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32
517 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x80, 0x0e, 0x92, 0x2e, 0x00, 0x1e, 0x22
518 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32
519 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x80, 0x10, 0x92, 0x2e, 0x00, 0x1e, 0x22
520 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -1
521 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x88, 0x10, 0x92, 0x2e, 0x00, 0x1e, 0x22
523 # CHECK-NEXT: $[[TMP2:x[0-9]+]] = ADDVL_XXI $sp, 1
524 # CHECK-NEXT: STR_ZXI $z0, killed $[[TMP2]], 255
526 # CHECK-NEXT: $[[TMP2:x[0-9]+]] = ADDPL_XXI $sp, 1
527 # CHECK-NEXT: STR_PXI $p0, killed $[[TMP2]], 255
529 # CHECK:      $sp = frame-destroy ADDVL_XXI $sp, 31
530 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x90, 0x0e, 0x92, 0x2e, 0x00, 0x1e, 0x22
531 # CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31
532 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x98, 0x0c, 0x92, 0x2e, 0x00, 0x1e, 0x22
533 # CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31
534 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0xa0, 0x0a, 0x92, 0x2e, 0x00, 0x1e, 0x22
535 # CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31
536 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0xa8, 0x08, 0x92, 0x2e, 0x00, 0x1e, 0x22
537 # CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31
538 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0xb0, 0x06, 0x92, 0x2e, 0x00, 0x1e, 0x22
539 # CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31
540 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0xb8, 0x04, 0x92, 0x2e, 0x00, 0x1e, 0x22
541 # CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31
542 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0xc0, 0x02, 0x92, 0x2e, 0x00, 0x1e, 0x22
543 # CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31
544 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0xc8, 0x00, 0x92, 0x2e, 0x00, 0x1e, 0x22
545 # CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 9
546 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 16
547 # CHECK-NEXT: $sp, $[[SCRATCH]] = frame-destroy LDRXpost $sp, 16
548 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0
549 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29
550 # CHECK-NEXT: RET_ReallyLR
552 # ASM-LABEL: test_address_sve_out_of_range:
553 # ASM:       .cfi_def_cfa_offset 16
554 # ASM-NEXT:  .cfi_offset w29, -16
555 # ASM:       .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x80, 0x02, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 256 * VG
556 # ASM:       .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x80, 0x04, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 512 * VG
557 # ASM:       .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x80, 0x06, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 768 * VG
558 # ASM:       .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x80, 0x08, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 1024 * VG
559 # ASM:       .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x80, 0x0a, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 1280 * VG
560 # ASM:       .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x80, 0x0c, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 1536 * VG
561 # ASM:       .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x80, 0x0e, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 1792 * VG
562 # ASM:       .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x80, 0x10, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 2048 * VG
563 # ASM:       .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x88, 0x10, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 2056 * VG
565 # ASM:       .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x90, 0x0e, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 1808 * VG
566 # ASM:       .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x98, 0x0c, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 1560 * VG
567 # ASM:       .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0xa0, 0x0a, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 1312 * VG
568 # ASM:       .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0xa8, 0x08, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 1064 * VG
569 # ASM:       .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0xb0, 0x06, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 816 * VG
570 # ASM:       .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0xb8, 0x04, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 568 * VG
571 # ASM:       .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0xc0, 0x02, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 320 * VG
572 # ASM:       .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0xc8, 0x00, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 72 * VG
573 # ASM:        .cfi_def_cfa wsp, 16
574 # ASM:       .cfi_def_cfa_offset 0
575 # ASM-NEXT:  .cfi_restore w29
577 # UNWINDINFO:      DW_CFA_def_cfa_offset: +16
578 # UNWINDINFO-NEXT: DW_CFA_offset: reg29 -16
579 # UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +256, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
580 # UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +512, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
581 # UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +768, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
582 # UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +1024, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
583 # UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +1280, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
584 # UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +1536, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
585 # UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +1792, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
586 # UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +2048, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
587 # UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +2056, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
589 # UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +1808, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
590 # UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +1560, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
591 # UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +1312, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
592 # UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +1064, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
593 # UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +816, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
594 # UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +568, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
595 # UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +320, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
596 # UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +72, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
597 # UNWINDINFO:      DW_CFA_def_cfa: reg31 +16
598 # UNWINDINFO:      DW_CFA_def_cfa_offset: +0
599 # UNWINDINFO-NEXT: DW_CFA_restore: reg29
601 name:            test_address_sve_out_of_range
602 frameInfo:
603   maxAlignment:  16
604 stack:
605   - { id: 0, stack-id: scalable-vector, size:   16, alignment: 16 }
606   - { id: 1, stack-id: scalable-vector, size: 3584, alignment: 16 }
607   - { id: 2, stack-id: scalable-vector, size:  512, alignment: 16 }
609 body:             |
610   bb.0.entry:
611     liveins: $z0, $p0
613     STR_ZXI $z0, %stack.0, 0
614     STR_PXI $p0, %stack.1, 0
616     RET_ReallyLR
619 # Test that non-SVE objects are accessed from BP when there are
620 # variable length arrays, because it will be more expensive to
621 # access from the FP when there are also SVE objects on the stack.
623 # +----------+ <- FP
624 # | %stack.0 |  // 16 scalable bytes
625 # +----------+ <- @FP - 16 scalable bytes
626 # | %stack.1 |  // 16 bytes
627 # +----------+ <- @BP
628 # : %stack.2 :  // variable length
629 # +----------+ <- SP
631 # CHECK-LABEL: name: test_address_gpr_vla
632 # CHECK: bb.0.entry:
633 # CHECK-NEXT: liveins:
634 # CHECK-NEXT: {{  $}}
635 # CHECK-NEXT: early-clobber $sp = frame-setup STPXpre killed $fp, killed $lr, $sp, -4
636 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 32
637 # CHECK-NEXT: frame-setup STRXui killed $x19, $sp, 2
638 # CHECK-NEXT: $fp = frame-setup ADDXri $sp, 0, 0
639 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa $w29, 32
640 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w19, -16
641 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w30, -24
642 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -32
643 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -1
644 # CHECK-NEXT: $sp = frame-setup SUBXri $sp, 16, 0
645 # CHECK-NEXT: $x19 = ADDXri $sp, 0, 0
646 # CHECK-NEXT: STRXui $xzr, $x19, 0
647 # CHECK-NEXT: $sp = frame-destroy ADDXri $fp, 0, 0
648 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 32
649 # CHECK-NEXT: $x19 = frame-destroy LDRXui $sp, 2
650 # CHECK-NEXT: early-clobber $sp, $fp, $lr = frame-destroy LDPXpost $sp, 4
651 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0
652 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w19
653 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w30
654 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29
655 # CHECK-NEXT: RET_ReallyLR
657 # ASM-LABEL: test_address_gpr_vla:
658 # ASM:       .cfi_def_cfa_offset 32
659 # ASM:       .cfi_def_cfa w29, 32
660 # ASM-NEXT:  .cfi_offset w19, -16
661 # ASM-NEXT:  .cfi_offset w30, -24
662 # ASM-NEXT:  .cfi_offset w29, -32
664 # ASM:       .cfi_def_cfa wsp, 32
665 # ASM:       .cfi_def_cfa_offset 0
666 # ASM-NEXT:  .cfi_restore w19
667 # ASM-NEXT:  .cfi_restore w30
668 # ASM-NEXT:  .cfi_restore w29
670 # UNWINDINFO:      DW_CFA_def_cfa_offset: +32
671 # UNWINDINFO:      DW_CFA_def_cfa: reg29 +32
672 # UNWINDINFO-NEXT: DW_CFA_offset: reg19 -16
673 # UNWINDINFO-NEXT: DW_CFA_offset: reg30 -24
674 # UNWINDINFO-NEXT: DW_CFA_offset: reg29 -32
676 # UNWINDINFO:      DW_CFA_def_cfa: reg31 +32
677 # UNWINDINFO:      DW_CFA_def_cfa_offset: +0
678 # UNWINDINFO-NEXT: DW_CFA_restore: reg19
679 # UNWINDINFO-NEXT: DW_CFA_restore: reg30
680 # UNWINDINFO-NEXT: DW_CFA_restore: reg29
682 name:            test_address_gpr_vla
683 frameInfo:
684   maxAlignment:  16
685 stack:
686   - { id: 0, stack-id: scalable-vector, size: 16, alignment: 8 }
687   - { id: 1, stack-id: default, size: 16, alignment: 8 }
688   - { id: 2, stack-id: default, type: variable-sized }
689 body:             |
690   bb.0.entry:
691     liveins: $xzr
693     STRXui $xzr, %stack.1, 0
695     RET_ReallyLR
698 # CHECK-LABEL: name: save_restore_pregs_sve
699 # CHECK:      $sp = frame-setup STRXpre killed $fp, $sp, -16
700 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16
701 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16
702 # CHECK:      $sp = frame-setup ADDVL_XXI $sp, -1
703 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0x2e, 0x00, 0x1e, 0x22
704 # CHECK:      frame-setup STR_PXI killed $p6, $sp, 5
705 # CHECK:      frame-setup STR_PXI killed $p5, $sp, 6
706 # CHECK:      frame-setup STR_PXI killed $p4, $sp, 7
707 # CHECK:      $sp = frame-setup SUBXri $sp, 32, 0
708 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x30, 0x22, 0x11, 0x08, 0x92, 0x2e, 0x00, 0x1e, 0x22
710 # CHECK:      $sp = frame-destroy ADDXri $sp, 32, 0
711 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0x2e, 0x00, 0x1e, 0x22
712 # CHECK:      $p6 = frame-destroy LDR_PXI $sp, 5
713 # CHECK:      $p5 = frame-destroy LDR_PXI $sp, 6
714 # CHECK:      $p4 = frame-destroy LDR_PXI $sp, 7
715 # CHECK:      $sp = frame-destroy ADDVL_XXI $sp, 1
716 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 16
717 # CHECK-NEXT: early-clobber $sp, $fp = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.4)
718 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0
719 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29
720 # CHECK-NEXT: RET_ReallyLR
723 # ASM-LABEL: save_restore_pregs_sve:
724 # ASM:       .cfi_def_cfa_offset 16
725 # ASM-NEXT:  .cfi_offset w29, -16
726 # ASM:       .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 8 * VG
727 # ASM:       .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x30, 0x22, 0x11, 0x08, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 48 + 8 * VG
729 # ASM:       .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 8 * VG
730 # ASM:       .cfi_def_cfa wsp, 16
731 # ASM:       .cfi_def_cfa_offset 0
732 # ASM-NEXT:  .cfi_restore w29
734 # UNWINDINFO:         DW_CFA_def_cfa_offset: +16
735 # UNWINDINFO:         DW_CFA_offset: reg29 -16
736 # UNWINDINFO:         DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +8, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
737 # UNWINDINFO:         DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +48, DW_OP_plus, DW_OP_consts +8, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
739 # UNWINDINFO:         DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +8, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
740 # UNWINDINFO:         DW_CFA_def_cfa: reg31 +16
741 # UNWINDINFO:         DW_CFA_def_cfa_offset: +0
742 # UNWINDINFO-NEXT:    DW_CFA_restore: reg29
744 name: save_restore_pregs_sve
745 stack:
746   - { id: 0, stack-id: default, size: 32, alignment: 16 }
747 body:             |
748   bb.0.entry:
750     $p4 = IMPLICIT_DEF
751     $p5 = IMPLICIT_DEF
752     $p6 = IMPLICIT_DEF
754     RET_ReallyLR
757 # CHECK-LABEL: name: save_restore_zregs_sve
758 # CHECK:      $sp = frame-setup STRXpre killed $fp, $sp, -16
759 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16
760 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16
761 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -3
762 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x18, 0x92, 0x2e, 0x00, 0x1e, 0x22
763 # CHECK-NEXT: frame-setup STR_ZXI killed $z10, $sp, 0
764 # CHECK-NEXT: frame-setup STR_ZXI killed $z9, $sp, 1
765 # CHECK-NEXT: frame-setup STR_ZXI killed $z8, $sp, 2
766 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x48, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x78, 0x92, 0x2e, 0x00, 0x1e, 0x22
767 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x49, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x70, 0x92, 0x2e, 0x00, 0x1e, 0x22
768 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x4a, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x68, 0x92, 0x2e, 0x00, 0x1e, 0x22
769 # CHECK-NEXT: $sp = frame-setup SUBXri $sp, 32, 0
770 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x30, 0x22, 0x11, 0x18, 0x92, 0x2e, 0x00, 0x1e, 0x22
772 # CHECK:      $sp  = frame-destroy ADDXri $sp, 32, 0
773 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x18, 0x92, 0x2e, 0x00, 0x1e, 0x22
774 # CHECK-NEXT: $z10 = frame-destroy LDR_ZXI $sp, 0
775 # CHECK-NEXT: $z9  = frame-destroy LDR_ZXI $sp, 1
776 # CHECK-NEXT: $z8  = frame-destroy LDR_ZXI $sp, 2
777 # CHECK-NEXT: $sp  = frame-destroy ADDVL_XXI $sp, 3
778 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 16
779 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z8
780 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z9
781 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z10
782 # CHECK-NEXT: $sp, $fp = frame-destroy LDRXpost $sp, 16
783 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0
784 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29
785 # CHECK-NEXT: RET_ReallyLR
787 # ASM-LABEL: save_restore_zregs_sve:
788 # ASM:       .cfi_def_cfa_offset 16
789 # ASM-NEXT:  .cfi_offset w29, -16
790 # ASM:       .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x18, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 24 * VG
791 # ASM:       .cfi_escape 0x10, 0x48, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x78, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d8  @ cfa - 16 - 8 * VG
792 # ASM-NEXT:  .cfi_escape 0x10, 0x49, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x70, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d9  @ cfa - 16 - 16 * VG
793 # ASM-NEXT:  .cfi_escape 0x10, 0x4a, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x68, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d10  @ cfa - 16 - 24 * VG
794 # ASM:       .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x30, 0x22, 0x11, 0x18, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 48 + 24 * VG
796 # ASM:       .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x18, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 24 * VG
797 # ASM:       .cfi_def_cfa wsp, 16
798 # ASM-NEXT:  .cfi_restore z8
799 # ASM-NEXT:  .cfi_restore z9
800 # ASM-NEXT:  .cfi_restore z10
801 # ASM:       .cfi_def_cfa_offset 0
802 # ASM-NEXT:  .cfi_restore w29
804 # UNWINDINFO:      DW_CFA_def_cfa_offset: +16
805 # UNWINDINFO-NEXT: DW_CFA_offset: reg29 -16
806 # UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +24, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
807 # UNWINDINFO:      DW_CFA_expression: reg72 DW_OP_consts -16, DW_OP_plus, DW_OP_consts -8, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
808 # UNWINDINFO-NEXT: DW_CFA_expression: reg73 DW_OP_consts -16, DW_OP_plus, DW_OP_consts -16, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
809 # UNWINDINFO-NEXT: DW_CFA_expression: reg74 DW_OP_consts -16, DW_OP_plus, DW_OP_consts -24, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
810 # UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +48, DW_OP_plus, DW_OP_consts +24, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
812 # UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +24, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
813 # UNWINDINFO:      DW_CFA_def_cfa: reg31 +16
814 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg104
815 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg105
816 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg106
817 # UNWINDINFO:      DW_CFA_def_cfa_offset: +0
818 # UNWINDINFO-NEXT: DW_CFA_restore: reg29
820 name: save_restore_zregs_sve
821 stack:
822   - { id: 0, stack-id: default, size: 32, alignment: 16 }
823 body:             |
824   bb.0.entry:
826     $z8 = IMPLICIT_DEF
827     $z9 = IMPLICIT_DEF
828     $z10 = IMPLICIT_DEF
830     RET_ReallyLR
833 # Test allocation/deallocation of the stack frame together with the
834 # saving/restoring of callee save registers. Fixed-stack objects
835 # are allocated before the callee-saves.
836 # This also adds some non-SVE callee-saves, to ensure that those are
837 # paired correctly.
839 # CHECK-LABEL: name: save_restore_sve
840 # CHECK:      $sp = frame-setup STPXpre killed ${{[a-z0-9]+}}, killed $x21, $sp, -4
841 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 32
842 # CHECK-NEXT: frame-setup STPXi killed $x20, killed $x19, $sp, 2
843 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w19, -8
844 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w20, -16
845 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w21, -24
846 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -32
848 # CHECK:      $sp = frame-setup ADDVL_XXI $sp, -18
849 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x20, 0x22, 0x11, 0x90, 0x01, 0x92, 0x2e, 0x00, 0x1e, 0x22
850 # CHECK:      frame-setup STR_PXI killed $p15, $sp, 4
851 # CHECK:      frame-setup STR_PXI killed $p14, $sp, 5
852 # CHECK:      frame-setup STR_PXI killed $p5, $sp, 14
853 # CHECK:      frame-setup STR_PXI killed $p4, $sp, 15
854 # CHECK:      frame-setup STR_ZXI killed $z23, $sp, 2
855 # CHECK:      frame-setup STR_ZXI killed $z22, $sp, 3
856 # CHECK:      frame-setup STR_ZXI killed $z9, $sp, 16
857 # CHECK:      frame-setup STR_ZXI killed $z8, $sp, 17
858 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x48, 0x0a, 0x11, 0x60, 0x22, 0x11, 0x78, 0x92, 0x2e, 0x00, 0x1e, 0x22
859 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x49, 0x0a, 0x11, 0x60, 0x22, 0x11, 0x70, 0x92, 0x2e, 0x00, 0x1e, 0x22
860 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x4a, 0x0a, 0x11, 0x60, 0x22, 0x11, 0x68, 0x92, 0x2e, 0x00, 0x1e, 0x22
861 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x4b, 0x0a, 0x11, 0x60, 0x22, 0x11, 0x60, 0x92, 0x2e, 0x00, 0x1e, 0x22
862 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x4c, 0x0a, 0x11, 0x60, 0x22, 0x11, 0x58, 0x92, 0x2e, 0x00, 0x1e, 0x22
863 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x4d, 0x0a, 0x11, 0x60, 0x22, 0x11, 0x50, 0x92, 0x2e, 0x00, 0x1e, 0x22
864 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x4e, 0x0a, 0x11, 0x60, 0x22, 0x11, 0x48, 0x92, 0x2e, 0x00, 0x1e, 0x22
865 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x4f, 0x0a, 0x11, 0x60, 0x22, 0x11, 0x40, 0x92, 0x2e, 0x00, 0x1e, 0x22
866 # CHECK:      $sp = frame-setup ADDVL_XXI $sp, -1
867 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x20, 0x22, 0x11, 0x98, 0x01, 0x92, 0x2e, 0x00, 0x1e, 0x22
868 # CHECK:      $sp = frame-setup SUBXri $sp, 32, 0
869 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0e, 0x8f, 0x00, 0x11, 0xc0, 0x00, 0x22, 0x11, 0x98, 0x01, 0x92, 0x2e, 0x00, 0x1e, 0x22
871 # CHECK:      $sp = frame-destroy ADDXri $sp, 32, 0
872 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x20, 0x22, 0x11, 0x98, 0x01, 0x92, 0x2e, 0x00, 0x1e, 0x22
873 # CHECK:      $sp = frame-destroy ADDVL_XXI $sp, 1
874 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x20, 0x22, 0x11, 0x90, 0x01, 0x92, 0x2e, 0x00, 0x1e, 0x22
875 # CHECK:      $p15 = frame-destroy LDR_PXI $sp, 4
876 # CHECK:      $p14 = frame-destroy LDR_PXI $sp, 5
877 # CHECK:      $p5 = frame-destroy LDR_PXI $sp, 14
878 # CHECK:      $p4 = frame-destroy LDR_PXI $sp, 15
879 # CHECK:      $z23 = frame-destroy LDR_ZXI $sp, 2
880 # CHECK:      $z22 = frame-destroy LDR_ZXI $sp, 3
881 # CHECK:      $z9 = frame-destroy LDR_ZXI $sp, 16
882 # CHECK:      $z8 = frame-destroy LDR_ZXI $sp, 17
883 # CHECK:      $sp = frame-destroy ADDVL_XXI $sp, 18
884 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 32
885 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z8
886 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z9
887 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z10
888 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z11
889 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z12
890 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z13
891 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z14
892 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z15
894 # CHECK: $x20, $x19 = frame-destroy LDPXi $sp, 2
895 # CHECK: $sp, ${{[a-z0-9]+}}, $x21 = frame-destroy LDPXpost $sp, 4
896 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0
897 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w19
898 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w20
899 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w21
900 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29
902 # CHECK-NEXT: RET_ReallyLR
904 # ASM-LABEL: save_restore_sve:
905 # ASM:       .cfi_def_cfa_offset 32
906 # ASM:       .cfi_offset w19, -8
907 # ASM-NEXT:  .cfi_offset w20, -16
908 # ASM-NEXT:  .cfi_offset w21, -24
909 # ASM-NEXT:  .cfi_offset w29, -32
910 # ASM:       .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x20, 0x22, 0x11, 0x90, 0x01, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 32 + 144 * VG
911 # ASM:       .cfi_escape 0x10, 0x48, 0x0a, 0x11, 0x60, 0x22, 0x11, 0x78, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d8 @ cfa - 32 - 8 * VG
912 # ASM-NEXT:  .cfi_escape 0x10, 0x49, 0x0a, 0x11, 0x60, 0x22, 0x11, 0x70, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d9 @ cfa - 32 - 16 * VG
913 # ASM-NEXT:  .cfi_escape 0x10, 0x4a, 0x0a, 0x11, 0x60, 0x22, 0x11, 0x68, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d10 @ cfa - 32 - 24 * VG
914 # ASM-NEXT:  .cfi_escape 0x10, 0x4b, 0x0a, 0x11, 0x60, 0x22, 0x11, 0x60, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d11 @ cfa - 32 - 32 * VG
915 # ASM-NEXT:  .cfi_escape 0x10, 0x4c, 0x0a, 0x11, 0x60, 0x22, 0x11, 0x58, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d12 @ cfa - 32 - 40 * VG
916 # ASM-NEXT:  .cfi_escape 0x10, 0x4d, 0x0a, 0x11, 0x60, 0x22, 0x11, 0x50, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d13 @ cfa - 32 - 48 * VG
917 # ASM-NEXT:  .cfi_escape 0x10, 0x4e, 0x0a, 0x11, 0x60, 0x22, 0x11, 0x48, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d14 @ cfa - 32 - 56 * VG
918 # ASM-NEXT:  .cfi_escape 0x10, 0x4f, 0x0a, 0x11, 0x60, 0x22, 0x11, 0x40, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d15 @ cfa - 32 - 64 * VG
919 # ASM:       .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x20, 0x22, 0x11, 0x98, 0x01, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 32 + 152 * VG
920 # ASM:       .cfi_escape 0x0f, 0x0e, 0x8f, 0x00, 0x11, 0xc0, 0x00, 0x22, 0x11, 0x98, 0x01, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 64 + 152 * VG
922 # ASM:       .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x20, 0x22, 0x11, 0x98, 0x01, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 32 + 152 * VG
923 # ASM:       .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x20, 0x22, 0x11, 0x90, 0x01, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 32 + 144 * VG
924 # ASM:       .cfi_def_cfa wsp, 32
925 # ASM-NEXT:  .cfi_restore z8
926 # ASM-NEXT:  .cfi_restore z9
927 # ASM-NEXT:  .cfi_restore z10
928 # ASM-NEXT:  .cfi_restore z11
929 # ASM-NEXT:  .cfi_restore z12
930 # ASM-NEXT:  .cfi_restore z13
931 # ASM-NEXT:  .cfi_restore z14
932 # ASM-NEXT:  .cfi_restore z15
933 # ASM:       .cfi_def_cfa_offset 0
934 # ASM-NEXT:  .cfi_restore w19
935 # ASM-NEXT:  .cfi_restore w20
936 # ASM-NEXT:  .cfi_restore w21
937 # ASM-NEXT:  .cfi_restore w29
939 # UNWINDINFO:      DW_CFA_def_cfa_offset: +32
940 # UNWINDINFO:      DW_CFA_offset: reg19 -8
941 # UNWINDINFO-NEXT: DW_CFA_offset: reg20 -16
942 # UNWINDINFO-NEXT: DW_CFA_offset: reg21 -24
943 # UNWINDINFO-NEXT: DW_CFA_offset: reg29 -32
944 # UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +32, DW_OP_plus, DW_OP_consts +144, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
945 # UNWINDINFO:      DW_CFA_expression: reg72 DW_OP_consts -32, DW_OP_plus, DW_OP_consts -8, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
946 # UNWINDINFO-NEXT: DW_CFA_expression: reg73 DW_OP_consts -32, DW_OP_plus, DW_OP_consts -16, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
947 # UNWINDINFO-NEXT: DW_CFA_expression: reg74 DW_OP_consts -32, DW_OP_plus, DW_OP_consts -24, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
948 # UNWINDINFO-NEXT: DW_CFA_expression: reg75 DW_OP_consts -32, DW_OP_plus, DW_OP_consts -32, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
949 # UNWINDINFO-NEXT: DW_CFA_expression: reg76 DW_OP_consts -32, DW_OP_plus, DW_OP_consts -40, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
950 # UNWINDINFO-NEXT: DW_CFA_expression: reg77 DW_OP_consts -32, DW_OP_plus, DW_OP_consts -48, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
951 # UNWINDINFO-NEXT: DW_CFA_expression: reg78 DW_OP_consts -32, DW_OP_plus, DW_OP_consts -56, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
952 # UNWINDINFO-NEXT: DW_CFA_expression: reg79 DW_OP_consts -32, DW_OP_plus, DW_OP_consts -64, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
953 # UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +32, DW_OP_plus, DW_OP_consts +152, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
954 # UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +64, DW_OP_plus, DW_OP_consts +152, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
956 # UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +32, DW_OP_plus, DW_OP_consts +152, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
957 # UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +32, DW_OP_plus, DW_OP_consts +144, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
958 # UNWINDINFO:      DW_CFA_def_cfa: reg31 +32
959 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg104
960 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg105
961 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg106
962 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg107
963 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg108
964 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg109
965 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg110
966 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg111
967 # UNWINDINFO:      DW_CFA_def_cfa_offset: +0
968 # UNWINDINFO-NEXT: DW_CFA_restore: reg19
969 # UNWINDINFO-NEXT: DW_CFA_restore: reg20
970 # UNWINDINFO-NEXT: DW_CFA_restore: reg21
971 # UNWINDINFO-NEXT: DW_CFA_restore: reg29
973 name: save_restore_sve
974 stack:
975   - { id: 0, stack-id: scalable-vector, size: 16, alignment: 16 }
976   - { id: 1, stack-id: default, size: 32, alignment: 16 }
977 body:             |
978   bb.0.entry:
980     $z8_z9_z10_z11   = IMPLICIT_DEF
981     $z12_z13_z14_z15 = IMPLICIT_DEF
982     $z16_z17_z18_z19 = IMPLICIT_DEF
983     $z20_z21_z22_z23 = IMPLICIT_DEF
984     $z24_z25_z26_z27 = IMPLICIT_DEF
985     $z28_z29_z30_z31 = IMPLICIT_DEF
986     $p4 = IMPLICIT_DEF
987     $p5 = IMPLICIT_DEF
988     $p6 = IMPLICIT_DEF
989     $p7 = IMPLICIT_DEF
990     $p8 = IMPLICIT_DEF
991     $p9 = IMPLICIT_DEF
992     $p10 = IMPLICIT_DEF
993     $p11 = IMPLICIT_DEF
994     $p12 = IMPLICIT_DEF
995     $p13 = IMPLICIT_DEF
996     $p14 = IMPLICIT_DEF
997     $p15 = IMPLICIT_DEF
999     $x19 = IMPLICIT_DEF
1000     $x20 = IMPLICIT_DEF
1001     $x21 = IMPLICIT_DEF
1003     RET_ReallyLR
1006 # Test allocation/deallocation of the stack frame together with the
1007 # saving/restoring of callee save registers. Fixed-stack objects
1008 # are allocated before the callee-saves.
1010 # CHECK-LABEL: name: save_restore_sve_realign
1011 # CHECK:      $sp = frame-setup STPXpre killed $fp, killed $lr, $sp, -2
1012 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16
1013 # CHECK-NEXT: $fp = frame-setup ADDXri $sp, 0, 0
1014 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa $w29, 16
1015 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w30, -8
1016 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16
1017 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -18
1018 # CHECK-NEXT: STR_PXI killed $p15, $sp, 4
1019 # CHECK-NEXT: STR_PXI killed $p14, $sp, 5
1020 # CHECK:      STR_PXI killed $p5, $sp, 14
1021 # CHECK-NEXT: STR_PXI killed $p4, $sp, 15
1022 # CHECK-NEXT: STR_ZXI killed $z23, $sp, 2
1023 # CHECK-NEXT: STR_ZXI killed $z22, $sp, 3
1024 # CHECK:      STR_ZXI killed $z9, $sp, 16
1025 # CHECK-NEXT: STR_ZXI killed $z8, $sp, 17
1026 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x48, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x78, 0x92, 0x2e, 0x00, 0x1e, 0x22
1027 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x49, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x70, 0x92, 0x2e, 0x00, 0x1e, 0x22
1028 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x4a, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x68, 0x92, 0x2e, 0x00, 0x1e, 0x22
1029 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x4b, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x60, 0x92, 0x2e, 0x00, 0x1e, 0x22
1030 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x4c, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x58, 0x92, 0x2e, 0x00, 0x1e, 0x22
1031 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x4d, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x50, 0x92, 0x2e, 0x00, 0x1e, 0x22
1032 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x4e, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x48, 0x92, 0x2e, 0x00, 0x1e, 0x22
1033 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x4f, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x40, 0x92, 0x2e, 0x00, 0x1e, 0x22
1034 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -1
1035 # CHECK-NEXT: $[[TMP:x[0-9]+]] = frame-setup SUBXri $sp, 16, 0
1036 # CHECK-NEXT: $sp = ANDXri killed $[[TMP]]
1038 # CHECK:      $sp = frame-destroy ADDVL_XXI $fp, -18
1039 # CHECK-NEXT: $p15 = frame-destroy LDR_PXI $sp, 4
1040 # CHECK-NEXT: $p14 = frame-destroy LDR_PXI $sp, 5
1041 # CHECK:      $p5 = frame-destroy LDR_PXI $sp, 14
1042 # CHECK-NEXT: $p4 = frame-destroy LDR_PXI $sp, 15
1043 # CHECK-NEXT: $z23 = frame-destroy LDR_ZXI $sp, 2
1044 # CHECK-NEXT: $z22 = frame-destroy LDR_ZXI $sp, 3
1045 # CHECK:      $z9 = frame-destroy LDR_ZXI $sp, 16
1046 # CHECK-NEXT: $z8 = frame-destroy LDR_ZXI $sp, 17
1047 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z8
1048 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z9
1049 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z10
1050 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z11
1051 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z12
1052 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z13
1053 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z14
1054 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z15
1055 # CHECK-NEXT: $sp = frame-destroy ADDXri $fp, 0, 0
1056 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 16
1057 # CHECK-NEXT: $sp, $fp, $lr = frame-destroy LDPXpost $sp, 2
1058 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0
1059 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w30
1060 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29
1061 # CHECK-NEXT: RET_ReallyLR
1063 # ASM-LABEL: save_restore_sve_realign:
1064 # ASM:       .cfi_def_cfa_offset 16
1065 # ASM:       .cfi_def_cfa w29, 16
1066 # ASM-NEXT:  .cfi_offset w30, -8
1067 # ASM-NEXT:  .cfi_offset w29, -16
1068 # ASM:       .cfi_escape 0x10, 0x48, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x78, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d8  @ cfa - 16 - 8 * VG
1069 # ASM-NEXT:  .cfi_escape 0x10, 0x49, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x70, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d9  @ cfa - 16 - 16 * VG
1070 # ASM-NEXT:  .cfi_escape 0x10, 0x4a, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x68, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d10  @ cfa - 16 - 24 * VG
1071 # ASM-NEXT:  .cfi_escape 0x10, 0x4b, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x60, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d11  @ cfa - 16 - 32 * VG
1072 # ASM-NEXT:  .cfi_escape 0x10, 0x4c, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x58, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d12  @ cfa - 16 - 40 * VG
1073 # ASM-NEXT:  .cfi_escape 0x10, 0x4d, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x50, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d13  @ cfa - 16 - 48 * VG
1074 # ASM-NEXT:  .cfi_escape 0x10, 0x4e, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x48, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d14  @ cfa - 16 - 56 * VG
1075 # ASM-NEXT:  .cfi_escape 0x10, 0x4f, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x40, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d15  @ cfa - 16 - 64 * VG
1077 # ASM:       .cfi_restore z8
1078 # ASM-NEXT:  .cfi_restore z9
1079 # ASM-NEXT:  .cfi_restore z10
1080 # ASM-NEXT:  .cfi_restore z11
1081 # ASM-NEXT:  .cfi_restore z12
1082 # ASM-NEXT:  .cfi_restore z13
1083 # ASM-NEXT:  .cfi_restore z14
1084 # ASM-NEXT:  .cfi_restore z15
1085 # ASM:       .cfi_def_cfa wsp, 16
1086 # ASM:       .cfi_def_cfa_offset 0
1087 # ASM-NEXT:  .cfi_restore w30
1088 # ASM-NEXT:  .cfi_restore w29
1090 # UNWINDINFO:      DW_CFA_def_cfa_offset: +16
1091 # UNWINDINFO:      DW_CFA_def_cfa: reg29 +16
1092 # UNWINDINFO-NEXT: DW_CFA_offset: reg30 -8
1093 # UNWINDINFO-NEXT: DW_CFA_offset: reg29 -16
1094 # UNWINDINFO:      DW_CFA_expression: reg72 DW_OP_consts -16, DW_OP_plus, DW_OP_consts -8, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
1095 # UNWINDINFO-NEXT: DW_CFA_expression: reg73 DW_OP_consts -16, DW_OP_plus, DW_OP_consts -16, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
1096 # UNWINDINFO-NEXT: DW_CFA_expression: reg74 DW_OP_consts -16, DW_OP_plus, DW_OP_consts -24, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
1097 # UNWINDINFO-NEXT: DW_CFA_expression: reg75 DW_OP_consts -16, DW_OP_plus, DW_OP_consts -32, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
1098 # UNWINDINFO-NEXT: DW_CFA_expression: reg76 DW_OP_consts -16, DW_OP_plus, DW_OP_consts -40, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
1099 # UNWINDINFO-NEXT: DW_CFA_expression: reg77 DW_OP_consts -16, DW_OP_plus, DW_OP_consts -48, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
1100 # UNWINDINFO-NEXT: DW_CFA_expression: reg78 DW_OP_consts -16, DW_OP_plus, DW_OP_consts -56, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
1101 # UNWINDINFO-NEXT: DW_CFA_expression: reg79 DW_OP_consts -16, DW_OP_plus, DW_OP_consts -64, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
1103 # UNWINDINFO:      DW_CFA_restore_extended: reg104
1104 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg105
1105 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg106
1106 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg107
1107 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg108
1108 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg109
1109 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg110
1110 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg111
1111 # UNWINDINFO:      DW_CFA_def_cfa: reg31 +16
1112 # UNWINDINFO:      DW_CFA_def_cfa_offset: +0
1113 # UNWINDINFO-NEXT: DW_CFA_restore: reg30
1114 # UNWINDINFO-NEXT: DW_CFA_restore: reg29
1116 name: save_restore_sve_realign
1117 stack:
1118   - { id: 0, stack-id: scalable-vector, size: 16, alignment: 16 }
1119   - { id: 1, stack-id: default, size: 16, alignment: 32 }
1120 body:             |
1121   bb.0.entry:
1123     $z8_z9_z10_z11   = IMPLICIT_DEF
1124     $z12_z13_z14_z15 = IMPLICIT_DEF
1125     $z16_z17_z18_z19 = IMPLICIT_DEF
1126     $z20_z21_z22_z23 = IMPLICIT_DEF
1127     $z24_z25_z26_z27 = IMPLICIT_DEF
1128     $z28_z29_z30_z31 = IMPLICIT_DEF
1129     $p4 = IMPLICIT_DEF
1130     $p5 = IMPLICIT_DEF
1131     $p6 = IMPLICIT_DEF
1132     $p7 = IMPLICIT_DEF
1133     $p8 = IMPLICIT_DEF
1134     $p9 = IMPLICIT_DEF
1135     $p10 = IMPLICIT_DEF
1136     $p11 = IMPLICIT_DEF
1137     $p12 = IMPLICIT_DEF
1138     $p13 = IMPLICIT_DEF
1139     $p14 = IMPLICIT_DEF
1140     $p15 = IMPLICIT_DEF
1142     RET_ReallyLR
1144 # Frame layout should be:
1145 # +---------------------+ <- Old SP
1146 # | callee save z8      |@ -16
1147 # | callee save z23     |@ -32
1148 # | callee save p4      |@ -34
1149 # | callee save p15     |@ -48
1150 # | id #0 (size 32)     |@ -80
1151 # | id #1 (size 4)      |@ -84
1152 # | id #2 (size 16)     |@ -112
1153 # | id #3 (size 2)      |@ -114
1154 # | id #4 (size 16)     |@ -144
1155 # | id #5 (size 2)      |@ -146
1156 # +- - - - - - - - - - -+ <- New SP @-160
1157 # CHECK-LABEL: name: frame_layout
1158 # CHECK:       stack:
1159 # CHECK:        - { id: 0, name: '', type: default, offset: -80, size: 32, alignment: 16,
1160 # CHECK-NEXT:       stack-id: scalable-vector,
1161 # CHECK:        - { id: 1, name: '', type: default, offset: -84, size: 4, alignment: 2,
1162 # CHECK-NEXT:       stack-id: scalable-vector,
1163 # CHECK:        - { id: 2, name: '', type: default, offset: -112, size: 16, alignment: 16,
1164 # CHECK-NEXT:       stack-id: scalable-vector,
1165 # CHECK:        - { id: 3, name: '', type: default, offset: -114, size: 2, alignment: 2,
1166 # CHECK-NEXT:       stack-id: scalable-vector,
1167 # CHECK:        - { id: 4, name: '', type: spill-slot, offset: -144, size: 16, alignment: 16,
1168 # CHECK-NEXT:       stack-id: scalable-vector,
1169 # CHECK:        - { id: 5, name: '', type: spill-slot, offset: -146, size: 2, alignment: 2,
1170 # CHECK-NEXT:       stack-id: scalable-vector,
1171 # CHECK:        - { id: 6, name: '', type: spill-slot, offset: -16, size: 16, alignment: 16,
1172 # CHECK-NEXT:       stack-id: scalable-vector, callee-saved-register: '$z8',
1173 # CHECK:        - { id: 7, name: '', type: spill-slot, offset: -32, size: 16, alignment: 16,
1174 # CHECK-NEXT:       stack-id: scalable-vector, callee-saved-register: '$z23',
1175 # CHECK:        - { id: 8, name: '', type: spill-slot, offset: -34, size: 2, alignment: 2,
1176 # CHECK-NEXT:       stack-id: scalable-vector, callee-saved-register: '$p4',
1177 # CHECK:        - { id: 9, name: '', type: spill-slot, offset: -36, size: 2, alignment: 2,
1178 # CHECK-NEXT:       stack-id: scalable-vector, callee-saved-register: '$p15',
1179 # CHECK:        - { id: 10, name: '', type: spill-slot, offset: -16, size: 8, alignment: 16,
1180 # CHECK-NEXT:       stack-id: default, callee-saved-register: '$fp',
1182 # CHECK:      bb.0.entry:
1183 # CHECK-NEXT: liveins:
1184 # CHECK-NEXT: {{  $}}
1185 # CHECK-NEXT: $sp = frame-setup STRXpre killed $[[SCRATCH:[a-z0-9]+]], $sp, -16
1186 # CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16
1187 # CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16
1188 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -3
1189 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x18, 0x92, 0x2e, 0x00, 0x1e, 0x22
1190 # CHECK-NEXT: STR_PXI killed $p15, $sp, 6
1191 # CHECK-NEXT: STR_PXI killed $p4, $sp, 7
1192 # CHECK-NEXT: STR_ZXI killed $z23, $sp, 1
1193 # CHECK-NEXT: STR_ZXI killed $z8, $sp, 2
1194 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x10, 0x48, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x78, 0x92, 0x2e, 0x00, 0x1e, 0x22
1195 # CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -7
1196 # CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0xd0, 0x00, 0x92, 0x2e, 0x00, 0x1e, 0x22
1198 # CHECK:      $sp = frame-destroy ADDVL_XXI $sp, 7
1199 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x18, 0x92, 0x2e, 0x00, 0x1e, 0x22
1200 # CHECK-NEXT: $p15 = frame-destroy LDR_PXI $sp, 6
1201 # CHECK-NEXT: $p4 = frame-destroy LDR_PXI $sp, 7
1202 # CHECK-NEXT: $z23 = frame-destroy LDR_ZXI $sp, 1
1203 # CHECK-NEXT: $z8 = frame-destroy LDR_ZXI $sp, 2
1204 # CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 3
1205 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 16
1206 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z8
1207 # CHECK-NEXT: early-clobber $sp, $fp = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.10)
1208 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0
1209 # CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29
1210 # CHECK-NEXT: RET_ReallyLR
1212 # ASM-LABEL: frame_layout:
1213 # ASM:       .cfi_def_cfa_offset 16
1214 # ASM-NEXT:  .cfi_offset w29, -16
1215 # ASM:       .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x18, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 24 * VG
1216 # ASM:       .cfi_escape 0x10, 0x48, 0x0a, 0x11, 0x70, 0x22, 0x11, 0x78, 0x92, 0x2e, 0x00, 0x1e, 0x22 // $d8  @ cfa - 16 - 8 * VG
1217 # ASM:       .cfi_escape 0x0f, 0x0d, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0xd0, 0x00, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 80 * VG
1219 # ASM:       .cfi_escape 0x0f, 0x0c, 0x8f, 0x00, 0x11, 0x10, 0x22, 0x11, 0x18, 0x92, 0x2e, 0x00, 0x1e, 0x22 // sp + 16 + 24 * VG
1220 # ASM:       .cfi_def_cfa wsp, 16
1221 # ASM-NEXT:  .cfi_restore z8
1222 # ASM:       .cfi_def_cfa_offset 0
1223 # ASM-NEXT:  .cfi_restore w29
1225 # UNWINDINFO:      DW_CFA_def_cfa_offset: +16
1226 # UNWINDINFO-NEXT: DW_CFA_offset: reg29 -16
1227 # UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +24, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
1228 # UNWINDINFO:      DW_CFA_expression: reg72 DW_OP_consts -16, DW_OP_plus, DW_OP_consts -8, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
1229 # UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +80, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
1231 # UNWINDINFO:      DW_CFA_def_cfa_expression: DW_OP_breg31 +0, DW_OP_consts +16, DW_OP_plus, DW_OP_consts +24, DW_OP_bregx 0x2e +0, DW_OP_mul, DW_OP_plus
1232 # UNWINDINFO:      DW_CFA_def_cfa: reg31 +16
1233 # UNWINDINFO-NEXT: DW_CFA_restore_extended: reg104
1234 # UNWINDINFO:      DW_CFA_def_cfa_offset: +0
1235 # UNWINDINFO-NEXT: DW_CFA_restore: reg29
1237 name: frame_layout
1238 stack:
1239   - { id: 0, type: default,    size:  32, alignment: 16, stack-id: scalable-vector }
1240   - { id: 1, type: default,    size:   4, alignment:  2, stack-id: scalable-vector }
1241   - { id: 2, type: default,    size:  16, alignment: 16, stack-id: scalable-vector }
1242   - { id: 3, type: default,    size:   2, alignment:  2, stack-id: scalable-vector }
1243   - { id: 4, type: spill-slot, size:  16, alignment: 16, stack-id: scalable-vector }
1244   - { id: 5, type: spill-slot, size:   2, alignment:  2, stack-id: scalable-vector }
1245 body:             |
1246   bb.0.entry:
1248     ; Trigger some callee saves
1249     $z8  = IMPLICIT_DEF
1250     $z23 = IMPLICIT_DEF
1251     $p4  = IMPLICIT_DEF
1252     $p15 = IMPLICIT_DEF
1254     RET_ReallyLR
1257 # Make sure we account for the offset between the fp and the sve area, if it exists.
1258 # FIXME: Should there be an offset?
1259 # CHECK-LABEL: name: fp_relative_index_with_float_save
1260 # CHECK:        - { id: 0, name: '', type: default, offset: -16, size: 16, alignment: 16,
1261 # CHECK-NEXT:       stack-id: scalable-vector
1262 # CHECK:        - { id: 1, name: '', type: default, offset: -64, size: 16, alignment: 32,
1263 # CHECK-NEXT:      stack-id: default
1264 # CHECK:        - { id: 2, name: '', type: spill-slot, offset: -8, size: 8, alignment: 8,
1265 # CHECK-NEXT:      stack-id: default, callee-saved-register: '$lr'
1266 # CHECK:        - { id: 3, name: '', type: spill-slot, offset: -16, size: 8, alignment: 8,
1267 # CHECK-NEXT:      stack-id: default, callee-saved-register: '$fp'
1268 # CHECK:        - { id: 4, name: '', type: spill-slot, offset: -32, size: 8, alignment: 16,
1269 # CHECK-NEXT:      stack-id: default, callee-saved-register: '$d8'
1271 # CHECK: $x8 = SUBXri $fp, 16, 0
1272 # CHECK: STR_ZXI $z0, killed $x8, -1
1274 name: fp_relative_index_with_float_save
1275 stack:
1276   - { id: 0, stack-id: scalable-vector, size: 16, alignment: 16 }
1277   - { id: 1, stack-id: default, size: 16, alignment: 32 }
1278 frameInfo:
1279   maxAlignment:  16
1280   isFrameAddressTaken: true
1281 body:             |
1282   bb.0.entry:
1283     liveins: $z0
1285     $d8 = IMPLICIT_DEF
1287     STR_ZXI $z0, %stack.0, 0
1289     RET_ReallyLR
1292 # CHECK-LABEL: name: fp_relative_that_is_not_a_multiple_of_VLx16
1293 # CHECK:         - { id: 0, name: '', type: default, offset: -156, size: 156, alignment: 1,
1294 # CHECK-NEXT:        stack-id: scalable-vector
1295 # CHECK:         - { id: 1, name: '', type: variable-sized, offset: -32, alignment: 1,
1296 # CHECK-NEXT:        stack-id: default
1298 # CHECK:      $x8 = ADDPL_XXI $fp, -14
1299 # CHECK-NEXT: $z0 = LD1W_IMM killed renamable $p0, killed $x8, -8
1301 name:            fp_relative_that_is_not_a_multiple_of_VLx16
1302 stack:
1303   - { id: 0, stack-id: scalable-vector, size: 156, alignment: 1 }
1304   - { id: 1, stack-id: default, type: variable-sized, alignment: 1 }
1305 body:             |
1306   bb.0.entry:
1307     liveins: $p0
1309     renamable $z0 = LD1W_IMM killed renamable $p0, %stack.0, 0
1310     RET_ReallyLR