mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-21 18:29:46 +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:
parent
d8a1624122
commit
db6cbe1ff1
@ -445,8 +445,7 @@ ARMFrameLowering::getFrameIndexReference(const MachineFunction &MF, int FI,
|
||||
|
||||
int
|
||||
ARMFrameLowering::ResolveFrameIndexReference(const MachineFunction &MF,
|
||||
int FI,
|
||||
unsigned &FrameReg,
|
||||
int FI, unsigned &FrameReg,
|
||||
int SPAdj) const {
|
||||
const MachineFrameInfo *MFI = MF.getFrameInfo();
|
||||
const ARMBaseRegisterInfo *RegInfo =
|
||||
@ -490,19 +489,23 @@ ARMFrameLowering::ResolveFrameIndexReference(const MachineFunction &MF,
|
||||
return FPOffset;
|
||||
} else if (MFI->hasVarSizedObjects()) {
|
||||
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()) {
|
||||
// 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) {
|
||||
FrameReg = RegInfo->getFrameRegister(MF);
|
||||
return FPOffset;
|
||||
}
|
||||
} else
|
||||
FrameReg = RegInfo->getBaseRegister();
|
||||
}
|
||||
} 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
|
||||
// out of range references.
|
||||
// out of range references. ldr <rt>,[<rn>, #-<imm8>]
|
||||
if (FPOffset >= -255 && FPOffset < 0) {
|
||||
FrameReg = RegInfo->getFrameRegister(MF);
|
||||
return FPOffset;
|
||||
|
@ -51,7 +51,8 @@ public:
|
||||
bool canSimplifyCallFramePseudos(const MachineFunction &MF) const;
|
||||
int getFrameIndexReference(const MachineFunction &MF, int FI,
|
||||
unsigned &FrameReg) const;
|
||||
int ResolveFrameIndexReference(const MachineFunction &MF, int FI,
|
||||
int ResolveFrameIndexReference(const MachineFunction &MF,
|
||||
int FI,
|
||||
unsigned &FrameReg, int SPAdj) 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*)
|
Loading…
Reference in New Issue
Block a user