Changes in directory llvm/lib/Target/ARM:
ARMRegisterInfo.cpp updated: 1.54 -> 1.55 --- Log message: Another thumb large stack offset codegen bug. --- Diffs of the changes: (+13 -5) ARMRegisterInfo.cpp | 18 +++++++++++++----- 1 files changed, 13 insertions(+), 5 deletions(-) Index: llvm/lib/Target/ARM/ARMRegisterInfo.cpp diff -u llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.54 llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.55 --- llvm/lib/Target/ARM/ARMRegisterInfo.cpp:1.54 Fri Feb 2 02:58:48 2007 +++ llvm/lib/Target/ARM/ARMRegisterInfo.cpp Fri Feb 2 15:08:39 2007 @@ -625,7 +625,6 @@ 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 @@ } // 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); _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits