diff options
author | Dale Johannesen <dalej@apple.com> | 2007-03-21 21:16:39 +0000 |
---|---|---|
committer | Dale Johannesen <dalej@apple.com> | 2007-03-21 21:16:39 +0000 |
commit | aceaf5d26ee137ef5bda6b70c99ceb1950d0b5a5 (patch) | |
tree | e488711b6cf2cdea2e597e95e6441b448ce39b3b | |
parent | cfe0798a9ef715322f7d9b606041397872eb0e0d (diff) | |
download | external_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.txt | 42 |
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; +} |