@@ -1508,43 +1508,54 @@ int AArch64FrameLowering::getNonLocalFrameIndexReference(
1508
1508
return getSEHFrameIndexOffset (MF, FI);
1509
1509
}
1510
1510
1511
- static int getFPOffset (const MachineFunction &MF, int FI) {
1512
- const auto &MFI = MF.getFrameInfo ();
1511
+ static int getFPOffset (const MachineFunction &MF, int ObjectOffset) {
1513
1512
const auto *AFI = MF.getInfo <AArch64FunctionInfo>();
1514
1513
const auto &Subtarget = MF.getSubtarget <AArch64Subtarget>();
1515
1514
bool IsWin64 =
1516
1515
Subtarget.isCallingConvWin64 (MF.getFunction ().getCallingConv ());
1517
1516
unsigned FixedObject = IsWin64 ? alignTo (AFI->getVarArgsGPRSize (), 16 ) : 0 ;
1518
- return MFI. getObjectOffset (FI) + FixedObject + 16 ;
1517
+ return ObjectOffset + FixedObject + 16 ;
1519
1518
}
1520
1519
1521
- static int getStackOffset (const MachineFunction &MF, int FI ) {
1520
+ static int getStackOffset (const MachineFunction &MF, int ObjectOffset ) {
1522
1521
const auto &MFI = MF.getFrameInfo ();
1523
- return MFI. getObjectOffset (FI) + MFI.getStackSize ();
1522
+ return ObjectOffset + MFI.getStackSize ();
1524
1523
}
1525
1524
1526
1525
int AArch64FrameLowering::getSEHFrameIndexOffset (const MachineFunction &MF,
1527
1526
int FI) const {
1528
1527
const auto *RegInfo = static_cast <const AArch64RegisterInfo *>(
1529
1528
MF.getSubtarget ().getRegisterInfo ());
1530
- return RegInfo->getLocalAddressRegister (MF) == AArch64::FP ?
1531
- getFPOffset (MF, FI) : getStackOffset (MF, FI);
1529
+ int ObjectOffset = MF.getFrameInfo ().getObjectOffset (FI);
1530
+ return RegInfo->getLocalAddressRegister (MF) == AArch64::FP
1531
+ ? getFPOffset (MF, ObjectOffset)
1532
+ : getStackOffset (MF, ObjectOffset);
1532
1533
}
1533
1534
1534
1535
int AArch64FrameLowering::resolveFrameIndexReference (const MachineFunction &MF,
1535
1536
int FI, unsigned &FrameReg,
1536
1537
bool PreferFP,
1537
1538
bool ForSimm) const {
1538
1539
const auto &MFI = MF.getFrameInfo ();
1540
+ int ObjectOffset = MFI.getObjectOffset (FI);
1541
+ bool isFixed = MFI.isFixedObjectIndex (FI);
1542
+ return resolveFrameOffsetReference (MF, ObjectOffset, isFixed, FrameReg,
1543
+ PreferFP, ForSimm);
1544
+ }
1545
+
1546
+ int AArch64FrameLowering::resolveFrameOffsetReference (
1547
+ const MachineFunction &MF, int ObjectOffset, bool isFixed,
1548
+ unsigned &FrameReg, bool PreferFP, bool ForSimm) const {
1549
+ const auto &MFI = MF.getFrameInfo ();
1539
1550
const auto *RegInfo = static_cast <const AArch64RegisterInfo *>(
1540
1551
MF.getSubtarget ().getRegisterInfo ());
1541
1552
const auto *AFI = MF.getInfo <AArch64FunctionInfo>();
1542
1553
const auto &Subtarget = MF.getSubtarget <AArch64Subtarget>();
1543
- int FPOffset = getFPOffset (MF, FI);
1544
- int Offset = getStackOffset (MF, FI );
1545
- bool isFixed = MFI. isFixedObjectIndex (FI );
1546
- bool isCSR = !isFixed && MFI. getObjectOffset (FI) >=
1547
- -((int )AFI->getCalleeSavedStackSize ());
1554
+
1555
+ int FPOffset = getFPOffset (MF, ObjectOffset );
1556
+ int Offset = getStackOffset (MF, ObjectOffset );
1557
+ bool isCSR =
1558
+ !isFixed && ObjectOffset >= -((int )AFI->getCalleeSavedStackSize ());
1548
1559
1549
1560
// Use frame pointer to reference fixed objects. Use it for locals if
1550
1561
// there are VLAs or a dynamically realigned SP (and thus the SP isn't
0 commit comments