[llvm-commits] CVS: llvm/lib/Target/X86/X86RegisterInfo.cpp

Chris Lattner lattner at cs.uiuc.edu
Sat May 14 16:53:57 PDT 2005



Changes in directory llvm/lib/Target/X86:

X86RegisterInfo.cpp updated: 1.103 -> 1.104
---
Log message:

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



---
Diffs of the changes:  (+23 -8)

 X86RegisterInfo.cpp |   31 +++++++++++++++++++++++--------
 1 files changed, 23 insertions(+), 8 deletions(-)


Index: llvm/lib/Target/X86/X86RegisterInfo.cpp
diff -u llvm/lib/Target/X86/X86RegisterInfo.cpp:1.103 llvm/lib/Target/X86/X86RegisterInfo.cpp:1.104
--- llvm/lib/Target/X86/X86RegisterInfo.cpp:1.103	Sat May 14 18:35:21 2005
+++ llvm/lib/Target/X86/X86RegisterInfo.cpp	Sat May 14 18:53:43 2005
@@ -506,7 +506,6 @@
                                    MachineBasicBlock &MBB) const {
   const MachineFrameInfo *MFI = MF.getFrameInfo();
   MachineBasicBlock::iterator MBBI = prior(MBB.end());
-  MachineInstr *MI;
 
   switch (MBBI->getOpcode()) {
   case X86::RET:
@@ -524,20 +523,36 @@
     int EBPOffset = MFI->getObjectOffset(MFI->getObjectIndexEnd()-1)+4;
 
     // mov ESP, EBP
-    MI = BuildMI(X86::MOV32rr, 1,X86::ESP).addReg(X86::EBP);
-    MBB.insert(MBBI, MI);
+    BuildMI(MBB, MBBI, X86::MOV32rr, 1,X86::ESP).addReg(X86::EBP);
 
     // pop EBP
-    MI = BuildMI(X86::POP32r, 0, X86::EBP);
-    MBB.insert(MBBI, MI);
+    BuildMI(MBB, MBBI, X86::POP32r, 0, X86::EBP);
   } else {
     // Get the number of bytes allocated from the FrameInfo...
     unsigned NumBytes = MFI->getStackSize();
 
     if (NumBytes) {    // adjust stack pointer back: ESP += numbytes
-      MI = BuildMI(X86::ADD32ri, 1, X86::ESP, MachineOperand::UseAndDef)
-        .addZImm(NumBytes);
-      MBB.insert(MBBI, MI);
+      // 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);
+        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);
     }
   }
 }






More information about the llvm-commits mailing list