summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/ARM/ARMFrameLowering.cpp
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2011-01-16 05:14:33 +0000
committerEvan Cheng <evan.cheng@apple.com>2011-01-16 05:14:33 +0000
commit572756ac1109b3aea5f57ef354827e7ea4b5b5ec (patch)
tree628cbc129f61ba4d7e3b857a34cef1b00e562daa /llvm/lib/Target/ARM/ARMFrameLowering.cpp
parentea7131a06207d75414604e689303a1137568a003 (diff)
downloadbcm5719-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.cpp16
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))
OpenPOWER on IntegriCloud