@@ -2171,34 +2171,34 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
21712171 }
21722172
21732173 StackOffset SVECalleeSavesSize = {}, SVELocalsSize = SVEStackSize;
2174- MachineBasicBlock::iterator CalleeSavesBegin = MBBI, CalleeSavesEnd = MBBI;
2174+ MachineBasicBlock::iterator CalleeSavesEnd = MBBI;
2175+
2176+ StackOffset CFAOffset =
2177+ StackOffset::getFixed ((int64_t )MFI.getStackSize () - NumBytes);
21752178
21762179 // Process the SVE callee-saves to determine what space needs to be
21772180 // allocated.
21782181 if (int64_t CalleeSavedSize = AFI->getSVECalleeSavedStackSize ()) {
21792182 LLVM_DEBUG (dbgs () << " SVECalleeSavedStackSize = " << CalleeSavedSize
21802183 << " \n " );
2184+ SVECalleeSavesSize = StackOffset::getScalable (CalleeSavedSize);
2185+ SVELocalsSize = SVEStackSize - SVECalleeSavesSize;
21812186 // Find callee save instructions in frame.
2182- CalleeSavesBegin = MBBI;
2187+ // Note: With FPAfterSVECalleeSaves the callee saves have already been
2188+ // allocated.
21832189 if (!FPAfterSVECalleeSaves) {
2190+ MachineBasicBlock::iterator CalleeSavesBegin = MBBI;
21842191 assert (IsSVECalleeSave (CalleeSavesBegin) && " Unexpected instruction" );
21852192 while (IsSVECalleeSave (MBBI) && MBBI != MBB.getFirstTerminator ())
21862193 ++MBBI;
2187- }
2188- CalleeSavesEnd = MBBI;
2194+ CalleeSavesEnd = MBBI;
21892195
2190- SVECalleeSavesSize = StackOffset::getScalable (CalleeSavedSize);
2191- SVELocalsSize = SVEStackSize - SVECalleeSavesSize;
2192- }
2193-
2194- // Allocate space for the callee saves (if any).
2195- StackOffset CFAOffset =
2196- StackOffset::getFixed ((int64_t )MFI.getStackSize () - NumBytes);
2197- StackOffset LocalsSize = SVELocalsSize + StackOffset::getFixed (NumBytes);
2198- if (!FPAfterSVECalleeSaves) {
2199- allocateStackSpace (MBB, CalleeSavesBegin, 0 , SVECalleeSavesSize, false ,
2200- nullptr , EmitAsyncCFI && !HasFP, CFAOffset,
2201- MFI.hasVarSizedObjects () || LocalsSize);
2196+ StackOffset LocalsSize = SVELocalsSize + StackOffset::getFixed (NumBytes);
2197+ // Allocate space for the callee saves (if any).
2198+ allocateStackSpace (MBB, CalleeSavesBegin, 0 , SVECalleeSavesSize, false ,
2199+ nullptr , EmitAsyncCFI && !HasFP, CFAOffset,
2200+ MFI.hasVarSizedObjects () || LocalsSize);
2201+ }
22022202 }
22032203 CFAOffset += SVECalleeSavesSize;
22042204
@@ -2379,7 +2379,7 @@ void AArch64FrameLowering::emitEpilogue(MachineFunction &MF,
23792379 // Assume we can't combine the last pop with the sp restore.
23802380 bool CombineAfterCSRBump = false ;
23812381 if (FPAfterSVECalleeSaves) {
2382- AfterCSRPopSize = FixedObject;
2382+ AfterCSRPopSize + = FixedObject;
23832383 } else if (!CombineSPBump && PrologueSaveSize != 0 ) {
23842384 MachineBasicBlock::iterator Pop = std::prev (MBB.getFirstTerminator ());
23852385 while (Pop->getOpcode () == TargetOpcode::CFI_INSTRUCTION ||
@@ -2693,7 +2693,7 @@ AArch64FrameLowering::getFrameIndexReferenceFromSP(const MachineFunction &MF,
26932693 if (MFI.getStackID (FI) == TargetStackID::ScalableVector) {
26942694 if (FPAfterSVECalleeSaves &&
26952695 -ObjectOffset <= (int64_t )AFI->getSVECalleeSavedStackSize ())
2696- return StackOffset::get ( 0 , ObjectOffset);
2696+ return StackOffset::getScalable ( ObjectOffset);
26972697 return StackOffset::get (-((int64_t )AFI->getCalleeSavedStackSize ()),
26982698 ObjectOffset);
26992699 }
0 commit comments