Implement code to keep the stack pointer aligned to an 8 byte boundary.
authorChris Lattner <sabre@nondot.org>
Thu, 16 Jan 2003 02:20:12 +0000 (02:20 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 16 Jan 2003 02:20:12 +0000 (02:20 +0000)
This improves the performance of the power benchmark by a few percent.
This will be neccesary for SSE code, which requires 16 byte alignment of
the stack.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5320 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/InstSelectSimple.cpp
lib/Target/X86/X86ISelSimple.cpp
lib/Target/X86/X86RegisterInfo.cpp
lib/Target/X86/X86TargetMachine.cpp

index ee8318f22d6d8d83026ca490a17a633989975d9b..8351f09a07ff3ce79cbdd026661b7ca30001a6af 100644 (file)
@@ -386,7 +386,7 @@ void ISel::LoadArgumentsToVirtualRegs(Function &Fn) {
   // [ESP + 8] -- second argument, if first argument is four bytes in size
   //    ... 
   //
-  unsigned ArgOffset = 4;
+  unsigned ArgOffset = 0;   // Frame mechanisms handle retaddr slot
   MachineFrameInfo *MFI = F->getFrameInfo();
 
   for (Function::aiterator I = Fn.abegin(), E = Fn.aend(); I != E; ++I) {
index ee8318f22d6d8d83026ca490a17a633989975d9b..8351f09a07ff3ce79cbdd026661b7ca30001a6af 100644 (file)
@@ -386,7 +386,7 @@ void ISel::LoadArgumentsToVirtualRegs(Function &Fn) {
   // [ESP + 8] -- second argument, if first argument is four bytes in size
   //    ... 
   //
-  unsigned ArgOffset = 4;
+  unsigned ArgOffset = 0;   // Frame mechanisms handle retaddr slot
   MachineFrameInfo *MFI = F->getFrameInfo();
 
   for (Function::aiterator I = Fn.abegin(), E = Fn.aend(); I != E; ++I) {
index ed347c21a0be535ce82273f0724a88d651fe7657..617c2d1efa7c578b3499985e5cc61d97a2bfcc2d 100644 (file)
@@ -13,6 +13,8 @@
 #include "llvm/CodeGen/MachineInstrBuilder.h"
 #include "llvm/CodeGen/MachineFunction.h"
 #include "llvm/CodeGen/MachineFrameInfo.h"
+#include "llvm/Target/TargetMachine.h"
+#include "llvm/Target/TargetFrameInfo.h"
 #include "Support/CommandLine.h"
 
 namespace {
@@ -105,6 +107,12 @@ void X86RegisterInfo::eliminateCallFramePseudoInstr(MachineFunction &MF,
     // <amt>'
     unsigned Amount = Old->getOperand(0).getImmedValue();
     if (Amount != 0) {
+      // We need to keep the stack aligned properly.  To do this, we round the
+      // amount of space needed for the outgoing arguments up to the next
+      // alignment boundary.
+      unsigned Align = MF.getTarget().getFrameInfo().getStackAlignment();
+      Amount = (Amount+Align-1)/Align*Align;
+
       if (Old->getOpcode() == X86::ADJCALLSTACKDOWN) {
        New=BuildMI(X86::SUBri32, 2, X86::ESP).addReg(X86::ESP).addZImm(Amount);
       } else {
@@ -191,6 +199,11 @@ void X86RegisterInfo::emitPrologue(MachineFunction &MF) const {
     //
     NumBytes += MFI->getMaxCallFrameSize();
 
+    // Round the size to a multiple of the alignment (don't forget the 4 byte
+    // offset though).
+    unsigned Align = MF.getTarget().getFrameInfo().getStackAlignment();
+    NumBytes = ((NumBytes+4)+Align-1)/Align*Align - 4;
+
     // Update frame info to pretend that this is part of the stack...
     MFI->setStackSize(NumBytes);
   }
index db846651fc28fd9971ada547a49d8a2877d9c3b1..c578ba83a67d1fb9bd35734bddafb5739309efc1 100644 (file)
@@ -37,7 +37,7 @@ X86TargetMachine::X86TargetMachine(unsigned Config)
                  1, 4, 
                  (Config & TM::PtrSizeMask) == TM::PtrSize64 ? 8 : 4,
                  (Config & TM::PtrSizeMask) == TM::PtrSize64 ? 8 : 4),
-  FrameInfo(TargetFrameInfo::StackGrowsDown, 1/*16*/, 0) {
+  FrameInfo(TargetFrameInfo::StackGrowsDown, 8/*16 for SSE*/, 4) {
 }
 
 /// addPassesToJITCompile - Add passes to the specified pass manager to