@@ -194,9 +194,15 @@ class AArch64FunctionInfo final : public MachineFunctionInfo {
194
194
// When CalleeSavedStackSize has not been set (for example when
195
195
// some MachineIR pass is run in isolation), then recalculate
196
196
// the CalleeSavedStackSize directly from the CalleeSavedInfo.
197
+ // RegisterFilter is a predicate to calculate the stack size for
198
+ // subsets of the callee-saved registers. It should return true
199
+ // for registers that should be included in the size calculation,
200
+ // and false otherwise.
197
201
// Note: This information can only be recalculated after PEI
198
202
// has assigned offsets to the callee save objects.
199
- unsigned getCalleeSavedStackSize (const MachineFrameInfo &MFI) const {
203
+ unsigned getCalleeSavedStackSize (
204
+ const MachineFrameInfo &MFI,
205
+ llvm::function_ref<bool (unsigned )> RegisterFilter = nullptr) const {
200
206
bool ValidateCalleeSavedStackSize = false ;
201
207
202
208
#ifndef NDEBUG
@@ -206,25 +212,40 @@ class AArch64FunctionInfo final : public MachineFunctionInfo {
206
212
ValidateCalleeSavedStackSize = HasCalleeSavedStackSize;
207
213
#endif
208
214
209
- if (!HasCalleeSavedStackSize || ValidateCalleeSavedStackSize) {
215
+ if (RegisterFilter || !HasCalleeSavedStackSize ||
216
+ ValidateCalleeSavedStackSize) {
210
217
assert (MFI.isCalleeSavedInfoValid () && " CalleeSavedInfo not calculated" );
211
218
if (MFI.getCalleeSavedInfo ().empty ())
212
219
return 0 ;
213
220
214
221
int64_t MinOffset = std::numeric_limits<int64_t >::max ();
215
222
int64_t MaxOffset = std::numeric_limits<int64_t >::min ();
223
+
224
+ bool AnyRegistersCounted = false ;
216
225
for (const auto &Info : MFI.getCalleeSavedInfo ()) {
226
+ if (RegisterFilter) {
227
+ unsigned Reg = Info.getReg ();
228
+ if (!RegisterFilter (Reg))
229
+ continue ;
230
+ }
231
+
232
+ AnyRegistersCounted = true ;
217
233
int FrameIdx = Info.getFrameIdx ();
218
234
if (MFI.getStackID (FrameIdx) != TargetStackID::Default)
219
235
continue ;
220
236
int64_t Offset = MFI.getObjectOffset (FrameIdx);
221
237
int64_t ObjSize = MFI.getObjectSize (FrameIdx);
222
238
MinOffset = std::min<int64_t >(Offset, MinOffset);
223
239
MaxOffset = std::max<int64_t >(Offset + ObjSize, MaxOffset);
240
+ AnyRegistersCounted = true ;
224
241
}
225
242
243
+ if (!AnyRegistersCounted)
244
+ return 0 ;
245
+
226
246
unsigned Size = alignTo (MaxOffset - MinOffset, 16 );
227
- assert ((!HasCalleeSavedStackSize || getCalleeSavedStackSize () == Size) &&
247
+ assert ((RegisterFilter || !HasCalleeSavedStackSize ||
248
+ getCalleeSavedStackSize () == Size) &&
228
249
" Invalid size calculated for callee saves" );
229
250
return Size;
230
251
}
0 commit comments