forked from OSchip/llvm-project
XCore target: Optimise entsp / retsp selection
llvm-svn: 198612
This commit is contained in:
parent
a53360a339
commit
cbb588a264
|
@ -427,12 +427,20 @@ processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
|
|||
RegScavenger *RS) const {
|
||||
XCoreFunctionInfo *XFI = MF.getInfo<XCoreFunctionInfo>();
|
||||
|
||||
bool LRUsed = MF.getRegInfo().isPhysRegUsed(XCore::LR);
|
||||
// If we need to extend the stack it is more efficient to use entsp / retsp.
|
||||
// We force the LR to be saved so these instructions are used.
|
||||
if (!LRUsed && !MF.getFunction()->isVarArg() &&
|
||||
MF.getFrameInfo()->estimateStackSize(MF))
|
||||
LRUsed = true;
|
||||
|
||||
// We will handling LR in the prologue/epilogue
|
||||
// and space on the stack ourselves.
|
||||
if (MF.getRegInfo().isPhysRegUsed(XCore::LR)) {
|
||||
if (LRUsed) {
|
||||
MF.getRegInfo().setPhysRegUnused(XCore::LR);
|
||||
XFI->createLRSpillSlot(MF);
|
||||
}
|
||||
|
||||
// A callee save register is used to hold the FP.
|
||||
// This needs saving / restoring in the epilogue / prologue.
|
||||
if (hasFP(MF))
|
||||
|
|
|
@ -61,9 +61,11 @@ entry:
|
|||
|
||||
; FP + large frame: spill FP+SR = entsp 2 + 100000
|
||||
; CHECKFP-LABEL: f4
|
||||
; CHECKFP: extsp 65535
|
||||
; CHECKFP: entsp 65535
|
||||
; CHECKFP-NEXT: .Ltmp{{[0-9]+}}
|
||||
; CHECKFP-NEXT: .cfi_def_cfa_offset 262140
|
||||
; CHECKFP-NEXT: .Ltmp{{[0-9]+}}
|
||||
; CHECKFP-NEXT: .cfi_offset 15, 0
|
||||
; CHECKFP-NEXT: extsp 34467
|
||||
; CHECKFP-NEXT: .Ltmp{{[0-9]+}}
|
||||
; CHECKFP-NEXT: .cfi_def_cfa_offset 400008
|
||||
|
@ -76,20 +78,20 @@ entry:
|
|||
; CHECKFP-NEXT: set sp, r10
|
||||
; CHECKFP-NEXT: ldw r10, sp[1]
|
||||
; CHECKFP-NEXT: ldaw sp, sp[65535]
|
||||
; CHECKFP-NEXT: ldaw sp, sp[34467]
|
||||
; CHECKFP-NEXT: retsp 0
|
||||
; CHECKFP-NEXT: retsp 34467
|
||||
;
|
||||
; !FP + large frame: spill SR+SR = entsp 2 + 100000
|
||||
; CHECK-LABEL: f4
|
||||
; CHECK: extsp 65535
|
||||
; CHECK: entsp 65535
|
||||
; CHECK-NEXT: .Ltmp{{[0-9]+}}
|
||||
; CHECK-NEXT: .cfi_def_cfa_offset 262140
|
||||
; CHECK-NEXT: .Ltmp{{[0-9]+}}
|
||||
; CHECK-NEXT: .cfi_offset 15, 0
|
||||
; CHECK-NEXT: extsp 34467
|
||||
; CHECK-NEXT: .Ltmp{{[0-9]+}}
|
||||
; CHECK-NEXT: .cfi_def_cfa_offset 400008
|
||||
; CHECK-NEXT: ldaw sp, sp[65535]
|
||||
; CHECK-NEXT: ldaw sp, sp[34467]
|
||||
; CHECK-NEXT: retsp 0
|
||||
; CHECK-NEXT: retsp 34467
|
||||
define void @f4() {
|
||||
entry:
|
||||
%0 = alloca [100000 x i32]
|
||||
|
|
|
@ -69,7 +69,7 @@ declare void @g(i32*, i32*)
|
|||
; CHECK: .text
|
||||
; !FP + large frame: spill SR+SR = entsp 2 + 100000
|
||||
; CHECK-LABEL: ScavengeSlots:
|
||||
; CHECK: extsp 65535
|
||||
; CHECK: entsp 65535
|
||||
; CHECK: extsp 34467
|
||||
; scavenge r11
|
||||
; CHECK: ldaw r11, sp[0]
|
||||
|
@ -97,10 +97,9 @@ declare void @g(i32*, i32*)
|
|||
; CHECK: ldw r1, cp{{\[}}[[INDEX4]]{{\]}}
|
||||
; CHECK: stw r11, r0[r1]
|
||||
; CHECK: ldaw sp, sp[65535]
|
||||
; CHECK: ldaw sp, sp[34467]
|
||||
; CHECK: ldw r4, sp[1]
|
||||
; CHECK: ldw r5, sp[0]
|
||||
; CHECK: retsp 0
|
||||
; CHECK: retsp 34467
|
||||
define void @ScavengeSlots(i32 %r0, i32 %r1, i32 %r2, i32 %r3, i32 %r4) nounwind {
|
||||
entry:
|
||||
%Data = alloca [100000 x i32]
|
||||
|
|
Loading…
Reference in New Issue