forked from OSchip/llvm-project
[AArch64][SVE] Fix epilogue for SVE when the stack is realigned.
While deallocating the stackframe, the offset used to reload the callee-saved registers was not pointing to the SVE callee-saves, but rather to the whole SVE area. +--------------+ | GRP callee | | saves | +--------------+ <- FP | SVE callee | | saves | +--------------+ <- Should restore SVE callee saves from here | SVE Spills | | and Locals | +--------------+ <- instead of from here. | | : : | | +--------------+ <- SP Reviewed By: paulwalker-arm Differential Revision: https://reviews.llvm.org/D84539
This commit is contained in:
parent
26b4ef3694
commit
cda2eb3ad2
|
@ -1596,12 +1596,13 @@ void AArch64FrameLowering::emitEpilogue(MachineFunction &MF,
|
||||||
// Deallocate the SVE area.
|
// Deallocate the SVE area.
|
||||||
if (SVEStackSize) {
|
if (SVEStackSize) {
|
||||||
if (AFI->isStackRealigned()) {
|
if (AFI->isStackRealigned()) {
|
||||||
if (AFI->getSVECalleeSavedStackSize())
|
if (int64_t CalleeSavedSize = AFI->getSVECalleeSavedStackSize())
|
||||||
// Set SP to start of SVE area, from which the callee-save reloads
|
// Set SP to start of SVE callee-save area from which they can
|
||||||
// can be done. The code below will deallocate the stack space
|
// be reloaded. The code below will deallocate the stack space
|
||||||
// space by moving FP -> SP.
|
// space by moving FP -> SP.
|
||||||
emitFrameOffset(MBB, RestoreBegin, DL, AArch64::SP, AArch64::FP,
|
emitFrameOffset(MBB, RestoreBegin, DL, AArch64::SP, AArch64::FP,
|
||||||
-SVEStackSize, TII, MachineInstr::FrameDestroy);
|
{-CalleeSavedSize, MVT::nxv1i8}, TII,
|
||||||
|
MachineInstr::FrameDestroy);
|
||||||
} else {
|
} else {
|
||||||
if (AFI->getSVECalleeSavedStackSize()) {
|
if (AFI->getSVECalleeSavedStackSize()) {
|
||||||
// Deallocate the non-SVE locals first before we can deallocate (and
|
// Deallocate the non-SVE locals first before we can deallocate (and
|
||||||
|
|
|
@ -500,7 +500,7 @@ body: |
|
||||||
# CHECK-NEXT: $[[TMP:x[0-9]+]] = frame-setup SUBXri $sp, 16, 0
|
# CHECK-NEXT: $[[TMP:x[0-9]+]] = frame-setup SUBXri $sp, 16, 0
|
||||||
# CHECK-NEXT: $sp = ANDXri killed $[[TMP]]
|
# CHECK-NEXT: $sp = ANDXri killed $[[TMP]]
|
||||||
|
|
||||||
# CHECK: $sp = frame-destroy ADDVL_XXI $fp, -19
|
# CHECK: $sp = frame-destroy ADDVL_XXI $fp, -18
|
||||||
# CHECK-NEXT: $p15 = frame-destroy LDR_PXI $sp, 4
|
# CHECK-NEXT: $p15 = frame-destroy LDR_PXI $sp, 4
|
||||||
# CHECK-NEXT: $p14 = frame-destroy LDR_PXI $sp, 5
|
# CHECK-NEXT: $p14 = frame-destroy LDR_PXI $sp, 5
|
||||||
# CHECK: $p5 = frame-destroy LDR_PXI $sp, 14
|
# CHECK: $p5 = frame-destroy LDR_PXI $sp, 14
|
||||||
|
|
Loading…
Reference in New Issue