@@ -2171,34 +2171,34 @@ void AArch64FrameLowering::emitPrologue(MachineFunction &MF,
2171
2171
}
2172
2172
2173
2173
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);
2175
2178
2176
2179
// Process the SVE callee-saves to determine what space needs to be
2177
2180
// allocated.
2178
2181
if (int64_t CalleeSavedSize = AFI->getSVECalleeSavedStackSize ()) {
2179
2182
LLVM_DEBUG (dbgs () << " SVECalleeSavedStackSize = " << CalleeSavedSize
2180
2183
<< " \n " );
2184
+ SVECalleeSavesSize = StackOffset::getScalable (CalleeSavedSize);
2185
+ SVELocalsSize = SVEStackSize - SVECalleeSavesSize;
2181
2186
// Find callee save instructions in frame.
2182
- CalleeSavesBegin = MBBI;
2187
+ // Note: With FPAfterSVECalleeSaves the callee saves have already been
2188
+ // allocated.
2183
2189
if (!FPAfterSVECalleeSaves) {
2190
+ MachineBasicBlock::iterator CalleeSavesBegin = MBBI;
2184
2191
assert (IsSVECalleeSave (CalleeSavesBegin) && " Unexpected instruction" );
2185
2192
while (IsSVECalleeSave (MBBI) && MBBI != MBB.getFirstTerminator ())
2186
2193
++MBBI;
2187
- }
2188
- CalleeSavesEnd = MBBI;
2194
+ CalleeSavesEnd = MBBI;
2189
2195
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
+ }
2202
2202
}
2203
2203
CFAOffset += SVECalleeSavesSize;
2204
2204
@@ -2379,7 +2379,7 @@ void AArch64FrameLowering::emitEpilogue(MachineFunction &MF,
2379
2379
// Assume we can't combine the last pop with the sp restore.
2380
2380
bool CombineAfterCSRBump = false ;
2381
2381
if (FPAfterSVECalleeSaves) {
2382
- AfterCSRPopSize = FixedObject;
2382
+ AfterCSRPopSize + = FixedObject;
2383
2383
} else if (!CombineSPBump && PrologueSaveSize != 0 ) {
2384
2384
MachineBasicBlock::iterator Pop = std::prev (MBB.getFirstTerminator ());
2385
2385
while (Pop->getOpcode () == TargetOpcode::CFI_INSTRUCTION ||
@@ -2693,7 +2693,7 @@ AArch64FrameLowering::getFrameIndexReferenceFromSP(const MachineFunction &MF,
2693
2693
if (MFI.getStackID (FI) == TargetStackID::ScalableVector) {
2694
2694
if (FPAfterSVECalleeSaves &&
2695
2695
-ObjectOffset <= (int64_t )AFI->getSVECalleeSavedStackSize ())
2696
- return StackOffset::get ( 0 , ObjectOffset);
2696
+ return StackOffset::getScalable ( ObjectOffset);
2697
2697
return StackOffset::get (-((int64_t )AFI->getCalleeSavedStackSize ()),
2698
2698
ObjectOffset);
2699
2699
}
0 commit comments