diff options
author | Evan Cheng <evan.cheng@apple.com> | 2011-01-16 05:14:33 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2011-01-16 05:14:33 +0000 |
commit | 572756ac1109b3aea5f57ef354827e7ea4b5b5ec (patch) | |
tree | 628cbc129f61ba4d7e3b857a34cef1b00e562daa /llvm/lib/Target/ARM/ARMFrameLowering.cpp | |
parent | ea7131a06207d75414604e689303a1137568a003 (diff) | |
download | bcm5719-llvm-572756ac1109b3aea5f57ef354827e7ea4b5b5ec.tar.gz bcm5719-llvm-572756ac1109b3aea5f57ef354827e7ea4b5b5ec.zip |
Spill R4 if it's going to be used to restore SP from FP.
llvm-svn: 123567
Diffstat (limited to 'llvm/lib/Target/ARM/ARMFrameLowering.cpp')
-rw-r--r-- | llvm/lib/Target/ARM/ARMFrameLowering.cpp | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/llvm/lib/Target/ARM/ARMFrameLowering.cpp b/llvm/lib/Target/ARM/ARMFrameLowering.cpp index b8cbf5d2db3..0b514da341f 100644 --- a/llvm/lib/Target/ARM/ARMFrameLowering.cpp +++ b/llvm/lib/Target/ARM/ARMFrameLowering.cpp @@ -801,15 +801,23 @@ ARMFrameLowering::processFunctionBeforeCalleeSavedScan(MachineFunction &MF, // Spill R4 if Thumb2 function requires stack realignment - it will be used as // scratch register. Also spill R4 if Thumb2 function has varsized objects, - // since it's always posible to restore sp from fp in a single instruction. + // since it's not always possible to restore sp from fp in a single + // instruction. // FIXME: It will be better just to find spare register here. if (AFI->isThumb2Function() && (MFI->hasVarSizedObjects() || RegInfo->needsStackRealignment(MF))) MF.getRegInfo().setPhysRegUsed(ARM::R4); - // Spill LR if Thumb1 function uses variable length argument lists. - if (AFI->isThumb1OnlyFunction() && AFI->getVarArgsRegSaveSize() > 0) - MF.getRegInfo().setPhysRegUsed(ARM::LR); + if (AFI->isThumb1OnlyFunction()) { + // Spill LR if Thumb1 function uses variable length argument lists. + if (AFI->getVarArgsRegSaveSize() > 0) + MF.getRegInfo().setPhysRegUsed(ARM::LR); + + // Spill R4 if Thumb1 epilogue has to restore SP from FP since + // FIXME: It will be better just to find spare register here. + if (MFI->hasVarSizedObjects()) + MF.getRegInfo().setPhysRegUsed(ARM::R4); + } // Spill the BasePtr if it's used. if (RegInfo->hasBasePointer(MF)) |