aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Target/ARM/ARMRegisterInfo.cpp
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2007-02-02 21:08:39 +0000
committerEvan Cheng <evan.cheng@apple.com>2007-02-02 21:08:39 +0000
commita21335dd763ab98ef3cf98e7a0573367c6dc845f (patch)
tree3a0f215c71bff2275b599bf3ac6d0cb3dc169669 /lib/Target/ARM/ARMRegisterInfo.cpp
parentcc56aad06d35e002e0debb616dd838f2a88f4ce8 (diff)
downloadexternal_llvm-a21335dd763ab98ef3cf98e7a0573367c6dc845f.zip
external_llvm-a21335dd763ab98ef3cf98e7a0573367c6dc845f.tar.gz
external_llvm-a21335dd763ab98ef3cf98e7a0573367c6dc845f.tar.bz2
Another thumb large stack offset codegen bug.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33795 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/ARM/ARMRegisterInfo.cpp')
-rw-r--r--lib/Target/ARM/ARMRegisterInfo.cpp18
1 files changed, 13 insertions, 5 deletions
diff --git a/lib/Target/ARM/ARMRegisterInfo.cpp b/lib/Target/ARM/ARMRegisterInfo.cpp
index 94c10f1..9617946 100644
--- a/lib/Target/ARM/ARMRegisterInfo.cpp
+++ b/lib/Target/ARM/ARMRegisterInfo.cpp
@@ -625,7 +625,6 @@ void ARMRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II) const{
Offset += MI.getOperand(i+1).getImm();
assert((Offset & 3) == 0 &&
"Thumb add/sub sp, #imm immediate must be multiple of 4!");
- Offset >>= 2;
if (Offset == 0) {
// Turn it into a move.
MI.setInstrDescriptor(TII.get(ARM::tMOVrr));
@@ -635,28 +634,37 @@ void ARMRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II) const{
}
// Common case: small offset, fits into instruction.
- if ((Offset & ~255U) == 0) {
+ if (((Offset >> 2) & ~255U) == 0) {
// Replace the FrameIndex with sp / fp
MI.getOperand(i).ChangeToRegister(FrameReg, false);
- MI.getOperand(i+1).ChangeToImmediate(Offset);
+ MI.getOperand(i+1).ChangeToImmediate(Offset >> 2);
return;
}
unsigned DestReg = MI.getOperand(0).getReg();
+ unsigned Bytes = (Offset > 0) ? Offset : -Offset;
+ unsigned NumMIs = calcNumMI(Opcode, 0, Bytes, 8, 1);
+ // MI would expand into a large number of instructions. Don't try to
+ // simplify the immediate.
+ if (NumMIs > 2) {
+ emitThumbRegPlusImmediate(MBB, II, DestReg, ARM::SP, Offset, TII);
+ MBB.erase(II);
+ return;
+ }
+
if (Offset > 0) {
// Translate r0 = add sp, imm to
// r0 = add sp, 255*4
// r0 = add r0, (imm - 255*4)
MI.getOperand(i).ChangeToRegister(FrameReg, false);
MI.getOperand(i+1).ChangeToImmediate(255);
- Offset = (Offset - 255) << 2;
+ Offset = (Offset - 255 * 4);
MachineBasicBlock::iterator NII = next(II);
emitThumbRegPlusImmediate(MBB, NII, DestReg, DestReg, Offset, TII);
} else {
// Translate r0 = add sp, -imm to
// r0 = -imm (this is then translated into a series of instructons)
// r0 = add r0, sp
- Offset <<= 2;
emitThumbConstant(MBB, II, DestReg, Offset, TII);
MI.setInstrDescriptor(TII.get(ARM::tADDhirr));
MI.getOperand(i).ChangeToRegister(DestReg, false);