blob: 5933c5daa67ed1ea97d0b05aaa22ac84a9e2540d [file] [log] [blame]
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --print-fixed-stack --version 5
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5 --print-fixed-stack
# RUN: llc -mattr=+sve -mtriple=aarch64-windows-msvc -run-pass=prologepilog %s -o - | FileCheck %s
--- |
define void @test_allocate_sve() uwtable { entry: unreachable }
define void @test_allocate_sve_gpr_callee_saves() uwtable { entry: unreachable }
define void @test_allocate_sve_gpr_realigned() uwtable { entry: unreachable }
define void @test_address_sve() uwtable { entry: unreachable }
define void @test_address_sve_fp() uwtable { entry: unreachable }
define void @test_stack_arg_sve() uwtable { entry: unreachable }
define void @test_address_sve_out_of_range() uwtable { entry: unreachable }
define void @test_address_gpr_vla() uwtable { entry: unreachable }
define aarch64_sve_vector_pcs void @save_restore_pregs_sve() uwtable { entry: unreachable }
define aarch64_sve_vector_pcs void @save_restore_zregs_sve() uwtable { entry: unreachable }
define aarch64_sve_vector_pcs void @save_restore_sve() uwtable { entry: unreachable }
define aarch64_sve_vector_pcs void @save_restore_sve_realign() uwtable { entry: unreachable }
define aarch64_sve_vector_pcs void @frame_layout() uwtable { entry: unreachable }
...
---
name: test_allocate_sve
stack:
- { id: 0, stack-id: scalable-vector, size: 18, alignment: 2 }
- { id: 1, stack-id: default, size: 16, alignment: 8 }
body: |
bb.0.entry:
; CHECK-LABEL: name: test_allocate_sve
; CHECK: fixedStack:
; CHECK: liveins: $lr
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: early-clobber $sp = frame-setup STRXpre killed $lr, $sp, -16 :: (store (s64) into %stack.2)
; CHECK-NEXT: frame-setup SEH_SaveReg_X 30, -16
; CHECK-NEXT: $sp = frame-setup SUBXri $sp, 16, 0
; CHECK-NEXT: frame-setup SEH_StackAlloc 16
; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -2, implicit $vg
; CHECK-NEXT: frame-setup SEH_AllocZ 2
; CHECK-NEXT: frame-setup SEH_PrologEnd
; CHECK-NEXT: frame-destroy SEH_EpilogStart
; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 2, implicit $vg
; CHECK-NEXT: frame-destroy SEH_AllocZ 2
; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 16, 0
; CHECK-NEXT: frame-destroy SEH_StackAlloc 16
; CHECK-NEXT: early-clobber $sp, $lr = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.2)
; CHECK-NEXT: frame-destroy SEH_SaveReg_X 30, -16
; CHECK-NEXT: frame-destroy SEH_EpilogEnd
; CHECK-NEXT: RET_ReallyLR
RET_ReallyLR
...
---
name: test_allocate_sve_gpr_callee_saves
stack:
- { id: 0, stack-id: scalable-vector, size: 18, alignment: 2 }
- { id: 1, stack-id: default, size: 16, alignment: 8 }
body: |
bb.0.entry:
; CHECK-LABEL: name: test_allocate_sve_gpr_callee_saves
; CHECK: fixedStack:
; CHECK: liveins: $x21, $x20, $lr
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: early-clobber $sp = frame-setup STPXpre killed $x20, killed $x21, $sp, -4 :: (store (s64) into %stack.3), (store (s64) into %stack.4)
; CHECK-NEXT: frame-setup SEH_SaveRegP_X 20, 21, -32
; CHECK-NEXT: frame-setup STRXui killed $lr, $sp, 2 :: (store (s64) into %stack.2)
; CHECK-NEXT: frame-setup SEH_SaveReg 30, 16
; CHECK-NEXT: $sp = frame-setup SUBXri $sp, 16, 0
; CHECK-NEXT: frame-setup SEH_StackAlloc 16
; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -2, implicit $vg
; CHECK-NEXT: frame-setup SEH_AllocZ 2
; CHECK-NEXT: frame-setup SEH_PrologEnd
; CHECK-NEXT: $x20 = IMPLICIT_DEF
; CHECK-NEXT: $x21 = IMPLICIT_DEF
; CHECK-NEXT: frame-destroy SEH_EpilogStart
; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 2, implicit $vg
; CHECK-NEXT: frame-destroy SEH_AllocZ 2
; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 16, 0
; CHECK-NEXT: frame-destroy SEH_StackAlloc 16
; CHECK-NEXT: $lr = frame-destroy LDRXui $sp, 2 :: (load (s64) from %stack.2)
; CHECK-NEXT: frame-destroy SEH_SaveReg 30, 16
; CHECK-NEXT: early-clobber $sp, $x20, $x21 = frame-destroy LDPXpost $sp, 4 :: (load (s64) from %stack.3), (load (s64) from %stack.4)
; CHECK-NEXT: frame-destroy SEH_SaveRegP_X 20, 21, -32
; CHECK-NEXT: frame-destroy SEH_EpilogEnd
; CHECK-NEXT: RET_ReallyLR
$x20 = IMPLICIT_DEF
$x21 = IMPLICIT_DEF
RET_ReallyLR
...
---
name: test_allocate_sve_gpr_realigned
stack:
- { id: 0, stack-id: scalable-vector, size: 18, alignment: 2 }
- { id: 1, stack-id: default, size: 16, alignment: 32 }
body: |
bb.0.entry:
; CHECK-LABEL: name: test_allocate_sve_gpr_realigned
; CHECK: fixedStack:
; CHECK: liveins: $lr
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: early-clobber $sp = frame-setup STPXpre killed $fp, killed $lr, $sp, -2 :: (store (s64) into %stack.2), (store (s64) into %stack.3)
; CHECK-NEXT: frame-setup SEH_SaveFPLR_X -16
; CHECK-NEXT: $fp = frame-setup ADDXri $sp, 0, 0
; CHECK-NEXT: frame-setup SEH_SetFP
; CHECK-NEXT: frame-setup SEH_PrologEnd
; CHECK-NEXT: $x9 = frame-setup SUBXri $sp, 16, 0
; CHECK-NEXT: $x9 = frame-setup ADDVL_XXI $x9, -2, implicit $vg
; CHECK-NEXT: $sp = frame-setup ANDXri killed $x9, 7930
; CHECK-NEXT: frame-destroy SEH_EpilogStart
; CHECK-NEXT: $sp = frame-destroy ADDXri $fp, 0, 0
; CHECK-NEXT: frame-destroy SEH_SetFP
; CHECK-NEXT: early-clobber $sp, $fp, $lr = frame-destroy LDPXpost $sp, 2 :: (load (s64) from %stack.2), (load (s64) from %stack.3)
; CHECK-NEXT: frame-destroy SEH_SaveFPLR_X -16
; CHECK-NEXT: frame-destroy SEH_EpilogEnd
; CHECK-NEXT: RET_ReallyLR
RET_ReallyLR
...
---
name: test_address_sve
frameInfo:
maxAlignment: 16
stack:
- { id: 0, stack-id: scalable-vector, size: 16, alignment: 8 }
- { id: 1, stack-id: scalable-vector, size: 16, alignment: 8 }
- { id: 2, stack-id: scalable-vector, size: 2, alignment: 2 }
- { id: 3, stack-id: default, size: 16, alignment: 8 }
body: |
bb.0.entry:
liveins: $z0, $z1, $p0
; CHECK-LABEL: name: test_address_sve
; CHECK: fixedStack:
; CHECK: liveins: $z0, $z1, $p0, $lr
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: early-clobber $sp = frame-setup STRXpre killed $lr, $sp, -16 :: (store (s64) into %stack.4)
; CHECK-NEXT: frame-setup SEH_SaveReg_X 30, -16
; CHECK-NEXT: $sp = frame-setup SUBXri $sp, 16, 0
; CHECK-NEXT: frame-setup SEH_StackAlloc 16
; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -3, implicit $vg
; CHECK-NEXT: frame-setup SEH_AllocZ 3
; CHECK-NEXT: frame-setup SEH_PrologEnd
; CHECK-NEXT: $x8 = ADDXri $sp, 16, 0
; CHECK-NEXT: STR_ZXI $z0, killed $x8, 2
; CHECK-NEXT: $x8 = ADDXri $sp, 16, 0
; CHECK-NEXT: STR_ZXI $z1, killed $x8, 1
; CHECK-NEXT: $x8 = ADDXri $sp, 16, 0
; CHECK-NEXT: STR_PXI $p0, killed $x8, 7
; CHECK-NEXT: frame-destroy SEH_EpilogStart
; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 3, implicit $vg
; CHECK-NEXT: frame-destroy SEH_AllocZ 3
; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 16, 0
; CHECK-NEXT: frame-destroy SEH_StackAlloc 16
; CHECK-NEXT: early-clobber $sp, $lr = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.4)
; CHECK-NEXT: frame-destroy SEH_SaveReg_X 30, -16
; CHECK-NEXT: frame-destroy SEH_EpilogEnd
; CHECK-NEXT: RET_ReallyLR
STR_ZXI $z0, %stack.0, 0
STR_ZXI $z1, %stack.1, 0
STR_PXI $p0, %stack.2, 0
RET_ReallyLR
...
---
name: test_address_sve_fp
frameInfo:
maxAlignment: 16
isFrameAddressTaken: true
stack:
- { id: 0, stack-id: scalable-vector, size: 16, alignment: 8 }
- { id: 1, stack-id: scalable-vector, size: 16, alignment: 8 }
- { id: 2, stack-id: scalable-vector, size: 2, alignment: 2 }
- { id: 3, stack-id: default, size: 16, alignment: 8 }
body: |
bb.0.entry:
liveins: $z0, $z1, $p0
; CHECK-LABEL: name: test_address_sve_fp
; CHECK: fixedStack:
; CHECK: liveins: $z0, $z1, $p0, $lr
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: early-clobber $sp = frame-setup STPXpre killed $fp, killed $lr, $sp, -2 :: (store (s64) into %stack.4), (store (s64) into %stack.5)
; CHECK-NEXT: frame-setup SEH_SaveFPLR_X -16
; CHECK-NEXT: $fp = frame-setup ADDXri $sp, 0, 0
; CHECK-NEXT: frame-setup SEH_SetFP
; CHECK-NEXT: frame-setup SEH_PrologEnd
; CHECK-NEXT: $sp = frame-setup SUBXri $sp, 16, 0
; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -3, implicit $vg
; CHECK-NEXT: STR_ZXI $z0, $fp, -1
; CHECK-NEXT: STR_ZXI $z1, $fp, -2
; CHECK-NEXT: STR_PXI $p0, $fp, -17
; CHECK-NEXT: frame-destroy SEH_EpilogStart
; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 3, implicit $vg
; CHECK-NEXT: frame-destroy SEH_AllocZ 3
; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 16, 0
; CHECK-NEXT: frame-destroy SEH_StackAlloc 16
; CHECK-NEXT: early-clobber $sp, $fp, $lr = frame-destroy LDPXpost $sp, 2 :: (load (s64) from %stack.4), (load (s64) from %stack.5)
; CHECK-NEXT: frame-destroy SEH_SaveFPLR_X -16
; CHECK-NEXT: frame-destroy SEH_EpilogEnd
; CHECK-NEXT: RET_ReallyLR
STR_ZXI $z0, %stack.0, 0
STR_ZXI $z1, %stack.1, 0
STR_PXI $p0, %stack.2, 0
RET_ReallyLR
...
---
name: test_stack_arg_sve
fixedStack:
- { id: 0, stack-id: default, size: 16, alignment: 16, offset: 0 }
stack:
- { id: 0, stack-id: scalable-vector, size: 16, alignment: 16 }
- { id: 1, stack-id: default, size: 16, alignment: 16 }
body: |
bb.0.entry:
liveins: $x0
; CHECK-LABEL: name: test_stack_arg_sve
; CHECK: fixedStack:
; CHECK-NEXT: - { id: 0, type: default, offset: 0, size: 16, alignment: 16, stack-id: default,
; CHECK-NEXT: isImmutable: false, isAliased: false, callee-saved-register: '',
; CHECK-NEXT: callee-saved-restored: true, debug-info-variable: '', debug-info-expression: '',
; CHECK-NEXT: debug-info-location: '' }
; CHECK: liveins: $x0, $lr
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: early-clobber $sp = frame-setup STRXpre killed $lr, $sp, -16 :: (store (s64) into %stack.2)
; CHECK-NEXT: frame-setup SEH_SaveReg_X 30, -16
; CHECK-NEXT: $sp = frame-setup SUBXri $sp, 16, 0
; CHECK-NEXT: frame-setup SEH_StackAlloc 16
; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -1, implicit $vg
; CHECK-NEXT: frame-setup SEH_AllocZ 1
; CHECK-NEXT: frame-setup SEH_PrologEnd
; CHECK-NEXT: $x8 = ADDVL_XXI $sp, 1, implicit $vg
; CHECK-NEXT: $x0 = LDRXui killed $x8, 4
; CHECK-NEXT: frame-destroy SEH_EpilogStart
; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 1, implicit $vg
; CHECK-NEXT: frame-destroy SEH_AllocZ 1
; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 16, 0
; CHECK-NEXT: frame-destroy SEH_StackAlloc 16
; CHECK-NEXT: early-clobber $sp, $lr = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.2)
; CHECK-NEXT: frame-destroy SEH_SaveReg_X 30, -16
; CHECK-NEXT: frame-destroy SEH_EpilogEnd
; CHECK-NEXT: RET_ReallyLR
$x0 = LDRXui %fixed-stack.0, 0
RET_ReallyLR
...
---
name: test_address_sve_out_of_range
frameInfo:
maxAlignment: 16
stack:
- { id: 0, stack-id: scalable-vector, size: 16, alignment: 16 }
- { id: 1, stack-id: scalable-vector, size: 3584, alignment: 16 }
- { id: 2, stack-id: scalable-vector, size: 512, alignment: 16 }
body: |
bb.0.entry:
liveins: $z0, $p0
; CHECK-LABEL: name: test_address_sve_out_of_range
; CHECK: fixedStack:
; CHECK: liveins: $z0, $p0, $lr
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: early-clobber $sp = frame-setup STRXpre killed $lr, $sp, -16 :: (store (s64) into %stack.3)
; CHECK-NEXT: frame-setup SEH_SaveReg_X 30, -16
; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32, implicit $vg
; CHECK-NEXT: frame-setup SEH_AllocZ 32
; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32, implicit $vg
; CHECK-NEXT: frame-setup SEH_AllocZ 32
; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32, implicit $vg
; CHECK-NEXT: frame-setup SEH_AllocZ 32
; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32, implicit $vg
; CHECK-NEXT: frame-setup SEH_AllocZ 32
; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32, implicit $vg
; CHECK-NEXT: frame-setup SEH_AllocZ 32
; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32, implicit $vg
; CHECK-NEXT: frame-setup SEH_AllocZ 32
; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32, implicit $vg
; CHECK-NEXT: frame-setup SEH_AllocZ 32
; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32, implicit $vg
; CHECK-NEXT: frame-setup SEH_AllocZ 32
; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -1, implicit $vg
; CHECK-NEXT: frame-setup SEH_AllocZ 1
; CHECK-NEXT: frame-setup SEH_PrologEnd
; CHECK-NEXT: $x8 = ADDVL_XXI $sp, 1, implicit $vg
; CHECK-NEXT: STR_ZXI $z0, killed $x8, 255
; CHECK-NEXT: $x8 = ADDPL_XXI $sp, 1, implicit $vg
; CHECK-NEXT: STR_PXI $p0, killed $x8, 255
; CHECK-NEXT: frame-destroy SEH_EpilogStart
; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31, implicit $vg
; CHECK-NEXT: frame-destroy SEH_AllocZ 31
; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31, implicit $vg
; CHECK-NEXT: frame-destroy SEH_AllocZ 31
; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31, implicit $vg
; CHECK-NEXT: frame-destroy SEH_AllocZ 31
; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31, implicit $vg
; CHECK-NEXT: frame-destroy SEH_AllocZ 31
; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31, implicit $vg
; CHECK-NEXT: frame-destroy SEH_AllocZ 31
; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31, implicit $vg
; CHECK-NEXT: frame-destroy SEH_AllocZ 31
; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31, implicit $vg
; CHECK-NEXT: frame-destroy SEH_AllocZ 31
; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31, implicit $vg
; CHECK-NEXT: frame-destroy SEH_AllocZ 31
; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 9, implicit $vg
; CHECK-NEXT: frame-destroy SEH_AllocZ 9
; CHECK-NEXT: early-clobber $sp, $lr = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.3)
; CHECK-NEXT: frame-destroy SEH_SaveReg_X 30, -16
; CHECK-NEXT: frame-destroy SEH_EpilogEnd
; CHECK-NEXT: RET_ReallyLR
STR_ZXI $z0, %stack.0, 0
STR_PXI $p0, %stack.1, 0
RET_ReallyLR
...
---
name: test_address_gpr_vla
frameInfo:
maxAlignment: 16
stack:
- { id: 0, stack-id: scalable-vector, size: 16, alignment: 8 }
- { id: 1, stack-id: default, size: 16, alignment: 8 }
- { id: 2, stack-id: default, type: variable-sized }
body: |
bb.0.entry:
liveins: $xzr
; CHECK-LABEL: name: test_address_gpr_vla
; CHECK: fixedStack:
; CHECK: liveins: $xzr, $lr
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: early-clobber $sp = frame-setup STRXpre killed $x19, $sp, -32 :: (store (s64) into %stack.5)
; CHECK-NEXT: frame-setup SEH_SaveReg_X 19, -32
; CHECK-NEXT: frame-setup STPXi killed $fp, killed $lr, $sp, 1 :: (store (s64) into %stack.3), (store (s64) into %stack.4)
; CHECK-NEXT: frame-setup SEH_SaveFPLR 8
; CHECK-NEXT: $fp = frame-setup ADDXri $sp, 8, 0
; CHECK-NEXT: frame-setup SEH_AddFP 8
; CHECK-NEXT: frame-setup SEH_PrologEnd
; CHECK-NEXT: $sp = frame-setup SUBXri $sp, 16, 0
; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -1, implicit $vg
; CHECK-NEXT: $x19 = ADDXri $sp, 0, 0
; CHECK-NEXT: STRXui $xzr, $x19, 0
; CHECK-NEXT: frame-destroy SEH_EpilogStart
; CHECK-NEXT: $sp = frame-destroy SUBXri $fp, 8, 0
; CHECK-NEXT: frame-destroy SEH_AddFP 8
; CHECK-NEXT: $fp, $lr = frame-destroy LDPXi $sp, 1 :: (load (s64) from %stack.3), (load (s64) from %stack.4)
; CHECK-NEXT: frame-destroy SEH_SaveFPLR 8
; CHECK-NEXT: early-clobber $sp, $x19 = frame-destroy LDRXpost $sp, 32 :: (load (s64) from %stack.5)
; CHECK-NEXT: frame-destroy SEH_SaveReg_X 19, -32
; CHECK-NEXT: frame-destroy SEH_EpilogEnd
; CHECK-NEXT: RET_ReallyLR
STRXui $xzr, %stack.1, 0
RET_ReallyLR
...
---
name: save_restore_pregs_sve
stack:
- { id: 0, stack-id: default, size: 32, alignment: 16 }
body: |
bb.0.entry:
; CHECK-LABEL: name: save_restore_pregs_sve
; CHECK: fixedStack:
; CHECK: liveins: $p4, $p5, $p6, $lr
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -1, implicit $vg
; CHECK-NEXT: frame-setup SEH_AllocZ 1
; CHECK-NEXT: frame-setup STR_PXI killed $p4, $sp, 0 :: (store (s16) into %stack.4)
; CHECK-NEXT: frame-setup SEH_SavePReg 4, 0
; CHECK-NEXT: frame-setup STR_PXI killed $p5, $sp, 1 :: (store (s16) into %stack.3)
; CHECK-NEXT: frame-setup SEH_SavePReg 5, 1
; CHECK-NEXT: frame-setup STR_PXI killed $p6, $sp, 2 :: (store (s16) into %stack.2)
; CHECK-NEXT: frame-setup SEH_SavePReg 6, 2
; CHECK-NEXT: early-clobber $sp = frame-setup STRXpre killed $lr, $sp, -16 :: (store (s64) into %stack.1)
; CHECK-NEXT: frame-setup SEH_SaveReg_X 30, -16
; CHECK-NEXT: $sp = frame-setup SUBXri $sp, 32, 0
; CHECK-NEXT: frame-setup SEH_StackAlloc 32
; CHECK-NEXT: frame-setup SEH_PrologEnd
; CHECK-NEXT: $p4 = IMPLICIT_DEF
; CHECK-NEXT: $p5 = IMPLICIT_DEF
; CHECK-NEXT: $p6 = IMPLICIT_DEF
; CHECK-NEXT: frame-destroy SEH_EpilogStart
; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 32, 0
; CHECK-NEXT: frame-destroy SEH_StackAlloc 32
; CHECK-NEXT: $lr = frame-destroy LDRXui $sp, 0 :: (load (s64) from %stack.1)
; CHECK-NEXT: frame-destroy SEH_SaveReg 30, 0
; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 16, 0
; CHECK-NEXT: frame-destroy SEH_StackAlloc 16
; CHECK-NEXT: $p4 = frame-destroy LDR_PXI $sp, 0 :: (load (s16) from %stack.4)
; CHECK-NEXT: frame-destroy SEH_SavePReg 4, 0
; CHECK-NEXT: $p5 = frame-destroy LDR_PXI $sp, 1 :: (load (s16) from %stack.3)
; CHECK-NEXT: frame-destroy SEH_SavePReg 5, 1
; CHECK-NEXT: $p6 = frame-destroy LDR_PXI $sp, 2 :: (load (s16) from %stack.2)
; CHECK-NEXT: frame-destroy SEH_SavePReg 6, 2
; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 1, implicit $vg
; CHECK-NEXT: frame-destroy SEH_AllocZ 1
; CHECK-NEXT: frame-destroy SEH_EpilogEnd
; CHECK-NEXT: RET_ReallyLR
$p4 = IMPLICIT_DEF
$p5 = IMPLICIT_DEF
$p6 = IMPLICIT_DEF
RET_ReallyLR
...
---
name: save_restore_zregs_sve
stack:
- { id: 0, stack-id: default, size: 32, alignment: 16 }
body: |
bb.0.entry:
; CHECK-LABEL: name: save_restore_zregs_sve
; CHECK: fixedStack:
; CHECK: liveins: $z8, $z9, $z10, $lr
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -3, implicit $vg
; CHECK-NEXT: frame-setup SEH_AllocZ 3
; CHECK-NEXT: frame-setup STR_ZXI killed $z8, $sp, 0 :: (store (s128) into %stack.4)
; CHECK-NEXT: frame-setup SEH_SaveZReg 8, 0
; CHECK-NEXT: frame-setup STR_ZXI killed $z9, $sp, 1 :: (store (s128) into %stack.3)
; CHECK-NEXT: frame-setup SEH_SaveZReg 9, 1
; CHECK-NEXT: frame-setup STR_ZXI killed $z10, $sp, 2 :: (store (s128) into %stack.2)
; CHECK-NEXT: frame-setup SEH_SaveZReg 10, 2
; CHECK-NEXT: early-clobber $sp = frame-setup STRXpre killed $lr, $sp, -16 :: (store (s64) into %stack.1)
; CHECK-NEXT: frame-setup SEH_SaveReg_X 30, -16
; CHECK-NEXT: $sp = frame-setup SUBXri $sp, 32, 0
; CHECK-NEXT: frame-setup SEH_StackAlloc 32
; CHECK-NEXT: frame-setup SEH_PrologEnd
; CHECK-NEXT: $z8 = IMPLICIT_DEF
; CHECK-NEXT: $z9 = IMPLICIT_DEF
; CHECK-NEXT: $z10 = IMPLICIT_DEF
; CHECK-NEXT: frame-destroy SEH_EpilogStart
; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 32, 0
; CHECK-NEXT: frame-destroy SEH_StackAlloc 32
; CHECK-NEXT: $lr = frame-destroy LDRXui $sp, 0 :: (load (s64) from %stack.1)
; CHECK-NEXT: frame-destroy SEH_SaveReg 30, 0
; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 16, 0
; CHECK-NEXT: frame-destroy SEH_StackAlloc 16
; CHECK-NEXT: $z8 = frame-destroy LDR_ZXI $sp, 0 :: (load (s128) from %stack.4)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 8, 0
; CHECK-NEXT: $z9 = frame-destroy LDR_ZXI $sp, 1 :: (load (s128) from %stack.3)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 9, 1
; CHECK-NEXT: $z10 = frame-destroy LDR_ZXI $sp, 2 :: (load (s128) from %stack.2)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 10, 2
; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 3, implicit $vg
; CHECK-NEXT: frame-destroy SEH_AllocZ 3
; CHECK-NEXT: frame-destroy SEH_EpilogEnd
; CHECK-NEXT: RET_ReallyLR
$z8 = IMPLICIT_DEF
$z9 = IMPLICIT_DEF
$z10 = IMPLICIT_DEF
RET_ReallyLR
...
---
name: save_restore_sve
stack:
- { id: 0, stack-id: scalable-vector, size: 16, alignment: 16 }
- { id: 1, stack-id: default, size: 32, alignment: 16 }
body: |
bb.0.entry:
; CHECK-LABEL: name: save_restore_sve
; CHECK: fixedStack:
; CHECK: liveins: $p4, $p5, $p6, $p7, $p8, $p9, $p10, $p11, $p12, $p13, $p14, $p15, $z8, $z9, $z10, $z11, $z12, $z13, $z14, $z15, $z16, $z17, $z18, $z19, $z20, $z21, $z22, $z23, $x20, $x19, $lr, $x21
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -18, implicit $vg
; CHECK-NEXT: frame-setup SEH_AllocZ 18
; CHECK-NEXT: frame-setup STR_PXI killed $p4, $sp, 0 :: (store (s16) into %stack.33)
; CHECK-NEXT: frame-setup SEH_SavePReg 4, 0
; CHECK-NEXT: frame-setup STR_PXI killed $p5, $sp, 1 :: (store (s16) into %stack.32)
; CHECK-NEXT: frame-setup SEH_SavePReg 5, 1
; CHECK-NEXT: frame-setup STR_PXI killed $p6, $sp, 2 :: (store (s16) into %stack.31)
; CHECK-NEXT: frame-setup SEH_SavePReg 6, 2
; CHECK-NEXT: frame-setup STR_PXI killed $p7, $sp, 3 :: (store (s16) into %stack.30)
; CHECK-NEXT: frame-setup SEH_SavePReg 7, 3
; CHECK-NEXT: frame-setup STR_PXI killed $p8, $sp, 4 :: (store (s16) into %stack.29)
; CHECK-NEXT: frame-setup SEH_SavePReg 8, 4
; CHECK-NEXT: frame-setup STR_PXI killed $p9, $sp, 5 :: (store (s16) into %stack.28)
; CHECK-NEXT: frame-setup SEH_SavePReg 9, 5
; CHECK-NEXT: frame-setup STR_PXI killed $p10, $sp, 6 :: (store (s16) into %stack.27)
; CHECK-NEXT: frame-setup SEH_SavePReg 10, 6
; CHECK-NEXT: frame-setup STR_PXI killed $p11, $sp, 7 :: (store (s16) into %stack.26)
; CHECK-NEXT: frame-setup SEH_SavePReg 11, 7
; CHECK-NEXT: frame-setup STR_PXI killed $p12, $sp, 8 :: (store (s16) into %stack.25)
; CHECK-NEXT: frame-setup SEH_SavePReg 12, 8
; CHECK-NEXT: frame-setup STR_PXI killed $p13, $sp, 9 :: (store (s16) into %stack.24)
; CHECK-NEXT: frame-setup SEH_SavePReg 13, 9
; CHECK-NEXT: frame-setup STR_PXI killed $p14, $sp, 10 :: (store (s16) into %stack.23)
; CHECK-NEXT: frame-setup SEH_SavePReg 14, 10
; CHECK-NEXT: frame-setup STR_PXI killed $p15, $sp, 11 :: (store (s16) into %stack.22)
; CHECK-NEXT: frame-setup SEH_SavePReg 15, 11
; CHECK-NEXT: frame-setup STR_ZXI killed $z8, $sp, 2 :: (store (s128) into %stack.21)
; CHECK-NEXT: frame-setup SEH_SaveZReg 8, 2
; CHECK-NEXT: frame-setup STR_ZXI killed $z9, $sp, 3 :: (store (s128) into %stack.20)
; CHECK-NEXT: frame-setup SEH_SaveZReg 9, 3
; CHECK-NEXT: frame-setup STR_ZXI killed $z10, $sp, 4 :: (store (s128) into %stack.19)
; CHECK-NEXT: frame-setup SEH_SaveZReg 10, 4
; CHECK-NEXT: frame-setup STR_ZXI killed $z11, $sp, 5 :: (store (s128) into %stack.18)
; CHECK-NEXT: frame-setup SEH_SaveZReg 11, 5
; CHECK-NEXT: frame-setup STR_ZXI killed $z12, $sp, 6 :: (store (s128) into %stack.17)
; CHECK-NEXT: frame-setup SEH_SaveZReg 12, 6
; CHECK-NEXT: frame-setup STR_ZXI killed $z13, $sp, 7 :: (store (s128) into %stack.16)
; CHECK-NEXT: frame-setup SEH_SaveZReg 13, 7
; CHECK-NEXT: frame-setup STR_ZXI killed $z14, $sp, 8 :: (store (s128) into %stack.15)
; CHECK-NEXT: frame-setup SEH_SaveZReg 14, 8
; CHECK-NEXT: frame-setup STR_ZXI killed $z15, $sp, 9 :: (store (s128) into %stack.14)
; CHECK-NEXT: frame-setup SEH_SaveZReg 15, 9
; CHECK-NEXT: frame-setup STR_ZXI killed $z16, $sp, 10 :: (store (s128) into %stack.13)
; CHECK-NEXT: frame-setup SEH_SaveZReg 16, 10
; CHECK-NEXT: frame-setup STR_ZXI killed $z17, $sp, 11 :: (store (s128) into %stack.12)
; CHECK-NEXT: frame-setup SEH_SaveZReg 17, 11
; CHECK-NEXT: frame-setup STR_ZXI killed $z18, $sp, 12 :: (store (s128) into %stack.11)
; CHECK-NEXT: frame-setup SEH_SaveZReg 18, 12
; CHECK-NEXT: frame-setup STR_ZXI killed $z19, $sp, 13 :: (store (s128) into %stack.10)
; CHECK-NEXT: frame-setup SEH_SaveZReg 19, 13
; CHECK-NEXT: frame-setup STR_ZXI killed $z20, $sp, 14 :: (store (s128) into %stack.9)
; CHECK-NEXT: frame-setup SEH_SaveZReg 20, 14
; CHECK-NEXT: frame-setup STR_ZXI killed $z21, $sp, 15 :: (store (s128) into %stack.8)
; CHECK-NEXT: frame-setup SEH_SaveZReg 21, 15
; CHECK-NEXT: frame-setup STR_ZXI killed $z22, $sp, 16 :: (store (s128) into %stack.7)
; CHECK-NEXT: frame-setup SEH_SaveZReg 22, 16
; CHECK-NEXT: frame-setup STR_ZXI killed $z23, $sp, 17 :: (store (s128) into %stack.6)
; CHECK-NEXT: frame-setup SEH_SaveZReg 23, 17
; CHECK-NEXT: early-clobber $sp = frame-setup STPXpre killed $x19, killed $x20, $sp, -4 :: (store (s64) into %stack.4), (store (s64) into %stack.5)
; CHECK-NEXT: frame-setup SEH_SaveRegP_X 19, 20, -32
; CHECK-NEXT: frame-setup STPXi killed $x21, killed $lr, $sp, 2 :: (store (s64) into %stack.2), (store (s64) into %stack.3)
; CHECK-NEXT: frame-setup SEH_SaveRegP 21, 30, 16
; CHECK-NEXT: $sp = frame-setup SUBXri $sp, 32, 0
; CHECK-NEXT: frame-setup SEH_StackAlloc 32
; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -1, implicit $vg
; CHECK-NEXT: frame-setup SEH_AllocZ 1
; CHECK-NEXT: frame-setup SEH_PrologEnd
; CHECK-NEXT: $z8_z9_z10_z11 = IMPLICIT_DEF
; CHECK-NEXT: $z12_z13_z14_z15 = IMPLICIT_DEF
; CHECK-NEXT: $z16_z17_z18_z19 = IMPLICIT_DEF
; CHECK-NEXT: $z20_z21_z22_z23 = IMPLICIT_DEF
; CHECK-NEXT: $z24_z25_z26_z27 = IMPLICIT_DEF
; CHECK-NEXT: $z28_z29_z30_z31 = IMPLICIT_DEF
; CHECK-NEXT: $p4 = IMPLICIT_DEF
; CHECK-NEXT: $p5 = IMPLICIT_DEF
; CHECK-NEXT: $p6 = IMPLICIT_DEF
; CHECK-NEXT: $p7 = IMPLICIT_DEF
; CHECK-NEXT: $p8 = IMPLICIT_DEF
; CHECK-NEXT: $p9 = IMPLICIT_DEF
; CHECK-NEXT: $p10 = IMPLICIT_DEF
; CHECK-NEXT: $p11 = IMPLICIT_DEF
; CHECK-NEXT: $p12 = IMPLICIT_DEF
; CHECK-NEXT: $p13 = IMPLICIT_DEF
; CHECK-NEXT: $p14 = IMPLICIT_DEF
; CHECK-NEXT: $p15 = IMPLICIT_DEF
; CHECK-NEXT: $x19 = IMPLICIT_DEF
; CHECK-NEXT: $x20 = IMPLICIT_DEF
; CHECK-NEXT: $x21 = IMPLICIT_DEF
; CHECK-NEXT: frame-destroy SEH_EpilogStart
; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 1, implicit $vg
; CHECK-NEXT: frame-destroy SEH_AllocZ 1
; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 32, 0
; CHECK-NEXT: frame-destroy SEH_StackAlloc 32
; CHECK-NEXT: $x21, $lr = frame-destroy LDPXi $sp, 2 :: (load (s64) from %stack.2), (load (s64) from %stack.3)
; CHECK-NEXT: frame-destroy SEH_SaveRegP 21, 30, 16
; CHECK-NEXT: $x19, $x20 = frame-destroy LDPXi $sp, 0 :: (load (s64) from %stack.4), (load (s64) from %stack.5)
; CHECK-NEXT: frame-destroy SEH_SaveRegP 19, 20, 0
; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 32, 0
; CHECK-NEXT: frame-destroy SEH_StackAlloc 32
; CHECK-NEXT: $z8 = frame-destroy LDR_ZXI $sp, 2 :: (load (s128) from %stack.21)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 8, 2
; CHECK-NEXT: $z9 = frame-destroy LDR_ZXI $sp, 3 :: (load (s128) from %stack.20)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 9, 3
; CHECK-NEXT: $z10 = frame-destroy LDR_ZXI $sp, 4 :: (load (s128) from %stack.19)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 10, 4
; CHECK-NEXT: $z11 = frame-destroy LDR_ZXI $sp, 5 :: (load (s128) from %stack.18)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 11, 5
; CHECK-NEXT: $z12 = frame-destroy LDR_ZXI $sp, 6 :: (load (s128) from %stack.17)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 12, 6
; CHECK-NEXT: $z13 = frame-destroy LDR_ZXI $sp, 7 :: (load (s128) from %stack.16)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 13, 7
; CHECK-NEXT: $z14 = frame-destroy LDR_ZXI $sp, 8 :: (load (s128) from %stack.15)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 14, 8
; CHECK-NEXT: $z15 = frame-destroy LDR_ZXI $sp, 9 :: (load (s128) from %stack.14)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 15, 9
; CHECK-NEXT: $z16 = frame-destroy LDR_ZXI $sp, 10 :: (load (s128) from %stack.13)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 16, 10
; CHECK-NEXT: $z17 = frame-destroy LDR_ZXI $sp, 11 :: (load (s128) from %stack.12)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 17, 11
; CHECK-NEXT: $z18 = frame-destroy LDR_ZXI $sp, 12 :: (load (s128) from %stack.11)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 18, 12
; CHECK-NEXT: $z19 = frame-destroy LDR_ZXI $sp, 13 :: (load (s128) from %stack.10)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 19, 13
; CHECK-NEXT: $z20 = frame-destroy LDR_ZXI $sp, 14 :: (load (s128) from %stack.9)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 20, 14
; CHECK-NEXT: $z21 = frame-destroy LDR_ZXI $sp, 15 :: (load (s128) from %stack.8)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 21, 15
; CHECK-NEXT: $z22 = frame-destroy LDR_ZXI $sp, 16 :: (load (s128) from %stack.7)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 22, 16
; CHECK-NEXT: $z23 = frame-destroy LDR_ZXI $sp, 17 :: (load (s128) from %stack.6)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 23, 17
; CHECK-NEXT: $p4 = frame-destroy LDR_PXI $sp, 0 :: (load (s16) from %stack.33)
; CHECK-NEXT: frame-destroy SEH_SavePReg 4, 0
; CHECK-NEXT: $p5 = frame-destroy LDR_PXI $sp, 1 :: (load (s16) from %stack.32)
; CHECK-NEXT: frame-destroy SEH_SavePReg 5, 1
; CHECK-NEXT: $p6 = frame-destroy LDR_PXI $sp, 2 :: (load (s16) from %stack.31)
; CHECK-NEXT: frame-destroy SEH_SavePReg 6, 2
; CHECK-NEXT: $p7 = frame-destroy LDR_PXI $sp, 3 :: (load (s16) from %stack.30)
; CHECK-NEXT: frame-destroy SEH_SavePReg 7, 3
; CHECK-NEXT: $p8 = frame-destroy LDR_PXI $sp, 4 :: (load (s16) from %stack.29)
; CHECK-NEXT: frame-destroy SEH_SavePReg 8, 4
; CHECK-NEXT: $p9 = frame-destroy LDR_PXI $sp, 5 :: (load (s16) from %stack.28)
; CHECK-NEXT: frame-destroy SEH_SavePReg 9, 5
; CHECK-NEXT: $p10 = frame-destroy LDR_PXI $sp, 6 :: (load (s16) from %stack.27)
; CHECK-NEXT: frame-destroy SEH_SavePReg 10, 6
; CHECK-NEXT: $p11 = frame-destroy LDR_PXI $sp, 7 :: (load (s16) from %stack.26)
; CHECK-NEXT: frame-destroy SEH_SavePReg 11, 7
; CHECK-NEXT: $p12 = frame-destroy LDR_PXI $sp, 8 :: (load (s16) from %stack.25)
; CHECK-NEXT: frame-destroy SEH_SavePReg 12, 8
; CHECK-NEXT: $p13 = frame-destroy LDR_PXI $sp, 9 :: (load (s16) from %stack.24)
; CHECK-NEXT: frame-destroy SEH_SavePReg 13, 9
; CHECK-NEXT: $p14 = frame-destroy LDR_PXI $sp, 10 :: (load (s16) from %stack.23)
; CHECK-NEXT: frame-destroy SEH_SavePReg 14, 10
; CHECK-NEXT: $p15 = frame-destroy LDR_PXI $sp, 11 :: (load (s16) from %stack.22)
; CHECK-NEXT: frame-destroy SEH_SavePReg 15, 11
; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 18, implicit $vg
; CHECK-NEXT: frame-destroy SEH_AllocZ 18
; CHECK-NEXT: frame-destroy SEH_EpilogEnd
; CHECK-NEXT: RET_ReallyLR
$z8_z9_z10_z11 = IMPLICIT_DEF
$z12_z13_z14_z15 = IMPLICIT_DEF
$z16_z17_z18_z19 = IMPLICIT_DEF
$z20_z21_z22_z23 = IMPLICIT_DEF
$z24_z25_z26_z27 = IMPLICIT_DEF
$z28_z29_z30_z31 = IMPLICIT_DEF
$p4 = IMPLICIT_DEF
$p5 = IMPLICIT_DEF
$p6 = IMPLICIT_DEF
$p7 = IMPLICIT_DEF
$p8 = IMPLICIT_DEF
$p9 = IMPLICIT_DEF
$p10 = IMPLICIT_DEF
$p11 = IMPLICIT_DEF
$p12 = IMPLICIT_DEF
$p13 = IMPLICIT_DEF
$p14 = IMPLICIT_DEF
$p15 = IMPLICIT_DEF
$x19 = IMPLICIT_DEF
$x20 = IMPLICIT_DEF
$x21 = IMPLICIT_DEF
RET_ReallyLR
...
---
name: save_restore_sve_realign
stack:
- { id: 0, stack-id: scalable-vector, size: 16, alignment: 16 }
- { id: 1, stack-id: default, size: 16, alignment: 32 }
body: |
bb.0.entry:
; CHECK-LABEL: name: save_restore_sve_realign
; CHECK: fixedStack:
; CHECK: liveins: $p4, $p5, $p6, $p7, $p8, $p9, $p10, $p11, $p12, $p13, $p14, $p15, $z8, $z9, $z10, $z11, $z12, $z13, $z14, $z15, $z16, $z17, $z18, $z19, $z20, $z21, $z22, $z23, $lr
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -18, implicit $vg
; CHECK-NEXT: frame-setup SEH_AllocZ 18
; CHECK-NEXT: frame-setup STR_PXI killed $p4, $sp, 0 :: (store (s16) into %stack.31)
; CHECK-NEXT: frame-setup SEH_SavePReg 4, 0
; CHECK-NEXT: frame-setup STR_PXI killed $p5, $sp, 1 :: (store (s16) into %stack.30)
; CHECK-NEXT: frame-setup SEH_SavePReg 5, 1
; CHECK-NEXT: frame-setup STR_PXI killed $p6, $sp, 2 :: (store (s16) into %stack.29)
; CHECK-NEXT: frame-setup SEH_SavePReg 6, 2
; CHECK-NEXT: frame-setup STR_PXI killed $p7, $sp, 3 :: (store (s16) into %stack.28)
; CHECK-NEXT: frame-setup SEH_SavePReg 7, 3
; CHECK-NEXT: frame-setup STR_PXI killed $p8, $sp, 4 :: (store (s16) into %stack.27)
; CHECK-NEXT: frame-setup SEH_SavePReg 8, 4
; CHECK-NEXT: frame-setup STR_PXI killed $p9, $sp, 5 :: (store (s16) into %stack.26)
; CHECK-NEXT: frame-setup SEH_SavePReg 9, 5
; CHECK-NEXT: frame-setup STR_PXI killed $p10, $sp, 6 :: (store (s16) into %stack.25)
; CHECK-NEXT: frame-setup SEH_SavePReg 10, 6
; CHECK-NEXT: frame-setup STR_PXI killed $p11, $sp, 7 :: (store (s16) into %stack.24)
; CHECK-NEXT: frame-setup SEH_SavePReg 11, 7
; CHECK-NEXT: frame-setup STR_PXI killed $p12, $sp, 8 :: (store (s16) into %stack.23)
; CHECK-NEXT: frame-setup SEH_SavePReg 12, 8
; CHECK-NEXT: frame-setup STR_PXI killed $p13, $sp, 9 :: (store (s16) into %stack.22)
; CHECK-NEXT: frame-setup SEH_SavePReg 13, 9
; CHECK-NEXT: frame-setup STR_PXI killed $p14, $sp, 10 :: (store (s16) into %stack.21)
; CHECK-NEXT: frame-setup SEH_SavePReg 14, 10
; CHECK-NEXT: frame-setup STR_PXI killed $p15, $sp, 11 :: (store (s16) into %stack.20)
; CHECK-NEXT: frame-setup SEH_SavePReg 15, 11
; CHECK-NEXT: frame-setup STR_ZXI killed $z8, $sp, 2 :: (store (s128) into %stack.19)
; CHECK-NEXT: frame-setup SEH_SaveZReg 8, 2
; CHECK-NEXT: frame-setup STR_ZXI killed $z9, $sp, 3 :: (store (s128) into %stack.18)
; CHECK-NEXT: frame-setup SEH_SaveZReg 9, 3
; CHECK-NEXT: frame-setup STR_ZXI killed $z10, $sp, 4 :: (store (s128) into %stack.17)
; CHECK-NEXT: frame-setup SEH_SaveZReg 10, 4
; CHECK-NEXT: frame-setup STR_ZXI killed $z11, $sp, 5 :: (store (s128) into %stack.16)
; CHECK-NEXT: frame-setup SEH_SaveZReg 11, 5
; CHECK-NEXT: frame-setup STR_ZXI killed $z12, $sp, 6 :: (store (s128) into %stack.15)
; CHECK-NEXT: frame-setup SEH_SaveZReg 12, 6
; CHECK-NEXT: frame-setup STR_ZXI killed $z13, $sp, 7 :: (store (s128) into %stack.14)
; CHECK-NEXT: frame-setup SEH_SaveZReg 13, 7
; CHECK-NEXT: frame-setup STR_ZXI killed $z14, $sp, 8 :: (store (s128) into %stack.13)
; CHECK-NEXT: frame-setup SEH_SaveZReg 14, 8
; CHECK-NEXT: frame-setup STR_ZXI killed $z15, $sp, 9 :: (store (s128) into %stack.12)
; CHECK-NEXT: frame-setup SEH_SaveZReg 15, 9
; CHECK-NEXT: frame-setup STR_ZXI killed $z16, $sp, 10 :: (store (s128) into %stack.11)
; CHECK-NEXT: frame-setup SEH_SaveZReg 16, 10
; CHECK-NEXT: frame-setup STR_ZXI killed $z17, $sp, 11 :: (store (s128) into %stack.10)
; CHECK-NEXT: frame-setup SEH_SaveZReg 17, 11
; CHECK-NEXT: frame-setup STR_ZXI killed $z18, $sp, 12 :: (store (s128) into %stack.9)
; CHECK-NEXT: frame-setup SEH_SaveZReg 18, 12
; CHECK-NEXT: frame-setup STR_ZXI killed $z19, $sp, 13 :: (store (s128) into %stack.8)
; CHECK-NEXT: frame-setup SEH_SaveZReg 19, 13
; CHECK-NEXT: frame-setup STR_ZXI killed $z20, $sp, 14 :: (store (s128) into %stack.7)
; CHECK-NEXT: frame-setup SEH_SaveZReg 20, 14
; CHECK-NEXT: frame-setup STR_ZXI killed $z21, $sp, 15 :: (store (s128) into %stack.6)
; CHECK-NEXT: frame-setup SEH_SaveZReg 21, 15
; CHECK-NEXT: frame-setup STR_ZXI killed $z22, $sp, 16 :: (store (s128) into %stack.5)
; CHECK-NEXT: frame-setup SEH_SaveZReg 22, 16
; CHECK-NEXT: frame-setup STR_ZXI killed $z23, $sp, 17 :: (store (s128) into %stack.4)
; CHECK-NEXT: frame-setup SEH_SaveZReg 23, 17
; CHECK-NEXT: early-clobber $sp = frame-setup STPXpre killed $fp, killed $lr, $sp, -2 :: (store (s64) into %stack.2), (store (s64) into %stack.3)
; CHECK-NEXT: frame-setup SEH_SaveFPLR_X -16
; CHECK-NEXT: $fp = frame-setup ADDXri $sp, 0, 0
; CHECK-NEXT: frame-setup SEH_SetFP
; CHECK-NEXT: frame-setup SEH_PrologEnd
; CHECK-NEXT: $x9 = frame-setup SUBXri $sp, 16, 0
; CHECK-NEXT: $x9 = frame-setup ADDVL_XXI $x9, -1, implicit $vg
; CHECK-NEXT: $sp = frame-setup ANDXri killed $x9, 7930
; CHECK-NEXT: $z8_z9_z10_z11 = IMPLICIT_DEF
; CHECK-NEXT: $z12_z13_z14_z15 = IMPLICIT_DEF
; CHECK-NEXT: $z16_z17_z18_z19 = IMPLICIT_DEF
; CHECK-NEXT: $z20_z21_z22_z23 = IMPLICIT_DEF
; CHECK-NEXT: $z24_z25_z26_z27 = IMPLICIT_DEF
; CHECK-NEXT: $z28_z29_z30_z31 = IMPLICIT_DEF
; CHECK-NEXT: $p4 = IMPLICIT_DEF
; CHECK-NEXT: $p5 = IMPLICIT_DEF
; CHECK-NEXT: $p6 = IMPLICIT_DEF
; CHECK-NEXT: $p7 = IMPLICIT_DEF
; CHECK-NEXT: $p8 = IMPLICIT_DEF
; CHECK-NEXT: $p9 = IMPLICIT_DEF
; CHECK-NEXT: $p10 = IMPLICIT_DEF
; CHECK-NEXT: $p11 = IMPLICIT_DEF
; CHECK-NEXT: $p12 = IMPLICIT_DEF
; CHECK-NEXT: $p13 = IMPLICIT_DEF
; CHECK-NEXT: $p14 = IMPLICIT_DEF
; CHECK-NEXT: $p15 = IMPLICIT_DEF
; CHECK-NEXT: frame-destroy SEH_EpilogStart
; CHECK-NEXT: $sp = frame-destroy ADDXri $fp, 0, 0
; CHECK-NEXT: frame-destroy SEH_SetFP
; CHECK-NEXT: $fp, $lr = frame-destroy LDPXi $sp, 0 :: (load (s64) from %stack.2), (load (s64) from %stack.3)
; CHECK-NEXT: frame-destroy SEH_SaveFPLR 0
; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 16, 0
; CHECK-NEXT: frame-destroy SEH_StackAlloc 16
; CHECK-NEXT: $z8 = frame-destroy LDR_ZXI $sp, 2 :: (load (s128) from %stack.19)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 8, 2
; CHECK-NEXT: $z9 = frame-destroy LDR_ZXI $sp, 3 :: (load (s128) from %stack.18)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 9, 3
; CHECK-NEXT: $z10 = frame-destroy LDR_ZXI $sp, 4 :: (load (s128) from %stack.17)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 10, 4
; CHECK-NEXT: $z11 = frame-destroy LDR_ZXI $sp, 5 :: (load (s128) from %stack.16)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 11, 5
; CHECK-NEXT: $z12 = frame-destroy LDR_ZXI $sp, 6 :: (load (s128) from %stack.15)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 12, 6
; CHECK-NEXT: $z13 = frame-destroy LDR_ZXI $sp, 7 :: (load (s128) from %stack.14)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 13, 7
; CHECK-NEXT: $z14 = frame-destroy LDR_ZXI $sp, 8 :: (load (s128) from %stack.13)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 14, 8
; CHECK-NEXT: $z15 = frame-destroy LDR_ZXI $sp, 9 :: (load (s128) from %stack.12)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 15, 9
; CHECK-NEXT: $z16 = frame-destroy LDR_ZXI $sp, 10 :: (load (s128) from %stack.11)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 16, 10
; CHECK-NEXT: $z17 = frame-destroy LDR_ZXI $sp, 11 :: (load (s128) from %stack.10)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 17, 11
; CHECK-NEXT: $z18 = frame-destroy LDR_ZXI $sp, 12 :: (load (s128) from %stack.9)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 18, 12
; CHECK-NEXT: $z19 = frame-destroy LDR_ZXI $sp, 13 :: (load (s128) from %stack.8)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 19, 13
; CHECK-NEXT: $z20 = frame-destroy LDR_ZXI $sp, 14 :: (load (s128) from %stack.7)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 20, 14
; CHECK-NEXT: $z21 = frame-destroy LDR_ZXI $sp, 15 :: (load (s128) from %stack.6)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 21, 15
; CHECK-NEXT: $z22 = frame-destroy LDR_ZXI $sp, 16 :: (load (s128) from %stack.5)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 22, 16
; CHECK-NEXT: $z23 = frame-destroy LDR_ZXI $sp, 17 :: (load (s128) from %stack.4)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 23, 17
; CHECK-NEXT: $p4 = frame-destroy LDR_PXI $sp, 0 :: (load (s16) from %stack.31)
; CHECK-NEXT: frame-destroy SEH_SavePReg 4, 0
; CHECK-NEXT: $p5 = frame-destroy LDR_PXI $sp, 1 :: (load (s16) from %stack.30)
; CHECK-NEXT: frame-destroy SEH_SavePReg 5, 1
; CHECK-NEXT: $p6 = frame-destroy LDR_PXI $sp, 2 :: (load (s16) from %stack.29)
; CHECK-NEXT: frame-destroy SEH_SavePReg 6, 2
; CHECK-NEXT: $p7 = frame-destroy LDR_PXI $sp, 3 :: (load (s16) from %stack.28)
; CHECK-NEXT: frame-destroy SEH_SavePReg 7, 3
; CHECK-NEXT: $p8 = frame-destroy LDR_PXI $sp, 4 :: (load (s16) from %stack.27)
; CHECK-NEXT: frame-destroy SEH_SavePReg 8, 4
; CHECK-NEXT: $p9 = frame-destroy LDR_PXI $sp, 5 :: (load (s16) from %stack.26)
; CHECK-NEXT: frame-destroy SEH_SavePReg 9, 5
; CHECK-NEXT: $p10 = frame-destroy LDR_PXI $sp, 6 :: (load (s16) from %stack.25)
; CHECK-NEXT: frame-destroy SEH_SavePReg 10, 6
; CHECK-NEXT: $p11 = frame-destroy LDR_PXI $sp, 7 :: (load (s16) from %stack.24)
; CHECK-NEXT: frame-destroy SEH_SavePReg 11, 7
; CHECK-NEXT: $p12 = frame-destroy LDR_PXI $sp, 8 :: (load (s16) from %stack.23)
; CHECK-NEXT: frame-destroy SEH_SavePReg 12, 8
; CHECK-NEXT: $p13 = frame-destroy LDR_PXI $sp, 9 :: (load (s16) from %stack.22)
; CHECK-NEXT: frame-destroy SEH_SavePReg 13, 9
; CHECK-NEXT: $p14 = frame-destroy LDR_PXI $sp, 10 :: (load (s16) from %stack.21)
; CHECK-NEXT: frame-destroy SEH_SavePReg 14, 10
; CHECK-NEXT: $p15 = frame-destroy LDR_PXI $sp, 11 :: (load (s16) from %stack.20)
; CHECK-NEXT: frame-destroy SEH_SavePReg 15, 11
; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 18, implicit $vg
; CHECK-NEXT: frame-destroy SEH_AllocZ 18
; CHECK-NEXT: frame-destroy SEH_EpilogEnd
; CHECK-NEXT: RET_ReallyLR
$z8_z9_z10_z11 = IMPLICIT_DEF
$z12_z13_z14_z15 = IMPLICIT_DEF
$z16_z17_z18_z19 = IMPLICIT_DEF
$z20_z21_z22_z23 = IMPLICIT_DEF
$z24_z25_z26_z27 = IMPLICIT_DEF
$z28_z29_z30_z31 = IMPLICIT_DEF
$p4 = IMPLICIT_DEF
$p5 = IMPLICIT_DEF
$p6 = IMPLICIT_DEF
$p7 = IMPLICIT_DEF
$p8 = IMPLICIT_DEF
$p9 = IMPLICIT_DEF
$p10 = IMPLICIT_DEF
$p11 = IMPLICIT_DEF
$p12 = IMPLICIT_DEF
$p13 = IMPLICIT_DEF
$p14 = IMPLICIT_DEF
$p15 = IMPLICIT_DEF
RET_ReallyLR
...
---
name: frame_layout
stack:
- { id: 0, type: default, size: 32, alignment: 16, stack-id: scalable-vector }
- { id: 1, type: default, size: 4, alignment: 2, stack-id: scalable-vector }
- { id: 2, type: default, size: 16, alignment: 16, stack-id: scalable-vector }
- { id: 3, type: default, size: 2, alignment: 2, stack-id: scalable-vector }
- { id: 4, type: spill-slot, size: 16, alignment: 16, stack-id: scalable-vector }
- { id: 5, type: spill-slot, size: 2, alignment: 2, stack-id: scalable-vector }
body: |
bb.0.entry:
; Trigger some callee saves
; CHECK-LABEL: name: frame_layout
; CHECK: fixedStack:
; CHECK: liveins: $p4, $p15, $z8, $z23, $lr
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -3, implicit $vg
; CHECK-NEXT: frame-setup SEH_AllocZ 3
; CHECK-NEXT: frame-setup STR_PXI killed $p4, $sp, 0 :: (store (s16) into %stack.10)
; CHECK-NEXT: frame-setup SEH_SavePReg 4, 0
; CHECK-NEXT: frame-setup STR_PXI killed $p15, $sp, 1 :: (store (s16) into %stack.9)
; CHECK-NEXT: frame-setup SEH_SavePReg 15, 1
; CHECK-NEXT: frame-setup STR_ZXI killed $z8, $sp, 1 :: (store (s128) into %stack.8)
; CHECK-NEXT: frame-setup SEH_SaveZReg 8, 1
; CHECK-NEXT: frame-setup STR_ZXI killed $z23, $sp, 2 :: (store (s128) into %stack.7)
; CHECK-NEXT: frame-setup SEH_SaveZReg 23, 2
; CHECK-NEXT: early-clobber $sp = frame-setup STRXpre killed $lr, $sp, -16 :: (store (s64) into %stack.6)
; CHECK-NEXT: frame-setup SEH_SaveReg_X 30, -16
; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -7, implicit $vg
; CHECK-NEXT: frame-setup SEH_AllocZ 7
; CHECK-NEXT: frame-setup SEH_PrologEnd
; CHECK-NEXT: $z8 = IMPLICIT_DEF
; CHECK-NEXT: $z23 = IMPLICIT_DEF
; CHECK-NEXT: $p4 = IMPLICIT_DEF
; CHECK-NEXT: $p15 = IMPLICIT_DEF
; CHECK-NEXT: frame-destroy SEH_EpilogStart
; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 7, implicit $vg
; CHECK-NEXT: frame-destroy SEH_AllocZ 7
; CHECK-NEXT: $lr = frame-destroy LDRXui $sp, 0 :: (load (s64) from %stack.6)
; CHECK-NEXT: frame-destroy SEH_SaveReg 30, 0
; CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 16, 0
; CHECK-NEXT: frame-destroy SEH_StackAlloc 16
; CHECK-NEXT: $z8 = frame-destroy LDR_ZXI $sp, 1 :: (load (s128) from %stack.8)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 8, 1
; CHECK-NEXT: $z23 = frame-destroy LDR_ZXI $sp, 2 :: (load (s128) from %stack.7)
; CHECK-NEXT: frame-destroy SEH_SaveZReg 23, 2
; CHECK-NEXT: $p4 = frame-destroy LDR_PXI $sp, 0 :: (load (s16) from %stack.10)
; CHECK-NEXT: frame-destroy SEH_SavePReg 4, 0
; CHECK-NEXT: $p15 = frame-destroy LDR_PXI $sp, 1 :: (load (s16) from %stack.9)
; CHECK-NEXT: frame-destroy SEH_SavePReg 15, 1
; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 3, implicit $vg
; CHECK-NEXT: frame-destroy SEH_AllocZ 3
; CHECK-NEXT: frame-destroy SEH_EpilogEnd
; CHECK-NEXT: RET_ReallyLR
$z8 = IMPLICIT_DEF
$z23 = IMPLICIT_DEF
$p4 = IMPLICIT_DEF
$p15 = IMPLICIT_DEF
RET_ReallyLR
...