mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-24 08:24:33 +00:00
In Thumb2 mode, lower frame indix references to:
add <rd>, sp, #<imm8> ldr <rd>, [sp, #<imm8>] When the offset from sp is multiple of 4 and in range of 0-1020. This saves code size by utilizing 16-bit instructions. rdar://9321541 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129971 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -445,8 +445,7 @@ ARMFrameLowering::getFrameIndexReference(const MachineFunction &MF, int FI,
|
|||||||
|
|
||||||
int
|
int
|
||||||
ARMFrameLowering::ResolveFrameIndexReference(const MachineFunction &MF,
|
ARMFrameLowering::ResolveFrameIndexReference(const MachineFunction &MF,
|
||||||
int FI,
|
int FI, unsigned &FrameReg,
|
||||||
unsigned &FrameReg,
|
|
||||||
int SPAdj) const {
|
int SPAdj) const {
|
||||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||||
const ARMBaseRegisterInfo *RegInfo =
|
const ARMBaseRegisterInfo *RegInfo =
|
||||||
@ -490,19 +489,23 @@ ARMFrameLowering::ResolveFrameIndexReference(const MachineFunction &MF,
|
|||||||
return FPOffset;
|
return FPOffset;
|
||||||
} else if (MFI->hasVarSizedObjects()) {
|
} else if (MFI->hasVarSizedObjects()) {
|
||||||
assert(RegInfo->hasBasePointer(MF) && "missing base pointer!");
|
assert(RegInfo->hasBasePointer(MF) && "missing base pointer!");
|
||||||
// Try to use the frame pointer if we can, else use the base pointer
|
|
||||||
// since it's available. This is handy for the emergency spill slot, in
|
|
||||||
// particular.
|
|
||||||
if (AFI->isThumb2Function()) {
|
if (AFI->isThumb2Function()) {
|
||||||
|
// Try to use the frame pointer if we can, else use the base pointer
|
||||||
|
// since it's available. This is handy for the emergency spill slot, in
|
||||||
|
// particular.
|
||||||
if (FPOffset >= -255 && FPOffset < 0) {
|
if (FPOffset >= -255 && FPOffset < 0) {
|
||||||
FrameReg = RegInfo->getFrameRegister(MF);
|
FrameReg = RegInfo->getFrameRegister(MF);
|
||||||
return FPOffset;
|
return FPOffset;
|
||||||
}
|
}
|
||||||
} else
|
}
|
||||||
FrameReg = RegInfo->getBaseRegister();
|
|
||||||
} else if (AFI->isThumb2Function()) {
|
} else if (AFI->isThumb2Function()) {
|
||||||
|
// Use add <rd>, sp, #<imm8>
|
||||||
|
// ldr <rd>, [sp, #<imm8>]
|
||||||
|
// if at all possible to save space.
|
||||||
|
if (Offset >= 0 && (Offset & 3) == 0 && Offset <= 1020)
|
||||||
|
return Offset;
|
||||||
// In Thumb2 mode, the negative offset is very limited. Try to avoid
|
// In Thumb2 mode, the negative offset is very limited. Try to avoid
|
||||||
// out of range references.
|
// out of range references. ldr <rt>,[<rn>, #-<imm8>]
|
||||||
if (FPOffset >= -255 && FPOffset < 0) {
|
if (FPOffset >= -255 && FPOffset < 0) {
|
||||||
FrameReg = RegInfo->getFrameRegister(MF);
|
FrameReg = RegInfo->getFrameRegister(MF);
|
||||||
return FPOffset;
|
return FPOffset;
|
||||||
|
@ -51,7 +51,8 @@ public:
|
|||||||
bool canSimplifyCallFramePseudos(const MachineFunction &MF) const;
|
bool canSimplifyCallFramePseudos(const MachineFunction &MF) const;
|
||||||
int getFrameIndexReference(const MachineFunction &MF, int FI,
|
int getFrameIndexReference(const MachineFunction &MF, int FI,
|
||||||
unsigned &FrameReg) const;
|
unsigned &FrameReg) const;
|
||||||
int ResolveFrameIndexReference(const MachineFunction &MF, int FI,
|
int ResolveFrameIndexReference(const MachineFunction &MF,
|
||||||
|
int FI,
|
||||||
unsigned &FrameReg, int SPAdj) const;
|
unsigned &FrameReg, int SPAdj) const;
|
||||||
int getFrameIndexOffset(const MachineFunction &MF, int FI) const;
|
int getFrameIndexOffset(const MachineFunction &MF, int FI) const;
|
||||||
|
|
||||||
|
23
test/CodeGen/Thumb2/2011-04-21-FILoweringBug.ll
Normal file
23
test/CodeGen/Thumb2/2011-04-21-FILoweringBug.ll
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
; RUN: llc < %s -mtriple=thumbv7-apple-darwin | FileCheck %s
|
||||||
|
|
||||||
|
; Use sp, #imm to lower frame indices when the offset is multiple of 4
|
||||||
|
; and in the range of 0-1020. This saves code size by utilizing
|
||||||
|
; 16-bit instructions.
|
||||||
|
; rdar://9321541
|
||||||
|
|
||||||
|
define i32 @t() nounwind {
|
||||||
|
entry:
|
||||||
|
; CHECK: t:
|
||||||
|
; CHECK: sub sp, #12
|
||||||
|
; CHECK-NOT: sub
|
||||||
|
; CHECK: add r0, sp, #4
|
||||||
|
; CHECK: add r1, sp, #8
|
||||||
|
; CHECK: mov r2, sp
|
||||||
|
%size = alloca i32, align 4
|
||||||
|
%count = alloca i32, align 4
|
||||||
|
%index = alloca i32, align 4
|
||||||
|
%0 = call i32 @foo(i32* %count, i32* %size, i32* %index) nounwind
|
||||||
|
ret i32 %0
|
||||||
|
}
|
||||||
|
|
||||||
|
declare i32 @foo(i32*, i32*, i32*)
|
Reference in New Issue
Block a user