| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,70 @@ | ||
| # RUN: llc -o - %s -mtriple=aarch64-windows -start-before=prologepilog \ | ||
| # RUN: -stop-after=prologepilog | FileCheck %s | ||
|
|
||
| # Check that the callee-saved registers are saved starting with a STP | ||
| # with predecrement, followed by a separate stack adjustment later, | ||
| # if the optsize attribute is set. | ||
|
|
||
| # CHECK: early-clobber $sp = frame-setup STPXpre killed $x19, killed $x20, $sp, -2 | ||
| # CHECK-NEXT: frame-setup SEH_SaveRegP_X 19, 20, -16 | ||
| # CHECK-NEXT: $sp = frame-setup SUBXri $sp, 16, 0 | ||
| # CHECK-NEXT: frame-setup SEH_StackAlloc 16 | ||
| # CHECK-NEXT: frame-setup SEH_PrologEnd | ||
|
|
||
| --- | | ||
|
|
||
| define dso_local i32 @func(i32 %a) optsize { ret i32 %a } | ||
|
|
||
| ... | ||
| --- | ||
| name: func | ||
| alignment: 4 | ||
| exposesReturnsTwice: false | ||
| legalized: false | ||
| regBankSelected: false | ||
| selected: false | ||
| failedISel: false | ||
| tracksRegLiveness: true | ||
| hasWinCFI: false | ||
| registers: [] | ||
| liveins: [] | ||
| frameInfo: | ||
| isFrameAddressTaken: false | ||
| isReturnAddressTaken: false | ||
| hasStackMap: false | ||
| hasPatchPoint: false | ||
| stackSize: 0 | ||
| offsetAdjustment: 0 | ||
| maxAlignment: 4 | ||
| adjustsStack: false | ||
| hasCalls: false | ||
| stackProtector: '' | ||
| maxCallFrameSize: 0 | ||
| cvBytesOfCalleeSavedRegisters: 0 | ||
| hasOpaqueSPAdjustment: false | ||
| hasVAStart: false | ||
| hasMustTailInVarArgFunc: false | ||
| localFrameSize: 4 | ||
| savePoint: '' | ||
| restorePoint: '' | ||
| fixedStack: [] | ||
| stack: | ||
| - { id: 0, name: '', type: default, offset: 0, size: 4, alignment: 4, | ||
| stack-id: default, callee-saved-register: '', callee-saved-restored: true, | ||
| local-offset: -4, debug-info-variable: '', debug-info-expression: '', | ||
| debug-info-location: '' } | ||
| callSites: [] | ||
| constants: [] | ||
| machineFunctionInfo: {} | ||
| body: | | ||
| bb.0: | ||
| liveins: $x0, $x19, $x20 | ||
| renamable $x8 = ADDXri %stack.0, 0, 0 | ||
| $x19 = ADDXrr $x0, $x8 | ||
| $x20 = ADDXrr $x19, $x0 | ||
| $x0 = ADDXrr $x0, killed $x20 | ||
| RET_ReallyLR | ||
| ... |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,89 @@ | ||
| # RUN: llc -o - %s -mtriple=aarch64-windows -start-before=prologepilog \ | ||
| # RUN: -stop-after=prologepilog | FileCheck %s | ||
| # Check where the stack variable is placed | ||
|
|
||
| # CHECK: - { id: 0, name: '', type: default, offset: -4, size: 4, alignment: 4, | ||
| # CHECK-NEXT: stack-id: default, callee-saved-register: '', callee-saved-restored: true, | ||
| # CHECK-NEXT: local-offset: -4, debug-info-variable: '', debug-info-expression: '', | ||
| # CHECK-NEXT: debug-info-location: '' } | ||
| # CHECK-NEXT: - { id: 1, name: '', type: spill-slot, offset: -16, size: 8, alignment: 16, | ||
| # CHECK-NEXT: stack-id: default, callee-saved-register: '$x23', callee-saved-restored: true, | ||
| # CHECK-NEXT: debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } | ||
| # CHECK-NEXT: - { id: 2, name: '', type: spill-slot, offset: -24, size: 8, alignment: 8, | ||
| # CHECK-NEXT: stack-id: default, callee-saved-register: '$x22', callee-saved-restored: true, | ||
| # CHECK-NEXT: debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } | ||
| # CHECK-NEXT: - { id: 3, name: '', type: spill-slot, offset: -32, size: 8, alignment: 8, | ||
| # CHECK-NEXT: stack-id: default, callee-saved-register: '$x21', callee-saved-restored: true, | ||
| # CHECK-NEXT: debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } | ||
| # CHECK-NEXT: - { id: 4, name: '', type: spill-slot, offset: -40, size: 8, alignment: 8, | ||
| # CHECK-NEXT: stack-id: default, callee-saved-register: '$x20', callee-saved-restored: true, | ||
| # CHECK-NEXT: debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } | ||
| # CHECK-NEXT: - { id: 5, name: '', type: spill-slot, offset: -48, size: 8, alignment: 8, | ||
| # CHECK-NEXT: stack-id: default, callee-saved-register: '$x19', callee-saved-restored: true, | ||
| # CHECK-NEXT: debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } | ||
|
|
||
| # CHECK: early-clobber $sp = frame-setup STPXpre killed $x19, killed $x20, $sp, -6 :: (store 8 into %stack.4), (store 8 into %stack.5) | ||
| # CHECK-NEXT: frame-setup SEH_SaveRegP_X 19, 20, -48 | ||
| # CHECK-NEXT: frame-setup STPXi killed $x21, killed $x22, $sp, 2 :: (store 8 into %stack.2), (store 8 into %stack.3) | ||
| # CHECK-NEXT: frame-setup SEH_SaveRegP 21, 22, 16 | ||
| # CHECK-NEXT: frame-setup STRXui killed $x23, $sp, 4 :: (store 8 into %stack.1) | ||
| # CHECK-NEXT: frame-setup SEH_SaveReg 23, 32 | ||
| # CHECK-NEXT: frame-setup SEH_PrologEnd | ||
|
|
||
|
|
||
| ... | ||
| --- | ||
| name: func | ||
| alignment: 4 | ||
| exposesReturnsTwice: false | ||
| legalized: false | ||
| regBankSelected: false | ||
| selected: false | ||
| failedISel: false | ||
| tracksRegLiveness: true | ||
| hasWinCFI: false | ||
| registers: [] | ||
| liveins: [] | ||
| frameInfo: | ||
| isFrameAddressTaken: false | ||
| isReturnAddressTaken: false | ||
| hasStackMap: false | ||
| hasPatchPoint: false | ||
| stackSize: 0 | ||
| offsetAdjustment: 0 | ||
| maxAlignment: 4 | ||
| adjustsStack: false | ||
| hasCalls: false | ||
| stackProtector: '' | ||
| maxCallFrameSize: 0 | ||
| cvBytesOfCalleeSavedRegisters: 0 | ||
| hasOpaqueSPAdjustment: false | ||
| hasVAStart: false | ||
| hasMustTailInVarArgFunc: false | ||
| localFrameSize: 4 | ||
| savePoint: '' | ||
| restorePoint: '' | ||
| fixedStack: [] | ||
| stack: | ||
| - { id: 0, name: '', type: default, offset: 0, size: 4, alignment: 4, | ||
| stack-id: default, callee-saved-register: '', callee-saved-restored: true, | ||
| local-offset: -4, debug-info-variable: '', debug-info-expression: '', | ||
| debug-info-location: '' } | ||
| callSites: [] | ||
| constants: [] | ||
| machineFunctionInfo: {} | ||
| body: | | ||
| bb.0.entry: | ||
| liveins: $x0, $x23, $x21, $x22, $x19, $x20 | ||
| renamable $x8 = ADDXri %stack.0, 0, 0 | ||
| $x19 = ADDXrr $x0, $x8 | ||
| $x20 = ADDXrr $x19, $x0 | ||
| $x21 = ADDXrr $x20, killed $x19 | ||
| $x22 = ADDXrr $x21, killed $x20 | ||
| $x23 = ADDXrr $x22, killed $x21 | ||
| $x0 = ADDXrr $x0, killed $x23 | ||
| RET_ReallyLR | ||
| ... |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,74 @@ | ||
| # RUN: llc -o - %s -mtriple=aarch64-windows -start-before=prologepilog \ | ||
| # RUN: -stop-after=prologepilog | FileCheck %s | ||
| # RUN: llc -o - %s -mtriple=aarch64-windows -start-before=prologepilog \ | ||
| # RUN: | FileCheck --check-prefix=ASM %s | ||
|
|
||
| # Check that an odd callee-saved GPR is paired with lr | ||
|
|
||
| # CHECK: early-clobber $sp = frame-setup STPXpre killed $x19, killed $x20, $sp, -4 | ||
| # CHECK-NEXT: frame-setup SEH_SaveRegP_X 19, 20, -32 | ||
| # CHECK-NEXT: frame-setup STPXi killed $x21, killed $lr, $sp, 2 | ||
| # CHECK-NEXT: frame-setup SEH_SaveRegP 21, 30, 16 | ||
| # CHECK-NEXT: frame-setup SEH_PrologEnd | ||
|
|
||
| # ASM: stp x19, x20, [sp, #-32]! | ||
| # ASM-NEXT: .seh_save_regp_x x19, 32 | ||
| # ASM-NEXT: stp x21, x30, [sp, #16] | ||
| # ASM-NEXT: .seh_save_lrpair x21, 16 | ||
| # ASM-NEXT: .seh_endprologue | ||
|
|
||
| --- | | ||
|
|
||
| define dso_local i32 @func(i32 %a) { ret i32 %a } | ||
| declare dso_local i32 @other() | ||
|
|
||
| ... | ||
| --- | ||
| name: func | ||
| alignment: 4 | ||
| exposesReturnsTwice: false | ||
| legalized: false | ||
| regBankSelected: false | ||
| selected: false | ||
| failedISel: false | ||
| tracksRegLiveness: true | ||
| hasWinCFI: false | ||
| registers: [] | ||
| liveins: [] | ||
| frameInfo: | ||
| isFrameAddressTaken: false | ||
| isReturnAddressTaken: false | ||
| hasStackMap: false | ||
| hasPatchPoint: false | ||
| stackSize: 0 | ||
| offsetAdjustment: 0 | ||
| maxAlignment: 4 | ||
| adjustsStack: false | ||
| hasCalls: false | ||
| stackProtector: '' | ||
| maxCallFrameSize: 0 | ||
| cvBytesOfCalleeSavedRegisters: 0 | ||
| hasOpaqueSPAdjustment: false | ||
| hasVAStart: false | ||
| hasMustTailInVarArgFunc: false | ||
| localFrameSize: 4 | ||
| savePoint: '' | ||
| restorePoint: '' | ||
| fixedStack: [] | ||
| stack: [] | ||
| callSites: [] | ||
| constants: [] | ||
| machineFunctionInfo: {} | ||
| body: | | ||
| bb.0: | ||
| liveins: $x0, $x21, $x19, $x20 | ||
| BL @other, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit $w0, implicit-def $sp, implicit-def $w0 | ||
| $x19 = ADDXrr $x0, $x0 | ||
| $x20 = ADDXrr $x19, $x0 | ||
| $x21 = ADDXrr $x20, killed $x19 | ||
| $x0 = ADDXrr $x0, killed $x21 | ||
| RET_ReallyLR | ||
| ... |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,65 @@ | ||
| # RUN: llc -o - %s -mtriple=aarch64-windows -start-before=prologepilog \ | ||
| # RUN: -stop-after=prologepilog | FileCheck %s | ||
|
|
||
| # Check that lr isn't paired with a GPR if it's the first pair, as | ||
| # that can't be described as a SEH opcode if combined with predecrement. | ||
|
|
||
| # CHECK: early-clobber $sp = frame-setup STRXpre killed $x19, $sp, -16 | ||
| # CHECK-NEXT: frame-setup SEH_SaveReg_X 19, -16 | ||
| # CHECK-NEXT: frame-setup STRXui killed $lr, $sp, 1 | ||
| # CHECK-NEXT: frame-setup SEH_SaveReg 30, 8 | ||
| # CHECK-NEXT: frame-setup SEH_PrologEnd | ||
|
|
||
| --- | | ||
|
|
||
| define dso_local i32 @func(i32 %a) { ret i32 %a } | ||
| declare dso_local i32 @other() | ||
|
|
||
| ... | ||
| --- | ||
| name: func | ||
| alignment: 4 | ||
| exposesReturnsTwice: false | ||
| legalized: false | ||
| regBankSelected: false | ||
| selected: false | ||
| failedISel: false | ||
| tracksRegLiveness: true | ||
| hasWinCFI: false | ||
| registers: [] | ||
| liveins: [] | ||
| frameInfo: | ||
| isFrameAddressTaken: false | ||
| isReturnAddressTaken: false | ||
| hasStackMap: false | ||
| hasPatchPoint: false | ||
| stackSize: 0 | ||
| offsetAdjustment: 0 | ||
| maxAlignment: 4 | ||
| adjustsStack: false | ||
| hasCalls: false | ||
| stackProtector: '' | ||
| maxCallFrameSize: 0 | ||
| cvBytesOfCalleeSavedRegisters: 0 | ||
| hasOpaqueSPAdjustment: false | ||
| hasVAStart: false | ||
| hasMustTailInVarArgFunc: false | ||
| localFrameSize: 4 | ||
| savePoint: '' | ||
| restorePoint: '' | ||
| fixedStack: [] | ||
| stack: [] | ||
| callSites: [] | ||
| constants: [] | ||
| machineFunctionInfo: {} | ||
| body: | | ||
| bb.0: | ||
| liveins: $x0, $x19 | ||
| BL @other, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit $w0, implicit-def $sp, implicit-def $w0 | ||
| $x19 = ADDXrr $x0, $x0 | ||
| $x0 = ADDXrr $x0, killed $x19 | ||
| RET_ReallyLR | ||
| ... |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,68 @@ | ||
| # RUN: llc -o - %s -mtriple=aarch64-windows -start-before=prologepilog \ | ||
| # RUN: -stop-after=prologepilog | FileCheck %s | ||
|
|
||
| # Check that an unpaired register that is even isn't paired with lr. | ||
|
|
||
| # CHECK: early-clobber $sp = frame-setup STPXpre killed $x19, killed $x20, $sp, -4 | ||
| # CHECK-NEXT: frame-setup SEH_SaveRegP_X 19, 20, -32 | ||
| # CHECK-NEXT: frame-setup STRXui killed $x22, $sp, 2 | ||
| # CHECK-NEXT: frame-setup SEH_SaveReg 22, 16 | ||
| # CHECK-NEXT: frame-setup STRXui killed $lr, $sp, 3 | ||
| # CHECK-NEXT: frame-setup SEH_SaveReg 30, 24 | ||
| # CHECK-NEXT: frame-setup SEH_PrologEnd | ||
|
|
||
| --- | | ||
|
|
||
| define dso_local i32 @func(i32 %a) { ret i32 %a } | ||
| declare dso_local i32 @other() | ||
|
|
||
| ... | ||
| --- | ||
| name: func | ||
| alignment: 4 | ||
| exposesReturnsTwice: false | ||
| legalized: false | ||
| regBankSelected: false | ||
| selected: false | ||
| failedISel: false | ||
| tracksRegLiveness: true | ||
| hasWinCFI: false | ||
| registers: [] | ||
| liveins: [] | ||
| frameInfo: | ||
| isFrameAddressTaken: false | ||
| isReturnAddressTaken: false | ||
| hasStackMap: false | ||
| hasPatchPoint: false | ||
| stackSize: 0 | ||
| offsetAdjustment: 0 | ||
| maxAlignment: 4 | ||
| adjustsStack: false | ||
| hasCalls: false | ||
| stackProtector: '' | ||
| maxCallFrameSize: 0 | ||
| cvBytesOfCalleeSavedRegisters: 0 | ||
| hasOpaqueSPAdjustment: false | ||
| hasVAStart: false | ||
| hasMustTailInVarArgFunc: false | ||
| localFrameSize: 4 | ||
| savePoint: '' | ||
| restorePoint: '' | ||
| fixedStack: [] | ||
| stack: [] | ||
| callSites: [] | ||
| constants: [] | ||
| machineFunctionInfo: {} | ||
| body: | | ||
| bb.0: | ||
| liveins: $x0, $x22, $x19, $x20 | ||
| BL @other, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit $w0, implicit-def $sp, implicit-def $w0 | ||
| $x19 = ADDXrr $x0, $x0 | ||
| $x20 = ADDXrr $x19, $x0 | ||
| $x22 = ADDXrr $x20, killed $x19 | ||
| $x0 = ADDXrr $x0, killed $x22 | ||
| RET_ReallyLR | ||
| ... |