Skip to content
This repository was archived by the owner on Mar 28, 2020. It is now read-only.

Commit 558061c

Browse files
committed
ARM: use r7 as the frame-pointer on all MachO targets.
This is better for a few reasons: + It matches the other tooling for iOS. + It matches EABI in more cases (i.e. Thumb-mode, and in practice we don't use ARM mode). + It leads to infinitesimally smaller code (0.2%, yay!). rdar://25369506 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@266003 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 06a9119 commit 558061c

File tree

5 files changed

+21
-22
lines changed

5 files changed

+21
-22
lines changed

lib/Target/ARM/ARMBaseRegisterInfo.cpp

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,9 @@ ARMBaseRegisterInfo::ARMBaseRegisterInfo()
4949
: ARMGenRegisterInfo(ARM::LR, 0, 0, ARM::PC), BasePtr(ARM::R6) {}
5050

5151
static unsigned getFramePointerReg(const ARMSubtarget &STI) {
52-
if (STI.isTargetMachO()) {
53-
if (STI.isTargetDarwin() || STI.isThumb1Only())
54-
return ARM::R7;
55-
else
56-
return ARM::R11;
57-
} else if (STI.isTargetWindows())
52+
if (STI.isTargetMachO())
53+
return ARM::R7;
54+
else if (STI.isTargetWindows())
5855
return ARM::R11;
5956
else // ARM EABI
6057
return STI.isThumb() ? ARM::R7 : ARM::R11;

lib/Target/ARM/ARMFrameLowering.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ void ARMFrameLowering::emitPrologue(MachineFunction &MF,
355355
case ARM::R10:
356356
case ARM::R11:
357357
case ARM::R12:
358-
if (STI.isTargetDarwin()) {
358+
if (STI.isTargetMachO()) {
359359
GPRCS2Size += 4;
360360
break;
361361
}
@@ -559,7 +559,7 @@ void ARMFrameLowering::emitPrologue(MachineFunction &MF,
559559
case ARM::R10:
560560
case ARM::R11:
561561
case ARM::R12:
562-
if (STI.isTargetDarwin())
562+
if (STI.isTargetMachO())
563563
break;
564564
// fallthrough
565565
case ARM::R0:
@@ -592,7 +592,7 @@ void ARMFrameLowering::emitPrologue(MachineFunction &MF,
592592
case ARM::R10:
593593
case ARM::R11:
594594
case ARM::R12:
595-
if (STI.isTargetDarwin()) {
595+
if (STI.isTargetMachO()) {
596596
unsigned DwarfReg = MRI->getDwarfRegNum(Reg, true);
597597
unsigned Offset = MFI->getObjectOffset(FI);
598598
unsigned CFIIndex = MMI.addFrameInst(
@@ -904,7 +904,7 @@ void ARMFrameLowering::emitPushInst(MachineBasicBlock &MBB,
904904
unsigned LastReg = 0;
905905
for (; i != 0; --i) {
906906
unsigned Reg = CSI[i-1].getReg();
907-
if (!(Func)(Reg, STI.isTargetDarwin())) continue;
907+
if (!(Func)(Reg, STI.isTargetMachO())) continue;
908908

909909
// D-registers in the aligned area DPRCS2 are NOT spilled here.
910910
if (Reg >= ARM::D8 && Reg < ARM::D8 + NumAlignedDPRCS2Regs)
@@ -991,7 +991,7 @@ void ARMFrameLowering::emitPopInst(MachineBasicBlock &MBB,
991991
bool DeleteRet = false;
992992
for (; i != 0; --i) {
993993
unsigned Reg = CSI[i-1].getReg();
994-
if (!(Func)(Reg, STI.isTargetDarwin())) continue;
994+
if (!(Func)(Reg, STI.isTargetMachO())) continue;
995995

996996
// The aligned reloads from area DPRCS2 are not inserted here.
997997
if (Reg >= ARM::D8 && Reg < ARM::D8 + NumAlignedDPRCS2Regs)
@@ -1545,7 +1545,7 @@ void ARMFrameLowering::determineCalleeSaves(MachineFunction &MF,
15451545
if (Spilled) {
15461546
NumGPRSpills++;
15471547

1548-
if (!STI.isTargetDarwin()) {
1548+
if (!STI.isTargetMachO()) {
15491549
if (Reg == ARM::LR)
15501550
LRSpilled = true;
15511551
CS1Spilled = true;
@@ -1567,7 +1567,7 @@ void ARMFrameLowering::determineCalleeSaves(MachineFunction &MF,
15671567
break;
15681568
}
15691569
} else {
1570-
if (!STI.isTargetDarwin()) {
1570+
if (!STI.isTargetMachO()) {
15711571
UnspilledCS1GPRs.push_back(Reg);
15721572
continue;
15731573
}

test/CodeGen/ARM/interrupt-attr.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,15 @@ define arm_aapcscc void @irq_fn() alignstack(8) "interrupt"="IRQ" {
3535
; Normal AAPCS function (r0-r3 pushed onto stack by hardware, lr set to
3636
; appropriate sentinel so no special return needed).
3737
; CHECK-M-LABEL: irq_fn:
38-
; CHECK-M: push.w {r4, r7, r11, lr}
39-
; CHECK-M: add.w r11, sp, #8
38+
; CHECK-M: push {r4, r6, r7, lr}
39+
; CHECK-M: add r7, sp, #8
4040
; CHECK-M: mov r4, sp
4141
; CHECK-M: bfc r4, #0, #3
4242
; CHECK-M: mov sp, r4
4343
; CHECK-M: bl _bar
44-
; CHECK-M: sub.w r4, r11, #8
44+
; CHECK-M: sub.w r4, r7, #8
4545
; CHECK-M: mov sp, r4
46-
; CHECK-M: pop.w {r4, r7, r11, pc}
46+
; CHECK-M: pop {r4, r6, r7, pc}
4747

4848
call arm_aapcscc void @bar()
4949
ret void

test/CodeGen/ARM/none-macho.ll

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ define i32 @test_frame_ptr() {
4343
; CHECK-LABEL: test_frame_ptr:
4444
call void @test_trap()
4545

46-
; Frame pointer is r11.
47-
; CHECK: mov r11, sp
46+
; Frame pointer is r7.
47+
; CHECK: mov r7, sp
4848
ret i32 42
4949
}
5050

@@ -58,9 +58,11 @@ define void @test_two_areas(%big_arr* %addr) {
5858
; This goes with the choice of r7 as FP (largely). FP and LR have to be stored
5959
; consecutively on the stack for the frame record to be valid, which means we
6060
; need the 2 register-save areas employed by iOS.
61-
; CHECK-NON-FAST: push.w {r4, r5, r6, r7, r8, r9, r10, r11, lr}
61+
; CHECK-NON-FAST: push {r4, r5, r6, r7, lr}
62+
; CHECK-NON-FAST: push.w {r8, r9, r10, r11}
6263
; ...
63-
; CHECK-NON-FAST: pop.w {r4, r5, r6, r7, r8, r9, r10, r11, pc}
64+
; CHECK-NON-FAST: pop.w {r8, r9, r10, r11}
65+
; CHECK-NON-FAST: pop {r4, r5, r6, r7, pc}
6466
ret void
6567
}
6668

test/CodeGen/Thumb2/emit-unwinding.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
; RUN: llc -mtriple thumbv7em-apple-unknown-eabi-macho %s -o - -O0 | FileCheck %s
22

3-
; CHECK: add.w r11, sp, #{{[1-9]+}}
3+
; CHECK: add r7, sp, #{{[1-9]+}}
44

55
define void @foo1() {
66
call void asm sideeffect "", "~{r4}"()

0 commit comments

Comments
 (0)