brintos

brintos / llvm-project-archived public Read only

0
0
Text · 54.9 KiB · 1101416 Raw
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