mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-11 11:34:02 +00:00
Spill R4 if it's going to be used to restore SP from FP.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@123567 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9922ccf4b4
commit
df55fea807
@ -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))
|
||||
|
17
test/CodeGen/Thumb/2011-EpilogueBug.ll
Normal file
17
test/CodeGen/Thumb/2011-EpilogueBug.ll
Normal file
@ -0,0 +1,17 @@
|
||||
; RUN: llc -mtriple=thumbv6-apple-darwin < %s | FileCheck %s
|
||||
; r8869722
|
||||
|
||||
%struct.state = type { i32, %struct.info*, float**, i32, i32, i32, i32, i32, i32, i32, i32, i32, i64, i64, i64, i64, i64, i64, i8* }
|
||||
%struct.info = type { i32, i32, i32, i32, i32, i32, i32, i8* }
|
||||
|
||||
define void @t1(%struct.state* %v) {
|
||||
; CHECK: push {r4
|
||||
%tmp6 = load i32* null
|
||||
%tmp8 = alloca float, i32 %tmp6
|
||||
store i32 1, i32* null
|
||||
br label %return
|
||||
|
||||
return: ; preds = %0
|
||||
; CHECK: mov sp, r4
|
||||
ret void
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user