1368 lines · plain
1# RUN: llc -mattr=+sve -mtriple=aarch64-none-linux-gnu -run-pass=prologepilog %s -o - | FileCheck %s2# RUN: llc -mtriple=aarch64-none-linux-gnu -mattr=+sve -start-before=prologepilog %s -o - | FileCheck %s --check-prefix=ASM3# RUN: llc -mtriple=aarch64-none-linux-gnu -mattr=+sve -start-before=prologepilog %s -filetype=obj -o %t4# RUN: llvm-objdump --dwarf=frames %t | FileCheck %s --check-prefix=UNWINDINFO5# RUN: rm -rf %t6#7# Test allocation and deallocation of SVE objects on the stack,8# as well as using a combination of scalable and non-scalable9# offsets to access the SVE on the stack.10#11# SVE objects are allocated below the (scalar) callee saves,12# and above spills/locals and the alignment gap, e.g.13#14# +-------------+15# | stack arg |16# +-------------+ <- SP before call17# | 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-setup27#28--- |29 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 }45 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 scalable54# +----------+ <- SP55 56# CHECK-LABEL: name: test_allocate_sve57# CHECK: stackSize: 3258 59# CHECK: bb.0.entry:60# CHECK: liveins: $fp61# CHECK: early-clobber $sp = frame-setup STRXpre killed $[[SCRATCH:[a-z0-9]+]], $sp, -1662# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 1663# CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -1664# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 16, 065# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 3266# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -267# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape68 69# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 270# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 3271# CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 16, 072# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 1673# CHECK-NEXT: $sp, $[[SCRATCH]] = frame-destroy LDRXpost $sp, 1674# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 075# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w2976# CHECK-NEXT: RET_ReallyLR77 78# ASM-LABEL: test_allocate_sve:79# ASM: .cfi_def_cfa_offset 1680# ASM-NEXT: .cfi_offset w29, -1681# ASM: .cfi_def_cfa_offset 3282# ASM: .cfi_escape83# ASM-SAME: // sp + 32 + 16 * VG84# ASM: .cfi_def_cfa wsp, 3285# ASM: .cfi_def_cfa_offset 1686# ASM: .cfi_def_cfa_offset 087# ASM-NEXT: .cfi_restore w2988 89#90# UNWINDINFO: DW_CFA_def_cfa_offset: +1691# UNWINDINFO-NEXT: DW_CFA_offset: reg29 -1692# UNWINDINFO: DW_CFA_def_cfa_offset: +3293# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +32, DW_OP_bregx 0x2e +0, DW_OP_lit16, DW_OP_mul, DW_OP_plus94# UNWINDINFO: DW_CFA_def_cfa: reg31 +3295# UNWINDINFO: DW_CFA_def_cfa_offset: +1696# UNWINDINFO: DW_CFA_def_cfa_offset: +097# UNWINDINFO-NEXT: DW_CFA_restore: reg2998 99 100name: test_allocate_sve101stack:102 - { id: 0, stack-id: scalable-vector, size: 18, alignment: 2 }103 - { id: 1, stack-id: default, size: 16, alignment: 8 }104body: |105 bb.0.entry:106 RET_ReallyLR107---108...109# +----------+110# | x20, x21 | // callee saves111# |scratchreg| // x29 is used as scratch reg.112# +----------+113# | %stack.0 | // scalable objects114# +----------+115# | %stack.1 | // not scalable116# +----------+ <- SP117 118# CHECK-LABEL: name: test_allocate_sve_gpr_callee_saves119# CHECK: stackSize: 48120 121# CHECK: bb.0.entry:122# CHECK-NEXT: liveins:123# CHECK-NEXT: {{ $}}124# CHECK-NEXT: $sp = frame-setup STRXpre killed $[[SCRATCH:[a-z0-9]+]], $sp, -32125# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 32126# CHECK-NEXT: frame-setup STPXi killed $x21, killed $x20, $sp, 2127# CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w20, -8128# CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w21, -16129# CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -32130# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 16, 0131# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 48132# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -2133# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape134 135#136# CHECK-NEXT: $x20 = IMPLICIT_DEF137# CHECK-NEXT: $x21 = IMPLICIT_DEF138# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 2139# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 48140# CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 16, 0141# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 32142# CHECK-NEXT: $x21, $x20 = frame-destroy LDPXi $sp, 2143# CHECK-NEXT: $sp, $[[SCRATCH]] = frame-destroy LDRXpost $sp, 32144# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0145# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w20146# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w21147# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29148# CHECK-NEXT: RET_ReallyLR149#150# ASM-LABEL: test_allocate_sve_gpr_callee_saves:151# ASM: .cfi_def_cfa_offset 32152# ASM: .cfi_offset w20, -8153# ASM-NEXT: .cfi_offset w21, -16154# ASM-NEXT: .cfi_offset w29, -32155# ASM: .cfi_def_cfa_offset 48156# ASM: .cfi_escape157# ASM-SAME: // sp + 48 + 16 * VG158#159# ASM: .cfi_def_cfa wsp, 48160# ASM: .cfi_def_cfa_offset 32161# ASM: .cfi_def_cfa_offset 0162# ASM-NEXT: .cfi_restore w20163# ASM-NEXT: .cfi_restore w21164# ASM-NEXT: .cfi_restore w29165 166#167# UNWINDINFO: DW_CFA_def_cfa_offset: +32168# UNWINDINFO: DW_CFA_offset: reg20 -8169# UNWINDINFO-NEXT: DW_CFA_offset: reg21 -16170# UNWINDINFO-NEXT: DW_CFA_offset: reg29 -32171# UNWINDINFO: DW_CFA_def_cfa_offset: +48172# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +48, DW_OP_bregx 0x2e +0, DW_OP_lit16, DW_OP_mul, DW_OP_plus173# UNWINDINFO: DW_CFA_def_cfa: reg31 +48174# UNWINDINFO: DW_CFA_def_cfa_offset: +32175# UNWINDINFO: DW_CFA_def_cfa_offset: +0176# UNWINDINFO-NEXT: DW_CFA_restore: reg20177# UNWINDINFO-NEXT: DW_CFA_restore: reg21178# UNWINDINFO-NEXT: DW_CFA_restore: reg29179 180name: test_allocate_sve_gpr_callee_saves181stack:182 - { id: 0, stack-id: scalable-vector, size: 18, alignment: 2 }183 - { id: 1, stack-id: default, size: 16, alignment: 8 }184body: |185 bb.0.entry:186 $x20 = IMPLICIT_DEF187 $x21 = IMPLICIT_DEF188 RET_ReallyLR189---190...191# +----------+192# | lr, fp | // frame record193# +----------+ <- FP194# | %stack.0 | // scalable objects195# +----------+196# |//////////| // alignment gap197# | %stack.1 | // not scalable198# +----------+ <- SP199# CHECK-LABEL: name: test_allocate_sve_gpr_realigned200# CHECK: stackSize: 32201 202# CHECK: bb.0.entry:203# CHECK-NEXT: liveins:204# CHECK-NEXT: {{ $}}205# CHECK-NEXT: $sp = frame-setup STPXpre killed $fp, killed $lr, $sp, -2206# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16207# CHECK-NEXT: $fp = frame-setup ADDXri $sp, 0, 0208# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa $w29, 16209# CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w30, -8210# CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16211# CHECK-NEXT: $[[TMP:x[0-9]+]] = frame-setup SUBXri $sp, 16, 0212# CHECK-NEXT: $[[TMP]] = frame-setup ADDVL_XXI $[[TMP]], -2213# CHECK-NEXT: $sp = frame-setup ANDXri killed $[[TMP]]214# CHECK-NEXT: $sp = frame-destroy ADDXri $fp, 0, 0215# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 16216# CHECK-NEXT: $sp, $fp, $lr = frame-destroy LDPXpost $sp, 2217# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0218# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w30219# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29220# CHECK-NEXT: RET_ReallyLR221#222# ASM-LABEL: test_allocate_sve_gpr_realigned:223# ASM: .cfi_def_cfa_offset 16224# ASM: .cfi_def_cfa w29, 16225# ASM-NEXT: .cfi_offset w30, -8226# ASM-NEXT: .cfi_offset w29, -16227#228# ASM: .cfi_def_cfa wsp, 16229# ASM: .cfi_def_cfa_offset 0230# ASM-NEXT: .cfi_restore w30231# ASM-NEXT: .cfi_restore w29232 233#234# UNWINDINFO: DW_CFA_def_cfa_offset: +16235# UNWINDINFO: DW_CFA_def_cfa: reg29 +16236# UNWINDINFO-NEXT: DW_CFA_offset: reg30 -8237# UNWINDINFO-NEXT: DW_CFA_offset: reg29 -16238#239# UNWINDINFO: DW_CFA_def_cfa: reg31 +16240# UNWINDINFO: DW_CFA_def_cfa_offset: +0241# UNWINDINFO-NEXT: DW_CFA_restore: reg30242# UNWINDINFO-NEXT: DW_CFA_restore: reg29243 244 245name: test_allocate_sve_gpr_realigned246stack:247 - { id: 0, stack-id: scalable-vector, size: 18, alignment: 2 }248 - { id: 1, stack-id: default, size: 16, alignment: 32 }249body: |250 bb.0.entry:251 RET_ReallyLR252---253...254# +----------+255# | x20, x21 | // callee saves256# +----------+257# | %stack.0 | // scalable @ SP + 16b + 32 scalable bytes258# | %stack.1 | // scalable @ SP + 16b + 16 scalable bytes259# | %stack.2 | // scalable @ SP + 16b + 14 scalable bytes260# +----------+261# | %stack.3 | // not scalable262# +----------+ <- SP263 264# CHECK-LABEL: name: test_address_sve265# CHECK: stackSize: 32266 267# CHECK: bb.0.entry:268# CHECK-NEXT: liveins:269# CHECK-NEXT: {{ $}}270# CHECK-NEXT: $sp = frame-setup STRXpre killed $[[SCRATCH:[a-z0-9]+]], $sp, -16271# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16272# CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16273# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 16, 0274# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 32275# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -3276# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape277 278# CHECK-NEXT: $[[TMP:x[0-9]+]] = ADDXri $sp, 16279# CHECK-NEXT: STR_ZXI $z0, killed $[[TMP]], 2280# CHECK-NEXT: $[[TMP:x[0-9]+]] = ADDXri $sp, 16281# CHECK-NEXT: STR_ZXI $z1, killed $[[TMP]], 1282# CHECK-NEXT: $[[TMP:x[0-9]+]] = ADDXri $sp, 16283# CHECK-NEXT: STR_PXI $p0, killed $[[TMP]], 7284 285# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 3286# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 32287 288# CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 16, 0289# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 16290# CHECK-NEXT: $sp, $[[SCRATCH]] = frame-destroy LDRXpost $sp, 16291# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0292# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29293# CHECK-NEXT: RET_ReallyLR294#295# ASM-LABEL: test_address_sve:296# ASM: .cfi_def_cfa_offset 16297# ASM-NEXT: .cfi_offset w29, -16298# ASM: .cfi_def_cfa_offset 32299# ASM: .cfi_escape300# ASM-SAME: // sp + 32 + 24 * VG301#302# ASM: .cfi_def_cfa wsp, 32303# ASM: .cfi_def_cfa_offset 16304# ASM: .cfi_def_cfa_offset 0305# ASM-NEXT: .cfi_restore w29306#307# UNWINDINFO: DW_CFA_def_cfa_offset: +16308# UNWINDINFO-NEXT: DW_CFA_offset: reg29 -16309# UNWINDINFO: DW_CFA_def_cfa_offset: +32310# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +32, DW_OP_bregx 0x2e +0, DW_OP_lit24, DW_OP_mul, DW_OP_plus311#312# UNWINDINFO: DW_CFA_def_cfa: reg31 +32313# UNWINDINFO: DW_CFA_def_cfa_offset: +16314# UNWINDINFO: DW_CFA_def_cfa_offset: +0315# UNWINDINFO-NEXT: DW_CFA_restore: reg29316 317 318name: test_address_sve319frameInfo:320 maxAlignment: 16321stack:322 - { id: 0, stack-id: scalable-vector, size: 16, alignment: 8 }323 - { id: 1, stack-id: scalable-vector, size: 16, alignment: 8 }324 - { id: 2, stack-id: scalable-vector, size: 2, alignment: 2 }325 - { id: 3, stack-id: default, size: 16, alignment: 8 }326body: |327 bb.0.entry:328 liveins: $z0, $z1, $p0329 330 STR_ZXI $z0, %stack.0, 0331 STR_ZXI $z1, %stack.1, 0332 STR_PXI $p0, %stack.2, 0333 334 RET_ReallyLR335---336...337# +-----------+338# | x20, x21 | // callee saves339# | lr, fp | // frame record340# +-----------+ <- FP341# | %stack.0 | // scalable @ FP - 16 scalable bytes342# | %stack.1 | // scalable @ FP - 32 scalable bytes343# | %stack.2 | // scalable @ FP - 34 scalable bytes344# +-----------+345# | %stack.3 | // not scalable346# +-----------+ <- SP347 348# CHECK-LABEL: name: test_address_sve_fp349# CHECK: stackSize: 32350 351# CHECK: bb.0.entry:352# CHECK-NEXT: liveins:353# CHECK-NEXT: {{ $}}354# CHECK-NEXT: $sp = frame-setup STPXpre killed $fp, killed $lr, $sp, -2355# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16356# CHECK-NEXT: $fp = frame-setup ADDXri $sp, 0, 0357# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa $w29, 16358# CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w30, -8359# CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16360# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 16, 0361# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -3362 363# CHECK-NEXT: STR_ZXI $z0, $fp, -1364# CHECK-NEXT: STR_ZXI $z1, $fp, -2365# CHECK-NEXT: STR_PXI $p0, $fp, -17366 367# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 3368# CHECK: $sp = frame-destroy ADDXri $sp, 16, 0369# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 16370# CHECK-NEXT: $sp, $fp, $lr = frame-destroy LDPXpost $sp, 2371# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0372# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w30373# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29374# CHECK-NEXT: RET_ReallyLR375#376# ASM-LABEL: test_address_sve_fp:377# ASM: .cfi_def_cfa_offset 16378# ASM: .cfi_def_cfa w29, 16379# ASM-NEXT: .cfi_offset w30, -8380# ASM-NEXT: .cfi_offset w29, -16381#382# ASM: .cfi_def_cfa wsp, 16383# ASM: .cfi_def_cfa_offset 0384# ASM-NEXT: .cfi_restore w30385# ASM-NEXT: .cfi_restore w29386#387# UNWINDINFO: DW_CFA_def_cfa_offset: +16388# UNWINDINFO: DW_CFA_def_cfa: reg29 +16389# UNWINDINFO-NEXT: DW_CFA_offset: reg30 -8390# UNWINDINFO-NEXT: DW_CFA_offset: reg29 -16391#392# UNWINDINFO: DW_CFA_def_cfa: reg31 +16393# UNWINDINFO: DW_CFA_def_cfa_offset: +0394# UNWINDINFO-NEXT: DW_CFA_restore: reg30395# UNWINDINFO-NEXT: DW_CFA_restore: reg29396 397name: test_address_sve_fp398frameInfo:399 maxAlignment: 16400 isFrameAddressTaken: true401stack:402 - { id: 0, stack-id: scalable-vector, size: 16, alignment: 8 }403 - { id: 1, stack-id: scalable-vector, size: 16, alignment: 8 }404 - { id: 2, stack-id: scalable-vector, size: 2, alignment: 2 }405 - { id: 3, stack-id: default, size: 16, alignment: 8 }406body: |407 bb.0.entry:408 liveins: $z0, $z1, $p0409 410 STR_ZXI $z0, %stack.0, 0411 STR_ZXI $z1, %stack.1, 0412 STR_PXI $p0, %stack.2, 0413 414 RET_ReallyLR415---416...417# +-----------+418# | %fstack.1 | // stack arg @ SP + 16 scalable bytes + 32 bytes.419# +-----------+420# |callee save| // register saved as scratch reg.421# +-----------+422# | %stack.0 | // vector of 16 scalable bytes423# +---------- +424# | %stack.1 | // not scalable, 16 bytes425# +-----------+ <- SP426# CHECK-LABEL: name: test_stack_arg_sve427# CHECK: stackSize: 32428 429# CHECK: bb.0.entry:430# CHECK-NEXT: liveins:431# CHECK-NEXT: {{ $}}432# CHECK-NEXT: $sp = frame-setup STRXpre killed $[[SCRATCH:[a-z0-9]+]], $sp, -16433# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16434# CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16435 436# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 16, 0437# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 32438# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -1439# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape440# CHECK: $[[TMP:x[0-9]+]] = ADDVL_XXI $sp, 1441# CHECK-NEXT: $x0 = LDRXui killed $[[TMP]], 4442 443# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 1444# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 32445# CHECK-NEXT: $sp = frame-destroy ADDXri $sp, 16, 0446# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 16447# CHECK-NEXT: $sp, $[[SCRATCH]] = frame-destroy LDRXpost $sp, 16448# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0449# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29450# CHECK-NEXT: RET_ReallyLR451#452# ASM-LABEL: test_stack_arg_sve:453# ASM: .cfi_def_cfa_offset 16454# ASM-NEXT: .cfi_offset w29, -16455# ASM: .cfi_def_cfa_offset 32456# ASM: .cfi_escape457# ASM-SAME: // sp + 32 + 8 * VG458#459# ASM: .cfi_def_cfa wsp, 32460# ASM: .cfi_def_cfa_offset 16461# ASM: .cfi_def_cfa_offset 0462# ASM-NEXT: .cfi_restore w29463 464# UNWINDINFO: DW_CFA_def_cfa_offset: +16465# UNWINDINFO-NEXT: DW_CFA_offset: reg29 -16466# UNWINDINFO: DW_CFA_def_cfa_offset: +32467# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +32, DW_OP_bregx 0x2e +0, DW_OP_lit8, DW_OP_mul, DW_OP_plus468#469# UNWINDINFO: DW_CFA_def_cfa: reg31 +32470# UNWINDINFO: DW_CFA_def_cfa_offset: +16471# UNWINDINFO: DW_CFA_def_cfa_offset: +0472# UNWINDINFO-NEXT: DW_CFA_restore: reg29473 474name: test_stack_arg_sve475fixedStack:476 - { id: 0, stack-id: default, size: 16, alignment: 16, offset: 0 }477stack:478 - { id: 0, stack-id: scalable-vector, size: 16, alignment: 16 }479 - { id: 1, stack-id: default, size: 16, alignment: 16 }480body: |481 bb.0.entry:482 liveins: $x0483 484 $x0 = LDRXui %fixed-stack.0, 0485 RET_ReallyLR486---487...488# Test that the address to access an SVE data vector at an offset that489# does not fit its immediate, is correctly materialized.490# +----------+491# |calleesave| // register saved as scratch reg.492# +----------+493# | %stack.0 | // one SVE data object @ SP + 256 scalable bytes.494# |::::::::::|495# |: :|496# |:%stack.1:| // Large object497# |: :|498# |::::::::::|499# +----------+ <- SP500# CHECK-LABEL: name: test_address_sve_out_of_range501# CHECK: stackSize: 16502 503# CHECK: bb.0.entry:504# CHECK-NEXT: liveins:505# CHECK-NEXT: {{ $}}506# CHECK-NEXT: $sp = frame-setup STRXpre killed $[[SCRATCH:[a-z0-9]+]], $sp, -16507# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16508# CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16509# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32510# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape511# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32512# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape513# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32514# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape515# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32516# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape517# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32518# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape519# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32520# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape521# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32522# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape523# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32524# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape525# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -1526# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape527 528# CHECK-NEXT: $[[TMP2:x[0-9]+]] = ADDVL_XXI $sp, 1529# CHECK-NEXT: STR_ZXI $z0, killed $[[TMP2]], 255530 531# CHECK-NEXT: $[[TMP2:x[0-9]+]] = ADDPL_XXI $sp, 1532# CHECK-NEXT: STR_PXI $p0, killed $[[TMP2]], 255533 534# CHECK: $sp = frame-destroy ADDVL_XXI $sp, 31535# CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape536# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31537# CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape538# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31539# CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape540# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31541# CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape542# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31543# CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape544# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31545# CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape546# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31547# CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape548# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31549# CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape550# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 9551# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 16552# CHECK-NEXT: $sp, $[[SCRATCH]] = frame-destroy LDRXpost $sp, 16553# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0554# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29555# CHECK-NEXT: RET_ReallyLR556#557# ASM-LABEL: test_address_sve_out_of_range:558# ASM: .cfi_def_cfa_offset 16559# ASM-NEXT: .cfi_offset w29, -16560# ASM: .cfi_escape561# ASM-SAME: // sp + 16 + 256 * VG562# ASM: .cfi_escape563# ASM-SAME: // sp + 16 + 512 * VG564# ASM: .cfi_escape565# ASM-SAME: // sp + 16 + 768 * VG566# ASM: .cfi_escape567# ASM-SAME: // sp + 16 + 1024 * VG568# ASM: .cfi_escape569# ASM-SAME: // sp + 16 + 1280 * VG570# ASM: .cfi_escape571# ASM-SAME: // sp + 16 + 1536 * VG572# ASM: .cfi_escape573# ASM-SAME: // sp + 16 + 1792 * VG574# ASM: .cfi_escape575# ASM-SAME: // sp + 16 + 2048 * VG576# ASM: .cfi_escape577# ASM-SAME: // sp + 16 + 2056 * VG578#579# ASM: .cfi_escape580# ASM-SAME: // sp + 16 + 1808 * VG581# ASM: .cfi_escape582# ASM-SAME: // sp + 16 + 1560 * VG583# ASM: .cfi_escape584# ASM-SAME: // sp + 16 + 1312 * VG585# ASM: .cfi_escape586# ASM-SAME: // sp + 16 + 1064 * VG587# ASM: .cfi_escape588# ASM-SAME: // sp + 16 + 816 * VG589# ASM: .cfi_escape590# ASM-SAME: // sp + 16 + 568 * VG591# ASM: .cfi_escape592# ASM-SAME: // sp + 16 + 320 * VG593# ASM: .cfi_escape594# ASM-SAME: // sp + 16 + 72 * VG595# ASM: .cfi_def_cfa wsp, 16596# ASM: .cfi_def_cfa_offset 0597# ASM-NEXT: .cfi_restore w29598 599# UNWINDINFO: DW_CFA_def_cfa_offset: +16600# UNWINDINFO-NEXT: DW_CFA_offset: reg29 -16601# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +16, DW_OP_bregx 0x2e +0, DW_OP_consts +256, DW_OP_mul, DW_OP_plus602# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +16, DW_OP_bregx 0x2e +0, DW_OP_consts +512, DW_OP_mul, DW_OP_plus603# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +16, DW_OP_bregx 0x2e +0, DW_OP_consts +768, DW_OP_mul, DW_OP_plus604# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +16, DW_OP_bregx 0x2e +0, DW_OP_consts +1024, DW_OP_mul, DW_OP_plus605# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +16, DW_OP_bregx 0x2e +0, DW_OP_consts +1280, DW_OP_mul, DW_OP_plus606# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +16, DW_OP_bregx 0x2e +0, DW_OP_consts +1536, DW_OP_mul, DW_OP_plus607# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +16, DW_OP_bregx 0x2e +0, DW_OP_consts +1792, DW_OP_mul, DW_OP_plus608# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +16, DW_OP_bregx 0x2e +0, DW_OP_consts +2048, DW_OP_mul, DW_OP_plus609# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +16, DW_OP_bregx 0x2e +0, DW_OP_consts +2056, DW_OP_mul, DW_OP_plus610#611# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +16, DW_OP_bregx 0x2e +0, DW_OP_consts +1808, DW_OP_mul, DW_OP_plus612# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +16, DW_OP_bregx 0x2e +0, DW_OP_consts +1560, DW_OP_mul, DW_OP_plus613# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +16, DW_OP_bregx 0x2e +0, DW_OP_consts +1312, DW_OP_mul, DW_OP_plus614# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +16, DW_OP_bregx 0x2e +0, DW_OP_consts +1064, DW_OP_mul, DW_OP_plus615# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +16, DW_OP_bregx 0x2e +0, DW_OP_consts +816, DW_OP_mul, DW_OP_plus616# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +16, DW_OP_bregx 0x2e +0, DW_OP_consts +568, DW_OP_mul, DW_OP_plus617# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +16, DW_OP_bregx 0x2e +0, DW_OP_consts +320, DW_OP_mul, DW_OP_plus618# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +16, DW_OP_bregx 0x2e +0, DW_OP_consts +72, DW_OP_mul, DW_OP_plus619# UNWINDINFO: DW_CFA_def_cfa: reg31 +16620# UNWINDINFO: DW_CFA_def_cfa_offset: +0621# UNWINDINFO-NEXT: DW_CFA_restore: reg29622 623name: test_address_sve_out_of_range624frameInfo:625 maxAlignment: 16626stack:627 - { id: 0, stack-id: scalable-vector, size: 16, alignment: 16 }628 - { id: 1, stack-id: scalable-vector, size: 3584, alignment: 16 }629 - { id: 2, stack-id: scalable-vector, size: 512, alignment: 16 }630 631body: |632 bb.0.entry:633 liveins: $z0, $p0634 635 STR_ZXI $z0, %stack.0, 0636 STR_PXI $p0, %stack.1, 0637 638 RET_ReallyLR639---640...641# Test that non-SVE objects are accessed from BP when there are642# variable length arrays, because it will be more expensive to643# access from the FP when there are also SVE objects on the stack.644#645# +----------+ <- FP646# | %stack.0 | // 16 scalable bytes647# +----------+ <- @FP - 16 scalable bytes648# | %stack.1 | // 16 bytes649# +----------+ <- @BP650# : %stack.2 : // variable length651# +----------+ <- SP652 653# CHECK-LABEL: name: test_address_gpr_vla654# CHECK: bb.0.entry:655# CHECK-NEXT: liveins:656# CHECK-NEXT: {{ $}}657# CHECK-NEXT: early-clobber $sp = frame-setup STPXpre killed $fp, killed $lr, $sp, -4658# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 32659# CHECK-NEXT: frame-setup STRXui killed $x19, $sp, 2660# CHECK-NEXT: $fp = frame-setup ADDXri $sp, 0, 0661# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa $w29, 32662# CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w19, -16663# CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w30, -24664# CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -32665# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 16, 0666# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -1667# CHECK-NEXT: $x19 = ADDXri $sp, 0, 0668# CHECK-NEXT: STRXui $xzr, $x19, 0669# CHECK-NEXT: $sp = frame-destroy ADDXri $fp, 0, 0670# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 32671# CHECK-NEXT: $x19 = frame-destroy LDRXui $sp, 2672# CHECK-NEXT: early-clobber $sp, $fp, $lr = frame-destroy LDPXpost $sp, 4673# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0674# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w19675# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w30676# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29677# CHECK-NEXT: RET_ReallyLR678#679# ASM-LABEL: test_address_gpr_vla:680# ASM: .cfi_def_cfa_offset 32681# ASM: .cfi_def_cfa w29, 32682# ASM-NEXT: .cfi_offset w19, -16683# ASM-NEXT: .cfi_offset w30, -24684# ASM-NEXT: .cfi_offset w29, -32685#686# ASM: .cfi_def_cfa wsp, 32687# ASM: .cfi_def_cfa_offset 0688# ASM-NEXT: .cfi_restore w19689# ASM-NEXT: .cfi_restore w30690# ASM-NEXT: .cfi_restore w29691 692# UNWINDINFO: DW_CFA_def_cfa_offset: +32693# UNWINDINFO: DW_CFA_def_cfa: reg29 +32694# UNWINDINFO-NEXT: DW_CFA_offset: reg19 -16695# UNWINDINFO-NEXT: DW_CFA_offset: reg30 -24696# UNWINDINFO-NEXT: DW_CFA_offset: reg29 -32697#698# UNWINDINFO: DW_CFA_def_cfa: reg31 +32699# UNWINDINFO: DW_CFA_def_cfa_offset: +0700# UNWINDINFO-NEXT: DW_CFA_restore: reg19701# UNWINDINFO-NEXT: DW_CFA_restore: reg30702# UNWINDINFO-NEXT: DW_CFA_restore: reg29703 704name: test_address_gpr_vla705frameInfo:706 maxAlignment: 16707stack:708 - { id: 0, stack-id: scalable-vector, size: 16, alignment: 8 }709 - { id: 1, stack-id: default, size: 16, alignment: 8 }710 - { id: 2, stack-id: default, type: variable-sized }711body: |712 bb.0.entry:713 liveins: $xzr714 715 STRXui $xzr, %stack.1, 0716 717 RET_ReallyLR718---719...720# CHECK-LABEL: name: save_restore_pregs_sve721# CHECK: $sp = frame-setup STRXpre killed $fp, $sp, -16722# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16723# CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16724# CHECK: $sp = frame-setup ADDVL_XXI $sp, -1725# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape726# CHECK: frame-setup STR_PXI killed $p6, $sp, 5727# CHECK: frame-setup STR_PXI killed $p5, $sp, 6728# CHECK: frame-setup STR_PXI killed $p4, $sp, 7729# CHECK: $sp = frame-setup SUBXri $sp, 32, 0730# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape731 732# CHECK: $sp = frame-destroy ADDXri $sp, 32, 0733# CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape734# CHECK: $p6 = frame-destroy LDR_PXI $sp, 5735# CHECK: $p5 = frame-destroy LDR_PXI $sp, 6736# CHECK: $p4 = frame-destroy LDR_PXI $sp, 7737# CHECK: $sp = frame-destroy ADDVL_XXI $sp, 1738# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 16739# CHECK-NEXT: early-clobber $sp, $fp = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.4)740# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0741# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29742# CHECK-NEXT: RET_ReallyLR743 744#745# ASM-LABEL: save_restore_pregs_sve:746# ASM: .cfi_def_cfa_offset 16747# ASM-NEXT: .cfi_offset w29, -16748# ASM: .cfi_escape749# ASM-SAME: // sp + 16 + 8 * VG750# ASM: .cfi_escape751# ASM-SAME: // sp + 48 + 8 * VG752#753# ASM: .cfi_escape754# ASM-SAME: // sp + 16 + 8 * VG755# ASM: .cfi_def_cfa wsp, 16756# ASM: .cfi_def_cfa_offset 0757# ASM-NEXT: .cfi_restore w29758 759# UNWINDINFO: DW_CFA_def_cfa_offset: +16760# UNWINDINFO: DW_CFA_offset: reg29 -16761# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +16, DW_OP_bregx 0x2e +0, DW_OP_lit8, DW_OP_mul, DW_OP_plus762# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +48, DW_OP_bregx 0x2e +0, DW_OP_lit8, DW_OP_mul, DW_OP_plus763#764# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +16, DW_OP_bregx 0x2e +0, DW_OP_lit8, DW_OP_mul, DW_OP_plus765# UNWINDINFO: DW_CFA_def_cfa: reg31 +16766# UNWINDINFO: DW_CFA_def_cfa_offset: +0767# UNWINDINFO-NEXT: DW_CFA_restore: reg29768 769name: save_restore_pregs_sve770stack:771 - { id: 0, stack-id: default, size: 32, alignment: 16 }772body: |773 bb.0.entry:774 775 $p4 = IMPLICIT_DEF776 $p5 = IMPLICIT_DEF777 $p6 = IMPLICIT_DEF778 779 RET_ReallyLR780---781...782# CHECK-LABEL: name: save_restore_zregs_sve783# CHECK: $sp = frame-setup STRXpre killed $fp, $sp, -16784# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16785# CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16786# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -3787# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape788# CHECK-NEXT: frame-setup STR_ZXI killed $z10, $sp, 0789# CHECK-NEXT: frame-setup STR_ZXI killed $z9, $sp, 1790# CHECK-NEXT: frame-setup STR_ZXI killed $z8, $sp, 2791# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape792# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape793# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape794# CHECK-NEXT: $sp = frame-setup SUBXri $sp, 32, 0795# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape796 797# CHECK: $sp = frame-destroy ADDXri $sp, 32, 0798# CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape799# CHECK-NEXT: $z10 = frame-destroy LDR_ZXI $sp, 0800# CHECK-NEXT: $z9 = frame-destroy LDR_ZXI $sp, 1801# CHECK-NEXT: $z8 = frame-destroy LDR_ZXI $sp, 2802# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 3803# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 16804# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z8805# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z9806# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z10807# CHECK-NEXT: $sp, $fp = frame-destroy LDRXpost $sp, 16808# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0809# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29810# CHECK-NEXT: RET_ReallyLR811#812# ASM-LABEL: save_restore_zregs_sve:813# ASM: .cfi_def_cfa_offset 16814# ASM-NEXT: .cfi_offset w29, -16815# ASM: .cfi_escape816# ASM-SAME: // sp + 16 + 24 * VG817# ASM: .cfi_escape818# ASM-SAME: // $d8 @ cfa - 8 * VG - 16819# ASM-NEXT: .cfi_escape820# ASM-SAME: // $d9 @ cfa - 16 * VG - 16821# ASM-NEXT: .cfi_escape822# ASM-SAME: // $d10 @ cfa - 24 * VG - 16823# ASM: .cfi_escape824# ASM-SAME: // sp + 48 + 24 * VG825#826# ASM: .cfi_escape827# ASM-SAME: // sp + 16 + 24 * VG828# ASM: .cfi_def_cfa wsp, 16829# ASM-NEXT: .cfi_restore z8830# ASM-NEXT: .cfi_restore z9831# ASM-NEXT: .cfi_restore z10832# ASM: .cfi_def_cfa_offset 0833# ASM-NEXT: .cfi_restore w29834 835# UNWINDINFO: DW_CFA_def_cfa_offset: +16836# UNWINDINFO-NEXT: DW_CFA_offset: reg29 -16837# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +16, DW_OP_bregx 0x2e +0, DW_OP_lit24, DW_OP_mul, DW_OP_plus838# UNWINDINFO: DW_CFA_expression: reg72 DW_OP_bregx 0x2e +0, DW_OP_consts -8, DW_OP_mul, DW_OP_plus, DW_OP_lit16, DW_OP_minus839# UNWINDINFO-NEXT: DW_CFA_expression: reg73 DW_OP_bregx 0x2e +0, DW_OP_consts -16, DW_OP_mul, DW_OP_plus, DW_OP_lit16, DW_OP_minus840# UNWINDINFO-NEXT: DW_CFA_expression: reg74 DW_OP_bregx 0x2e +0, DW_OP_consts -24, DW_OP_mul, DW_OP_plus, DW_OP_lit16, DW_OP_minus841# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +48, DW_OP_bregx 0x2e +0, DW_OP_lit24, DW_OP_mul, DW_OP_plus842#843# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +16, DW_OP_bregx 0x2e +0, DW_OP_lit24, DW_OP_mul, DW_OP_plus844# UNWINDINFO: DW_CFA_def_cfa: reg31 +16845# UNWINDINFO-NEXT: DW_CFA_restore_extended: reg104846# UNWINDINFO-NEXT: DW_CFA_restore_extended: reg105847# UNWINDINFO-NEXT: DW_CFA_restore_extended: reg106848# UNWINDINFO: DW_CFA_def_cfa_offset: +0849# UNWINDINFO-NEXT: DW_CFA_restore: reg29850 851name: save_restore_zregs_sve852stack:853 - { id: 0, stack-id: default, size: 32, alignment: 16 }854body: |855 bb.0.entry:856 857 $z8 = IMPLICIT_DEF858 $z9 = IMPLICIT_DEF859 $z10 = IMPLICIT_DEF860 861 RET_ReallyLR862---863...864# Test allocation/deallocation of the stack frame together with the865# saving/restoring of callee save registers. Fixed-stack objects866# are allocated before the callee-saves.867# This also adds some non-SVE callee-saves, to ensure that those are868# paired correctly.869#870# CHECK-LABEL: name: save_restore_sve871# CHECK: $sp = frame-setup STPXpre killed ${{[a-z0-9]+}}, killed $x21, $sp, -4872# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 32873# CHECK-NEXT: frame-setup STPXi killed $x20, killed $x19, $sp, 2874# CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w19, -8875# CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w20, -16876# CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w21, -24877# CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -32878 879# CHECK: $sp = frame-setup ADDVL_XXI $sp, -18880# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape881# CHECK: frame-setup STR_PXI killed $p15, $sp, 4882# CHECK: frame-setup STR_PXI killed $p14, $sp, 5883# CHECK: frame-setup STR_PXI killed $p5, $sp, 14884# CHECK: frame-setup STR_PXI killed $p4, $sp, 15885# CHECK: frame-setup STR_ZXI killed $z23, $sp, 2886# CHECK: frame-setup STR_ZXI killed $z22, $sp, 3887# CHECK: frame-setup STR_ZXI killed $z9, $sp, 16888# CHECK: frame-setup STR_ZXI killed $z8, $sp, 17889# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape890# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape891# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape892# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape893# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape894# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape895# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape896# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape897# CHECK: $sp = frame-setup SUBXri $sp, 32, 0898# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape899# CHECK: $sp = frame-setup ADDVL_XXI $sp, -1900# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape901 902# CHECK: $sp = frame-destroy ADDXri $sp, 32, 0903# CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape904# CHECK: $sp = frame-destroy ADDVL_XXI $sp, 1905# CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape906# CHECK: $z23 = frame-destroy LDR_ZXI $sp, 2907# CHECK: $z22 = frame-destroy LDR_ZXI $sp, 3908# CHECK: $z9 = frame-destroy LDR_ZXI $sp, 16909# CHECK: $z8 = frame-destroy LDR_ZXI $sp, 17910# CHECK: $p15 = frame-destroy LDR_PXI $sp, 4911# CHECK: $p14 = frame-destroy LDR_PXI $sp, 5912# CHECK: $p5 = frame-destroy LDR_PXI $sp, 14913# CHECK: $p4 = frame-destroy LDR_PXI $sp, 15914# CHECK: $sp = frame-destroy ADDVL_XXI $sp, 18915# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 32916# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z8917# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z9918# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z10919# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z11920# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z12921# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z13922# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z14923# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z15924 925# CHECK: $x20, $x19 = frame-destroy LDPXi $sp, 2926# CHECK: $sp, ${{[a-z0-9]+}}, $x21 = frame-destroy LDPXpost $sp, 4927# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0928# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w19929# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w20930# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w21931# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29932 933# CHECK-NEXT: RET_ReallyLR934#935# ASM-LABEL: save_restore_sve:936# ASM: .cfi_def_cfa_offset 32937# ASM: .cfi_offset w19, -8938# ASM-NEXT: .cfi_offset w20, -16939# ASM-NEXT: .cfi_offset w21, -24940# ASM-NEXT: .cfi_offset w29, -32941# ASM: .cfi_escape942# ASM-SAME: // sp + 32 + 144 * VG943# ASM: .cfi_escape944# ASM-SAME: // $d8 @ cfa - 8 * VG - 32945# ASM-NEXT: .cfi_escape946# ASM-SAME: // $d9 @ cfa - 16 * VG - 32947# ASM-NEXT: .cfi_escape948# ASM-SAME: // $d10 @ cfa - 24 * VG - 32949# ASM-NEXT: .cfi_escape950# ASM-SAME: // $d11 @ cfa - 32 * VG - 32951# ASM-NEXT: .cfi_escape952# ASM-SAME: // $d12 @ cfa - 40 * VG - 32953# ASM-NEXT: .cfi_escape954# ASM-SAME: // $d13 @ cfa - 48 * VG - 32955# ASM-NEXT: .cfi_escape956# ASM-SAME: // $d14 @ cfa - 56 * VG - 32957# ASM-NEXT: .cfi_escape958# ASM-SAME: // $d15 @ cfa - 64 * VG - 32959# ASM: .cfi_escape960# ASM-SAME: // sp + 64 + 144 * VG961# ASM: .cfi_escape962# ASM-SAME: // sp + 64 + 152 * VG963#964# ASM: .cfi_escape965# ASM-SAME: // sp + 32 + 152 * VG966# ASM: .cfi_escape967# ASM-SAME: // sp + 32 + 144 * VG968# ASM: .cfi_def_cfa wsp, 32969# ASM-NEXT: .cfi_restore z8970# ASM-NEXT: .cfi_restore z9971# ASM-NEXT: .cfi_restore z10972# ASM-NEXT: .cfi_restore z11973# ASM-NEXT: .cfi_restore z12974# ASM-NEXT: .cfi_restore z13975# ASM-NEXT: .cfi_restore z14976# ASM-NEXT: .cfi_restore z15977# ASM: .cfi_def_cfa_offset 0978# ASM-NEXT: .cfi_restore w19979# ASM-NEXT: .cfi_restore w20980# ASM-NEXT: .cfi_restore w21981# ASM-NEXT: .cfi_restore w29982 983# UNWINDINFO: DW_CFA_def_cfa_offset: +32984# UNWINDINFO: DW_CFA_offset: reg19 -8985# UNWINDINFO-NEXT: DW_CFA_offset: reg20 -16986# UNWINDINFO-NEXT: DW_CFA_offset: reg21 -24987# UNWINDINFO-NEXT: DW_CFA_offset: reg29 -32988# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +32, DW_OP_bregx 0x2e +0, DW_OP_consts +144, DW_OP_mul, DW_OP_plus989# UNWINDINFO: DW_CFA_expression: reg72 DW_OP_bregx 0x2e +0, DW_OP_consts -8, DW_OP_mul, DW_OP_plus, DW_OP_consts -32, DW_OP_plus990# UNWINDINFO-NEXT: DW_CFA_expression: reg73 DW_OP_bregx 0x2e +0, DW_OP_consts -16, DW_OP_mul, DW_OP_plus, DW_OP_consts -32, DW_OP_plus991# UNWINDINFO-NEXT: DW_CFA_expression: reg74 DW_OP_bregx 0x2e +0, DW_OP_consts -24, DW_OP_mul, DW_OP_plus, DW_OP_consts -32, DW_OP_plus992# UNWINDINFO-NEXT: DW_CFA_expression: reg75 DW_OP_bregx 0x2e +0, DW_OP_consts -32, DW_OP_mul, DW_OP_plus, DW_OP_consts -32, DW_OP_plus993# UNWINDINFO-NEXT: DW_CFA_expression: reg76 DW_OP_bregx 0x2e +0, DW_OP_consts -40, DW_OP_mul, DW_OP_plus, DW_OP_consts -32, DW_OP_plus994# UNWINDINFO-NEXT: DW_CFA_expression: reg77 DW_OP_bregx 0x2e +0, DW_OP_consts -48, DW_OP_mul, DW_OP_plus, DW_OP_consts -32, DW_OP_plus995# UNWINDINFO-NEXT: DW_CFA_expression: reg78 DW_OP_bregx 0x2e +0, DW_OP_consts -56, DW_OP_mul, DW_OP_plus, DW_OP_consts -32, DW_OP_plus996# UNWINDINFO-NEXT: DW_CFA_expression: reg79 DW_OP_bregx 0x2e +0, DW_OP_consts -64, DW_OP_mul, DW_OP_plus, DW_OP_consts -32, DW_OP_plus997# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +64, DW_OP_bregx 0x2e +0, DW_OP_consts +144, DW_OP_mul, DW_OP_plus998# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +64, DW_OP_bregx 0x2e +0, DW_OP_consts +152, DW_OP_mul, DW_OP_plus999#1000# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +32, DW_OP_bregx 0x2e +0, DW_OP_consts +152, DW_OP_mul, DW_OP_plus1001# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +32, DW_OP_bregx 0x2e +0, DW_OP_consts +144, DW_OP_mul, DW_OP_plus1002# UNWINDINFO: DW_CFA_def_cfa: reg31 +321003# UNWINDINFO-NEXT: DW_CFA_restore_extended: reg1041004# UNWINDINFO-NEXT: DW_CFA_restore_extended: reg1051005# UNWINDINFO-NEXT: DW_CFA_restore_extended: reg1061006# UNWINDINFO-NEXT: DW_CFA_restore_extended: reg1071007# UNWINDINFO-NEXT: DW_CFA_restore_extended: reg1081008# UNWINDINFO-NEXT: DW_CFA_restore_extended: reg1091009# UNWINDINFO-NEXT: DW_CFA_restore_extended: reg1101010# UNWINDINFO-NEXT: DW_CFA_restore_extended: reg1111011# UNWINDINFO: DW_CFA_def_cfa_offset: +01012# UNWINDINFO-NEXT: DW_CFA_restore: reg191013# UNWINDINFO-NEXT: DW_CFA_restore: reg201014# UNWINDINFO-NEXT: DW_CFA_restore: reg211015# UNWINDINFO-NEXT: DW_CFA_restore: reg291016 1017name: save_restore_sve1018stack:1019 - { id: 0, stack-id: scalable-vector, size: 16, alignment: 16 }1020 - { id: 1, stack-id: default, size: 32, alignment: 16 }1021body: |1022 bb.0.entry:1023 1024 $z8_z9_z10_z11 = IMPLICIT_DEF1025 $z12_z13_z14_z15 = IMPLICIT_DEF1026 $z16_z17_z18_z19 = IMPLICIT_DEF1027 $z20_z21_z22_z23 = IMPLICIT_DEF1028 $z24_z25_z26_z27 = IMPLICIT_DEF1029 $z28_z29_z30_z31 = IMPLICIT_DEF1030 $p4 = IMPLICIT_DEF1031 $p5 = IMPLICIT_DEF1032 $p6 = IMPLICIT_DEF1033 $p7 = IMPLICIT_DEF1034 $p8 = IMPLICIT_DEF1035 $p9 = IMPLICIT_DEF1036 $p10 = IMPLICIT_DEF1037 $p11 = IMPLICIT_DEF1038 $p12 = IMPLICIT_DEF1039 $p13 = IMPLICIT_DEF1040 $p14 = IMPLICIT_DEF1041 $p15 = IMPLICIT_DEF1042 1043 $x19 = IMPLICIT_DEF1044 $x20 = IMPLICIT_DEF1045 $x21 = IMPLICIT_DEF1046 1047 RET_ReallyLR1048---1049...1050# Test allocation/deallocation of the stack frame together with the1051# saving/restoring of callee save registers. Fixed-stack objects1052# are allocated before the callee-saves.1053#1054# CHECK-LABEL: name: save_restore_sve_realign1055# CHECK: $sp = frame-setup STPXpre killed $fp, killed $lr, $sp, -21056# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 161057# CHECK-NEXT: $fp = frame-setup ADDXri $sp, 0, 01058# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa $w29, 161059# CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w30, -81060# CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -161061# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -181062# CHECK-NEXT: STR_PXI killed $p15, $sp, 41063# CHECK-NEXT: STR_PXI killed $p14, $sp, 51064# CHECK: STR_PXI killed $p5, $sp, 141065# CHECK-NEXT: STR_PXI killed $p4, $sp, 151066# CHECK-NEXT: STR_ZXI killed $z23, $sp, 21067# CHECK-NEXT: STR_ZXI killed $z22, $sp, 31068# CHECK: STR_ZXI killed $z9, $sp, 161069# CHECK-NEXT: STR_ZXI killed $z8, $sp, 171070# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape1071# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape1072# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape1073# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape1074# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape1075# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape1076# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape1077# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape1078# CHECK-NEXT: $[[TMP:x[0-9]+]] = frame-setup SUBXri $sp, 16, 01079# CHECK-NEXT: $[[TMP]] = frame-setup ADDVL_XXI $[[TMP]], -11080# CHECK-NEXT: $sp = frame-setup ANDXri killed $[[TMP]]1081 1082# CHECK: $sp = frame-destroy ADDVL_XXI $fp, -181083# CHECK: $z23 = frame-destroy LDR_ZXI $sp, 21084# CHECK-NEXT: $z22 = frame-destroy LDR_ZXI $sp, 31085# CHECK: $z9 = frame-destroy LDR_ZXI $sp, 161086# CHECK-NEXT: $z8 = frame-destroy LDR_ZXI $sp, 171087# CHECK-NEXT: $p15 = frame-destroy LDR_PXI $sp, 41088# CHECK-NEXT: $p14 = frame-destroy LDR_PXI $sp, 51089# CHECK: $p5 = frame-destroy LDR_PXI $sp, 141090# CHECK-NEXT: $p4 = frame-destroy LDR_PXI $sp, 151091# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z81092# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z91093# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z101094# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z111095# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z121096# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z131097# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z141098# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z151099# CHECK-NEXT: $sp = frame-destroy ADDXri $fp, 0, 01100# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 161101# CHECK-NEXT: $sp, $fp, $lr = frame-destroy LDPXpost $sp, 21102# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 01103# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w301104# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w291105# CHECK-NEXT: RET_ReallyLR1106#1107# ASM-LABEL: save_restore_sve_realign:1108# ASM: .cfi_def_cfa_offset 161109# ASM: .cfi_def_cfa w29, 161110# ASM-NEXT: .cfi_offset w30, -81111# ASM-NEXT: .cfi_offset w29, -161112# ASM: .cfi_escape1113# ASM-SAME: // $d8 @ cfa - 8 * VG - 161114# ASM-NEXT: .cfi_escape1115# ASM-SAME: // $d9 @ cfa - 16 * VG - 161116# ASM-NEXT: .cfi_escape1117# ASM-SAME: // $d10 @ cfa - 24 * VG - 161118# ASM-NEXT: .cfi_escape1119# ASM-SAME: // $d11 @ cfa - 32 * VG - 161120# ASM-NEXT: .cfi_escape1121# ASM-SAME: // $d12 @ cfa - 40 * VG - 161122# ASM-NEXT: .cfi_escape1123# ASM-SAME: // $d13 @ cfa - 48 * VG - 161124# ASM-NEXT: .cfi_escape1125# ASM-SAME: // $d14 @ cfa - 56 * VG - 161126# ASM-NEXT: .cfi_escape1127# ASM-SAME: // $d15 @ cfa - 64 * VG - 161128#1129# ASM: .cfi_restore z81130# ASM-NEXT: .cfi_restore z91131# ASM-NEXT: .cfi_restore z101132# ASM-NEXT: .cfi_restore z111133# ASM-NEXT: .cfi_restore z121134# ASM-NEXT: .cfi_restore z131135# ASM-NEXT: .cfi_restore z141136# ASM-NEXT: .cfi_restore z151137# ASM: .cfi_def_cfa wsp, 161138# ASM: .cfi_def_cfa_offset 01139# ASM-NEXT: .cfi_restore w301140# ASM-NEXT: .cfi_restore w291141#1142# UNWINDINFO: DW_CFA_def_cfa_offset: +161143# UNWINDINFO: DW_CFA_def_cfa: reg29 +161144# UNWINDINFO-NEXT: DW_CFA_offset: reg30 -81145# UNWINDINFO-NEXT: DW_CFA_offset: reg29 -161146# UNWINDINFO: DW_CFA_expression: reg72 DW_OP_bregx 0x2e +0, DW_OP_consts -8, DW_OP_mul, DW_OP_plus, DW_OP_lit16, DW_OP_minus1147# UNWINDINFO-NEXT: DW_CFA_expression: reg73 DW_OP_bregx 0x2e +0, DW_OP_consts -16, DW_OP_mul, DW_OP_plus, DW_OP_lit16, DW_OP_minus1148# UNWINDINFO-NEXT: DW_CFA_expression: reg74 DW_OP_bregx 0x2e +0, DW_OP_consts -24, DW_OP_mul, DW_OP_plus, DW_OP_lit16, DW_OP_minus1149# UNWINDINFO-NEXT: DW_CFA_expression: reg75 DW_OP_bregx 0x2e +0, DW_OP_consts -32, DW_OP_mul, DW_OP_plus, DW_OP_lit16, DW_OP_minus1150# UNWINDINFO-NEXT: DW_CFA_expression: reg76 DW_OP_bregx 0x2e +0, DW_OP_consts -40, DW_OP_mul, DW_OP_plus, DW_OP_lit16, DW_OP_minus1151# UNWINDINFO-NEXT: DW_CFA_expression: reg77 DW_OP_bregx 0x2e +0, DW_OP_consts -48, DW_OP_mul, DW_OP_plus, DW_OP_lit16, DW_OP_minus1152# UNWINDINFO-NEXT: DW_CFA_expression: reg78 DW_OP_bregx 0x2e +0, DW_OP_consts -56, DW_OP_mul, DW_OP_plus, DW_OP_lit16, DW_OP_minus1153# UNWINDINFO-NEXT: DW_CFA_expression: reg79 DW_OP_bregx 0x2e +0, DW_OP_consts -64, DW_OP_mul, DW_OP_plus, DW_OP_lit16, DW_OP_minus1154#1155# UNWINDINFO: DW_CFA_restore_extended: reg1041156# UNWINDINFO-NEXT: DW_CFA_restore_extended: reg1051157# UNWINDINFO-NEXT: DW_CFA_restore_extended: reg1061158# UNWINDINFO-NEXT: DW_CFA_restore_extended: reg1071159# UNWINDINFO-NEXT: DW_CFA_restore_extended: reg1081160# UNWINDINFO-NEXT: DW_CFA_restore_extended: reg1091161# UNWINDINFO-NEXT: DW_CFA_restore_extended: reg1101162# UNWINDINFO-NEXT: DW_CFA_restore_extended: reg1111163# UNWINDINFO: DW_CFA_def_cfa: reg31 +161164# UNWINDINFO: DW_CFA_def_cfa_offset: +01165# UNWINDINFO-NEXT: DW_CFA_restore: reg301166# UNWINDINFO-NEXT: DW_CFA_restore: reg291167 1168name: save_restore_sve_realign1169stack:1170 - { id: 0, stack-id: scalable-vector, size: 16, alignment: 16 }1171 - { id: 1, stack-id: default, size: 16, alignment: 32 }1172body: |1173 bb.0.entry:1174 1175 $z8_z9_z10_z11 = IMPLICIT_DEF1176 $z12_z13_z14_z15 = IMPLICIT_DEF1177 $z16_z17_z18_z19 = IMPLICIT_DEF1178 $z20_z21_z22_z23 = IMPLICIT_DEF1179 $z24_z25_z26_z27 = IMPLICIT_DEF1180 $z28_z29_z30_z31 = IMPLICIT_DEF1181 $p4 = IMPLICIT_DEF1182 $p5 = IMPLICIT_DEF1183 $p6 = IMPLICIT_DEF1184 $p7 = IMPLICIT_DEF1185 $p8 = IMPLICIT_DEF1186 $p9 = IMPLICIT_DEF1187 $p10 = IMPLICIT_DEF1188 $p11 = IMPLICIT_DEF1189 $p12 = IMPLICIT_DEF1190 $p13 = IMPLICIT_DEF1191 $p14 = IMPLICIT_DEF1192 $p15 = IMPLICIT_DEF1193 1194 RET_ReallyLR1195---1196# Frame layout should be:1197# +---------------------+ <- Old SP1198# | callee save z8 |@ -161199# | callee save z23 |@ -321200# | callee save p4 |@ -341201# | callee save p15 |@ -481202# | id #0 (size 32) |@ -801203# | id #1 (size 4) |@ -841204# | id #2 (size 16) |@ -1121205# | id #3 (size 2) |@ -1141206# | id #4 (size 16) |@ -1441207# | id #5 (size 2) |@ -1461208# +- - - - - - - - - - -+ <- New SP @-1601209# CHECK-LABEL: name: frame_layout1210# CHECK: stack:1211# CHECK: - { id: 0, name: '', type: default, offset: -80, size: 32, alignment: 16,1212# CHECK-NEXT: stack-id: scalable-vector,1213# CHECK: - { id: 1, name: '', type: default, offset: -84, size: 4, alignment: 2,1214# CHECK-NEXT: stack-id: scalable-vector,1215# CHECK: - { id: 2, name: '', type: default, offset: -112, size: 16, alignment: 16,1216# CHECK-NEXT: stack-id: scalable-vector,1217# CHECK: - { id: 3, name: '', type: default, offset: -114, size: 2, alignment: 2,1218# CHECK-NEXT: stack-id: scalable-predicate-vector,1219# CHECK: - { id: 4, name: '', type: spill-slot, offset: -144, size: 16, alignment: 16,1220# CHECK-NEXT: stack-id: scalable-vector,1221# CHECK: - { id: 5, name: '', type: spill-slot, offset: -146, size: 2, alignment: 2,1222# CHECK-NEXT: stack-id: scalable-predicate-vector,1223# CHECK: - { id: 6, name: '', type: spill-slot, offset: -16, size: 16, alignment: 16,1224# CHECK-NEXT: stack-id: scalable-vector, callee-saved-register: '$z8',1225# CHECK: - { id: 7, name: '', type: spill-slot, offset: -32, size: 16, alignment: 16,1226# CHECK-NEXT: stack-id: scalable-vector, callee-saved-register: '$z23',1227# CHECK: - { id: 8, name: '', type: spill-slot, offset: -34, size: 2, alignment: 2,1228# CHECK-NEXT: stack-id: scalable-predicate-vector, callee-saved-register: '$p4',1229# CHECK: - { id: 9, name: '', type: spill-slot, offset: -36, size: 2, alignment: 2,1230# CHECK-NEXT: stack-id: scalable-predicate-vector, callee-saved-register: '$p15',1231# CHECK: - { id: 10, name: '', type: spill-slot, offset: -16, size: 8, alignment: 16,1232# CHECK-NEXT: stack-id: default, callee-saved-register: '$fp',1233#1234# CHECK: bb.0.entry:1235# CHECK-NEXT: liveins:1236# CHECK-NEXT: {{ $}}1237# CHECK-NEXT: $sp = frame-setup STRXpre killed $[[SCRATCH:[a-z0-9]+]], $sp, -161238# CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 161239# CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -161240# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -31241# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape1242# CHECK-NEXT: STR_PXI killed $p15, $sp, 61243# CHECK-NEXT: STR_PXI killed $p4, $sp, 71244# CHECK-NEXT: STR_ZXI killed $z23, $sp, 11245# CHECK-NEXT: STR_ZXI killed $z8, $sp, 21246# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape1247# CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -71248# CHECK-NEXT: frame-setup CFI_INSTRUCTION escape1249 1250# CHECK: $sp = frame-destroy ADDVL_XXI $sp, 71251# CHECK-NEXT: frame-destroy CFI_INSTRUCTION escape1252# CHECK-NEXT: $z23 = frame-destroy LDR_ZXI $sp, 11253# CHECK-NEXT: $z8 = frame-destroy LDR_ZXI $sp, 21254# CHECK-NEXT: $p15 = frame-destroy LDR_PXI $sp, 61255# CHECK-NEXT: $p4 = frame-destroy LDR_PXI $sp, 71256# CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31257# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 161258# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $z81259# CHECK-NEXT: early-clobber $sp, $fp = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.10)1260# CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 01261# CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w291262# CHECK-NEXT: RET_ReallyLR1263#1264# ASM-LABEL: frame_layout:1265# ASM: .cfi_def_cfa_offset 161266# ASM-NEXT: .cfi_offset w29, -161267# ASM: .cfi_escape1268# ASM-SAME: // sp + 16 + 24 * VG1269# ASM: .cfi_escape1270# ASM-SAME: // $d8 @ cfa - 8 * VG - 161271# ASM: .cfi_escape1272# ASM-SAME: // sp + 16 + 80 * VG1273#1274# ASM: .cfi_escape1275# ASM-SAME: // sp + 16 + 24 * VG1276# ASM: .cfi_def_cfa wsp, 161277# ASM-NEXT: .cfi_restore z81278# ASM: .cfi_def_cfa_offset 01279# ASM-NEXT: .cfi_restore w291280 1281# UNWINDINFO: DW_CFA_def_cfa_offset: +161282# UNWINDINFO-NEXT: DW_CFA_offset: reg29 -161283# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +16, DW_OP_bregx 0x2e +0, DW_OP_lit24, DW_OP_mul, DW_OP_plus1284# UNWINDINFO: DW_CFA_expression: reg72 DW_OP_bregx 0x2e +0, DW_OP_consts -8, DW_OP_mul, DW_OP_plus, DW_OP_lit16, DW_OP_minus1285# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +16, DW_OP_bregx 0x2e +0, DW_OP_consts +80, DW_OP_mul, DW_OP_plus1286#1287# UNWINDINFO: DW_CFA_def_cfa_expression: DW_OP_breg31 +16, DW_OP_bregx 0x2e +0, DW_OP_lit24, DW_OP_mul, DW_OP_plus1288# UNWINDINFO: DW_CFA_def_cfa: reg31 +161289# UNWINDINFO-NEXT: DW_CFA_restore_extended: reg1041290# UNWINDINFO: DW_CFA_def_cfa_offset: +01291# UNWINDINFO-NEXT: DW_CFA_restore: reg291292 1293name: frame_layout1294stack:1295 - { id: 0, type: default, size: 32, alignment: 16, stack-id: scalable-vector }1296 - { id: 1, type: default, size: 4, alignment: 2, stack-id: scalable-vector }1297 - { id: 2, type: default, size: 16, alignment: 16, stack-id: scalable-vector }1298 - { id: 3, type: default, size: 2, alignment: 2, stack-id: scalable-predicate-vector }1299 - { id: 4, type: spill-slot, size: 16, alignment: 16, stack-id: scalable-vector }1300 - { id: 5, type: spill-slot, size: 2, alignment: 2, stack-id: scalable-predicate-vector }1301body: |1302 bb.0.entry:1303 1304 ; Trigger some callee saves1305 $z8 = IMPLICIT_DEF1306 $z23 = IMPLICIT_DEF1307 $p4 = IMPLICIT_DEF1308 $p15 = IMPLICIT_DEF1309 1310 RET_ReallyLR1311 1312---1313# Make sure we account for the offset between the fp and the sve area, if it exists.1314# FIXME: Should there be an offset?1315# CHECK-LABEL: name: fp_relative_index_with_float_save1316# CHECK: - { id: 0, name: '', type: default, offset: -16, size: 16, alignment: 16,1317# CHECK-NEXT: stack-id: scalable-vector1318# CHECK: - { id: 1, name: '', type: default, offset: -64, size: 16, alignment: 32,1319# CHECK-NEXT: stack-id: default1320# CHECK: - { id: 2, name: '', type: spill-slot, offset: -8, size: 8, alignment: 8,1321# CHECK-NEXT: stack-id: default, callee-saved-register: '$lr'1322# CHECK: - { id: 3, name: '', type: spill-slot, offset: -16, size: 8, alignment: 8,1323# CHECK-NEXT: stack-id: default, callee-saved-register: '$fp'1324# CHECK: - { id: 4, name: '', type: spill-slot, offset: -32, size: 8, alignment: 16,1325# CHECK-NEXT: stack-id: default, callee-saved-register: '$d8'1326 1327# CHECK: $x8 = SUBXri $fp, 16, 01328# CHECK: STR_ZXI $z0, killed $x8, -11329 1330name: fp_relative_index_with_float_save1331stack:1332 - { id: 0, stack-id: scalable-vector, size: 16, alignment: 16 }1333 - { id: 1, stack-id: default, size: 16, alignment: 32 }1334frameInfo:1335 maxAlignment: 161336 isFrameAddressTaken: true1337body: |1338 bb.0.entry:1339 liveins: $z01340 1341 $d8 = IMPLICIT_DEF1342 1343 STR_ZXI $z0, %stack.0, 01344 1345 RET_ReallyLR1346---1347...1348# CHECK-LABEL: name: fp_relative_that_is_not_a_multiple_of_VLx161349# CHECK: - { id: 0, name: '', type: default, offset: -156, size: 156, alignment: 1,1350# CHECK-NEXT: stack-id: scalable-vector1351# CHECK: - { id: 1, name: '', type: variable-sized, offset: -32, alignment: 1,1352# CHECK-NEXT: stack-id: default1353 1354# CHECK: $x8 = ADDPL_XXI $fp, -141355# CHECK-NEXT: $z0 = LD1W_IMM killed renamable $p0, killed $x8, -81356 1357name: fp_relative_that_is_not_a_multiple_of_VLx161358stack:1359 - { id: 0, stack-id: scalable-vector, size: 156, alignment: 1 }1360 - { id: 1, stack-id: default, type: variable-sized, alignment: 1 }1361body: |1362 bb.0.entry:1363 liveins: $p01364 1365 renamable $z0 = LD1W_IMM killed renamable $p0, %stack.0, 01366 RET_ReallyLR1367---1368