Only adjust esp around calls in presence of alloca.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40028 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Evan Cheng 2007-07-19 00:42:05 +00:00
parent 24857a3fac
commit 7e7bbf8271
3 changed files with 12 additions and 50 deletions

View File

@ -1038,51 +1038,6 @@ int %test2(int %X) {
ret int %X
}
//===---------------------------------------------------------------------===//
We use push/pop of stack space around calls in situations where we don't have to.
Call to f below produces:
subl $16, %esp <<<<<
movl %eax, (%esp)
call L_f$stub
addl $16, %esp <<<<<
The stack push/pop can be moved into the prolog/epilog. It does this because it's
building the frame pointer, but this should not be sufficient, only the use of alloca
should cause it to do this.
(There are other issues shown by this code, but this is one.)
typedef struct _range_t {
float fbias;
float fscale;
int ibias;
int iscale;
int ishift;
unsigned char lut[];
} range_t;
struct _decode_t {
int type:4;
int unit:4;
int alpha:8;
int N:8;
int bpc:8;
int bpp:16;
int skip:8;
int swap:8;
const range_t*const*range;
};
typedef struct _decode_t decode_t;
extern int f(const decode_t* decode);
int decode_byte (const decode_t* decode) {
if (decode->swap != 0)
return f(decode);
return 0;
}
//===---------------------------------------------------------------------===//
This:

View File

@ -1022,18 +1022,23 @@ bool X86RegisterInfo::hasFP(const MachineFunction &MF) const {
MachineModuleInfo *MMI = MFI->getMachineModuleInfo();
return (NoFramePointerElim ||
MF.getFrameInfo()->hasVarSizedObjects() ||
MFI->hasVarSizedObjects() ||
MF.getInfo<X86MachineFunctionInfo>()->getForceFramePointer() ||
(MMI && MMI->callsUnwindInit()));
}
bool X86RegisterInfo::hasReservedCallFrame(MachineFunction &MF) const {
return !MF.getFrameInfo()->hasVarSizedObjects();
}
void X86RegisterInfo::
eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
MachineBasicBlock::iterator I) const {
if (hasFP(MF)) {
// If we have a frame pointer, turn the adjcallstackup instruction into a
// 'sub ESP, <amt>' and the adjcallstackdown instruction into 'add ESP,
// <amt>'
if (!hasReservedCallFrame(MF)) {
// If the stack pointer can be changed after prologue, turn the
// adjcallstackup instruction into a 'sub ESP, <amt>' and the
// adjcallstackdown instruction into 'add ESP, <amt>'
// TODO: consider using push / pop instead of sub + store / add
MachineInstr *Old = I;
uint64_t Amount = Old->getOperand(0).getImm();
if (Amount != 0) {

View File

@ -98,6 +98,8 @@ public:
bool hasFP(const MachineFunction &MF) const;
bool hasReservedCallFrame(MachineFunction &MF) const;
void eliminateCallFramePseudoInstr(MachineFunction &MF,
MachineBasicBlock &MBB,
MachineBasicBlock::iterator MI) const;