From f158da2f78b5bedbffddeb15ff19de647954e645 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 16 Jan 2003 02:20:12 +0000 Subject: [PATCH] Implement code to keep the stack pointer aligned to an 8 byte boundary. 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 | 2 +- lib/Target/X86/X86ISelSimple.cpp | 2 +- lib/Target/X86/X86RegisterInfo.cpp | 13 +++++++++++++ lib/Target/X86/X86TargetMachine.cpp | 2 +- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/lib/Target/X86/InstSelectSimple.cpp b/lib/Target/X86/InstSelectSimple.cpp index ee8318f22d6..8351f09a07f 100644 --- a/lib/Target/X86/InstSelectSimple.cpp +++ b/lib/Target/X86/InstSelectSimple.cpp @@ -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) { diff --git a/lib/Target/X86/X86ISelSimple.cpp b/lib/Target/X86/X86ISelSimple.cpp index ee8318f22d6..8351f09a07f 100644 --- a/lib/Target/X86/X86ISelSimple.cpp +++ b/lib/Target/X86/X86ISelSimple.cpp @@ -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) { diff --git a/lib/Target/X86/X86RegisterInfo.cpp b/lib/Target/X86/X86RegisterInfo.cpp index ed347c21a0b..617c2d1efa7 100644 --- a/lib/Target/X86/X86RegisterInfo.cpp +++ b/lib/Target/X86/X86RegisterInfo.cpp @@ -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, // ' 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); } diff --git a/lib/Target/X86/X86TargetMachine.cpp b/lib/Target/X86/X86TargetMachine.cpp index db846651fc2..c578ba83a67 100644 --- a/lib/Target/X86/X86TargetMachine.cpp +++ b/lib/Target/X86/X86TargetMachine.cpp @@ -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 -- 2.34.1