From aceaf5d26ee137ef5bda6b70c99ceb1950d0b5a5 Mon Sep 17 00:00:00 2001 From: Dale Johannesen Date: Wed, 21 Mar 2007 21:16:39 +0000 Subject: [PATCH] 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 --- lib/Target/X86/README.txt | 42 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/lib/Target/X86/README.txt b/lib/Target/X86/README.txt index 758133c0445..72965d0759c 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; +} -- 2.34.1