add generation of unnecessary push/pop around calls
authorDale Johannesen <dalej@apple.com>
Wed, 21 Mar 2007 21:16:39 +0000 (21:16 +0000)
committerDale Johannesen <dalej@apple.com>
Wed, 21 Mar 2007 21:16:39 +0000 (21:16 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35241 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/README.txt

index 758133c04451dff29ff017ef32ba5d41e78641cd..72965d0759c28db1d348ab173ac3998d13608946 100644 (file)
@@ -989,3 +989,45 @@ _foo:
         ret
 
 //===---------------------------------------------------------------------===//
+
+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;
+}