Author: asl Date: Sat Oct 6 11:17:49 2007 New Revision: 42699 URL: http://llvm.org/viewvc/llvm-project?rev=42699&view=rev Log: Move merge code into new helper function.
Modified: llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp Modified: llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp?rev=42699&r1=42698&r2=42699&view=diff ============================================================================== --- llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp (original) +++ llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp Sat Oct 6 11:17:49 2007 @@ -1477,6 +1477,29 @@ } } +// mergeSPUpdatesUp - Merge two stack-manipulating instructions upper iterator. +static +void mergeSPUpdatesUp(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI, + unsigned StackPtr, uint64_t *NumBytes = NULL) { + if (MBBI != MBB.begin()) { + MachineBasicBlock::iterator PI = prior(MBBI); + unsigned Opc = PI->getOpcode(); + if ((Opc == X86::ADD64ri32 || Opc == X86::ADD64ri8 || + Opc == X86::ADD32ri || Opc == X86::ADD32ri8) && + PI->getOperand(0).getReg() == StackPtr) { + if (NumBytes) + *NumBytes += PI->getOperand(2).getImm(); + MBB.erase(PI); + } else if ((Opc == X86::SUB64ri32 || Opc == X86::SUB64ri8 || + Opc == X86::SUB32ri || Opc == X86::SUB32ri8) && + PI->getOperand(0).getReg() == StackPtr) { + if (NumBytes) + *NumBytes -= PI->getOperand(2).getImm(); + MBB.erase(PI); + } + } +} + void X86RegisterInfo::emitPrologue(MachineFunction &MF) const { MachineBasicBlock &MBB = MF.front(); // Prolog goes in entry BB MachineFrameInfo *MFI = MF.getFrameInfo(); @@ -1562,26 +1585,10 @@ MBB.insert(MBBI, MI); } } else { - // If there is an ADD32ri or SUB32ri of ESP immediately after this + // If there is an ADD32ri or SUB32ri of ESP immediately before this // instruction, merge the two instructions. - if (MBBI != MBB.end()) { - MachineBasicBlock::iterator NI = next(MBBI); - unsigned Opc = MBBI->getOpcode(); - if ((Opc == X86::ADD64ri32 || Opc == X86::ADD64ri8 || - Opc == X86::ADD32ri || Opc == X86::ADD32ri8) && - MBBI->getOperand(0).getReg() == StackPtr) { - NumBytes -= MBBI->getOperand(2).getImm(); - MBB.erase(MBBI); - MBBI = NI; - } else if ((Opc == X86::SUB64ri32 || Opc == X86::SUB64ri8 || - Opc == X86::SUB32ri || Opc == X86::SUB32ri8) && - MBBI->getOperand(0).getReg() == StackPtr) { - NumBytes += MBBI->getOperand(2).getImm(); - MBB.erase(MBBI); - MBBI = NI; - } - } - + mergeSPUpdatesUp(MBB, MBBI, StackPtr, &NumBytes); + if (NumBytes) emitSPUpdate(MBB, MBBI, StackPtr, -(int64_t)NumBytes, Is64Bit, TII); } @@ -1702,31 +1709,15 @@ --MBBI; } - if (NumBytes || MFI->hasVarSizedObjects()) { - // If there is an ADD32ri or SUB32ri of ESP immediately before this - // instruction, merge the two instructions. - if (MBBI != MBB.begin()) { - MachineBasicBlock::iterator PI = prior(MBBI); - unsigned Opc = PI->getOpcode(); - if ((Opc == X86::ADD64ri32 || Opc == X86::ADD64ri8 || - Opc == X86::ADD32ri || Opc == X86::ADD32ri8) && - PI->getOperand(0).getReg() == StackPtr) { - NumBytes += PI->getOperand(2).getImm(); - MBB.erase(PI); - } else if ((Opc == X86::SUB64ri32 || Opc == X86::SUB64ri8 || - Opc == X86::SUB32ri || Opc == X86::SUB32ri8) && - PI->getOperand(0).getReg() == StackPtr) { - NumBytes -= PI->getOperand(2).getImm(); - MBB.erase(PI); - } - } - } - - // If dynamic alloca is used, then reset esp to point to the last - // callee-saved slot before popping them off! - // Also, if it's main() on Cygwin/Mingw32 we aligned stack in the prologue, - revert - // stack changes back. Note: we're assuming, that frame pointer was forced - // for main() + // If there is an ADD32ri or SUB32ri of ESP immediately before this + // instruction, merge the two instructions. + if (NumBytes || MFI->hasVarSizedObjects()) + mergeSPUpdatesUp(MBB, MBBI, StackPtr, &NumBytes); + + // If dynamic alloca is used, then reset esp to point to the last callee-saved + // slot before popping them off! Also, if it's main() on Cygwin/Mingw32 we + // aligned stack in the prologue, - revert stack changes back. Note: we're + // assuming, that frame pointer was forced for main() if (MFI->hasVarSizedObjects() || (Fn->hasExternalLinkage() && Fn->getName() == "main" && Subtarget->isTargetCygMing())) { _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits