mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
Only adjust esp around calls in presence of alloca.
llvm-svn: 40028
This commit is contained in:
parent
ef7c515e9a
commit
30e121adf6
@ -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:
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user