Only adjust esp around calls in presence of alloca.
authorEvan Cheng <evan.cheng@apple.com>
Thu, 19 Jul 2007 00:42:05 +0000 (00:42 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Thu, 19 Jul 2007 00:42:05 +0000 (00:42 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40028 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/README.txt
lib/Target/X86/X86RegisterInfo.cpp
lib/Target/X86/X86RegisterInfo.h

index f15090aad9d518058b0359e04fa871bc6ae80de5..d70e90a3ca11fd3b128dfc851d7562d87f5b0398 100644 (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:
index b64d864d65f2bb366f5bc9f7cb3a8638a6e9ac56..dd6cf36f7d0317da61cafdedb49b7196365883a0 100644 (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) {
index ab9e33f9886fd11741bfc105d3a96ee8b04a4c61..0ec9a063a0607e27517499f0d5cb91d8bb9955b5 100644 (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;