XCore target: Optimise entsp / retsp selection
authorRobert Lytton <robert@xmos.com>
Mon, 6 Jan 2014 14:20:47 +0000 (14:20 +0000)
committerRobert Lytton <robert@xmos.com>
Mon, 6 Jan 2014 14:20:47 +0000 (14:20 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@198612 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/XCore/XCoreFrameLowering.cpp
test/CodeGen/XCore/epilogue_prologue.ll
test/CodeGen/XCore/scavenging.ll

index 22d0e6604bddbf288f1767dc91992023997c6423..3d1fb9cafc13d6726ab5c25585de6ecc75688fd8 100644 (file)
@@ -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))
index 2898ae5dc8232bac6d4722c3af9e6a79ecc9cf8b..14f04a35069203e8869231073df6e765b3618be7 100644 (file)
@@ -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]
index f96ecd3fc2185e6ecef8a0c7d3fbab620e8c03ee..a0c8a2e093792e72ca27041cd6c5c30c4f04b775 100644 (file)
@@ -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]