When emitting the function epilog, check to see if there already a stack

adjustment.  If so, we merge the adjustment into the existing one.  This
allows us to generate:

caller2:
        sub %ESP, 12
        mov DWORD PTR [%ESP], 0
        mov %EAX, 1234567890
        mov %EDX, 0
        call func2
        add %ESP, 8
        ret 4

intead of:

caller2:
        sub %ESP, 12
        mov DWORD PTR [%ESP], 0
        mov %EAX, 1234567890
        mov %EDX, 0
        call func2
        sub %ESP, 4
        add %ESP, 12
        ret 4

for X86/fast-cc-merge-stack-adj.ll

llvm-svn: 22038
This commit is contained in:
Chris Lattner 2005-05-14 23:53:43 +00:00
parent fe2ebdef4d
commit 5366c859a7
1 changed files with 23 additions and 8 deletions

View File

@ -506,7 +506,6 @@ void X86RegisterInfo::emitEpilogue(MachineFunction &MF,
MachineBasicBlock &MBB) const { MachineBasicBlock &MBB) const {
const MachineFrameInfo *MFI = MF.getFrameInfo(); const MachineFrameInfo *MFI = MF.getFrameInfo();
MachineBasicBlock::iterator MBBI = prior(MBB.end()); MachineBasicBlock::iterator MBBI = prior(MBB.end());
MachineInstr *MI;
switch (MBBI->getOpcode()) { switch (MBBI->getOpcode()) {
case X86::RET: case X86::RET:
@ -524,20 +523,36 @@ void X86RegisterInfo::emitEpilogue(MachineFunction &MF,
int EBPOffset = MFI->getObjectOffset(MFI->getObjectIndexEnd()-1)+4; int EBPOffset = MFI->getObjectOffset(MFI->getObjectIndexEnd()-1)+4;
// mov ESP, EBP // mov ESP, EBP
MI = BuildMI(X86::MOV32rr, 1,X86::ESP).addReg(X86::EBP); BuildMI(MBB, MBBI, X86::MOV32rr, 1,X86::ESP).addReg(X86::EBP);
MBB.insert(MBBI, MI);
// pop EBP // pop EBP
MI = BuildMI(X86::POP32r, 0, X86::EBP); BuildMI(MBB, MBBI, X86::POP32r, 0, X86::EBP);
MBB.insert(MBBI, MI);
} else { } else {
// Get the number of bytes allocated from the FrameInfo... // Get the number of bytes allocated from the FrameInfo...
unsigned NumBytes = MFI->getStackSize(); unsigned NumBytes = MFI->getStackSize();
if (NumBytes) { // adjust stack pointer back: ESP += numbytes if (NumBytes) { // adjust stack pointer back: ESP += numbytes
MI = BuildMI(X86::ADD32ri, 1, X86::ESP, MachineOperand::UseAndDef) // If there is an ADD32ri or SUB32ri of ESP immediately before this
.addZImm(NumBytes); // instruction, merge the two instructions.
MBB.insert(MBBI, MI); if (MBBI != MBB.begin()) {
MachineBasicBlock::iterator PI = prior(MBBI);
if (PI->getOpcode() == X86::ADD32ri &&
PI->getOperand(0).getReg() == X86::ESP) {
NumBytes += PI->getOperand(1).getImmedValue();
MBB.erase(PI);
} else if (PI->getOpcode() == X86::SUB32ri &&
PI->getOperand(0).getReg() == X86::ESP) {
NumBytes -= PI->getOperand(1).getImmedValue();
MBB.erase(PI);
}
}
if (NumBytes > 0)
BuildMI(MBB, MBBI, X86::ADD32ri, 2)
.addReg(X86::ESP, MachineOperand::UseAndDef).addZImm(NumBytes);
else if ((int)NumBytes < 0)
BuildMI(MBB, MBBI, X86::SUB32ri, 2)
.addReg(X86::ESP, MachineOperand::UseAndDef).addZImm(-NumBytes);
} }
} }
} }