[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:
Sander de Smalen 2020-07-28 12:11:09 +01:00
parent 26b4ef3694
commit cda2eb3ad2
2 changed files with 6 additions and 5 deletions

View File

@ -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

View File

@ -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