aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDale Johannesen <dalej@apple.com>2007-03-21 21:16:39 +0000
committerDale Johannesen <dalej@apple.com>2007-03-21 21:16:39 +0000
commitaceaf5d26ee137ef5bda6b70c99ceb1950d0b5a5 (patch)
treee488711b6cf2cdea2e597e95e6441b448ce39b3b
parentcfe0798a9ef715322f7d9b606041397872eb0e0d (diff)
downloadexternal_llvm-aceaf5d26ee137ef5bda6b70c99ceb1950d0b5a5.zip
external_llvm-aceaf5d26ee137ef5bda6b70c99ceb1950d0b5a5.tar.gz
external_llvm-aceaf5d26ee137ef5bda6b70c99ceb1950d0b5a5.tar.bz2
add generation of unnecessary push/pop around calls
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35241 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Target/X86/README.txt42
1 files changed, 42 insertions, 0 deletions
diff --git a/lib/Target/X86/README.txt b/lib/Target/X86/README.txt
index 758133c..72965d0 100644
--- a/lib/Target/X86/README.txt
+++ b/lib/Target/X86/README.txt
@@ -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;
+}