From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13269 invoked by alias); 3 Jan 2010 08:02:15 -0000 Received: (qmail 8864 invoked by uid 48); 3 Jan 2010 08:02:02 -0000 Date: Sun, 03 Jan 2010 08:02:00 -0000 Subject: [Bug rtl-optimization/42592] New: really bad register allocation for x86 X-Bugzilla-Reason: CC Message-ID: Reply-To: gcc-bugzilla@gcc.gnu.org To: gcc-bugs@gcc.gnu.org From: "andi-gcc at firstfloor dot org" Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org X-SW-Source: 2010-01/txt/msg00242.txt.bz2 >>From http://embed.cs.utah.edu/embarrassing/dec_09/harvest/gcc-head_icc-11.1/ typedef unsigned int size_t; typedef __builtin_va_list __gnuc_va_list; typedef __gnuc_va_list va_list; typedef size_t STRLEN; struct sv; typedef struct sv SV; typedef int I32; typedef unsigned int U32; struct sv { void *sv_any; U32 sv_refcnt; U32 sv_flags; }; void Perl_sv_setpvn (SV * sv, char const *ptr, STRLEN len); void Perl_sv_vcatpvfn (SV * sv, char const *pat, STRLEN patlen, va_list * args, SV ** svargs, I32 svmax, char *maybe_tainted); void Perl_sv_vsetpvfn (SV * sv, char const *pat, STRLEN patlen, va_list * args, SV ** svargs, I32 svmax, char *maybe_tainted); void Perl_sv_vcatpvfn (SV * sv, char const *pat, STRLEN patlen, va_list * args, SV ** svargs, I32 svmax, char *maybe_tainted); void Perl_sv_vcatpvfn (SV * sv, char const *pat, STRLEN patlen, va_list * args, SV ** svargs, I32 svmax, char *maybe_tainted); void Perl_sv_setpvn (SV * sv, char const *ptr, STRLEN len); void Perl_sv_vsetpvfn (SV * sv, char const *pat, STRLEN patlen, va_list * args, SV ** svargs, I32 svmax, char *maybe_tainted) { { Perl_sv_setpvn (sv, "", 0U); Perl_sv_vcatpvfn (sv, pat, patlen, args, svargs, svmax, maybe_tainted); return; } } /* Checksum = 9EEF59B7 */ with icc this gives a neat 0: 57 push %edi 1: 8b 7c 24 08 mov 0x8(%esp),%edi 5: 6a 00 push $0x0 7: 68 00 00 00 00 push $0x0 c: 57 push %edi d: e8 fc ff ff ff call e 12: ff 74 24 2c pushl 0x2c(%esp) 16: ff 74 24 2c pushl 0x2c(%esp) 1a: ff 74 24 2c pushl 0x2c(%esp) 1e: ff 74 24 2c pushl 0x2c(%esp) 22: ff 74 24 2c pushl 0x2c(%esp) 26: ff 74 24 2c pushl 0x2c(%esp) 2a: 57 push %edi 2b: e8 fc ff ff ff call 2c 30: 83 c4 28 add $0x28,%esp 33: 5f pop %edi 34: c3 ret but gcc produces terrible register allocation (-m32 -O2 4.5.0 20091219) in comparison (like first loading arguments into registers, just to spill them again on a function call): pushl %ebp movl %esp, %ebp pushl %edi pushl %esi pushl %ebx subl $32, %esp movl 12(%ebp), %eax movl 8(%ebp), %ebx movl 28(%ebp), %edx movl 32(%ebp), %ecx movl %eax, -28(%ebp) movl 24(%ebp), %eax pushl $0 movl 16(%ebp), %esi pushl $.LC0 movl 20(%ebp), %edi pushl %ebx movl %eax, -32(%ebp) movl %edx, -36(%ebp) movl %ecx, -40(%ebp) call Perl_sv_setpvn movl -32(%ebp), %eax addl $16, %esp movl -40(%ebp), %ecx movl -36(%ebp), %edx movl %edi, 20(%ebp) movl %eax, 24(%ebp) movl -28(%ebp), %eax movl %esi, 16(%ebp) movl %ebx, 8(%ebp) movl %ecx, 32(%ebp) movl %edx, 28(%ebp) movl %eax, 12(%ebp) leal -12(%ebp), %esp popl %ebx popl %esi popl %edi popl %ebp jmp Perl_sv_vcatpvfn -- Summary: really bad register allocation for x86 Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: rtl-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: andi-gcc at firstfloor dot org GCC host triplet: x86_64-linux GCC target triplet: x86_64-linux http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42592